データベースを管理するアプリケーションに取り組んでいます。サーバー/クライアントとして設計されており、サーバーがすべてのデータベースのトランザクションを処理します。
それはちょっと次のように機能します:
- サーバーが起動すると、ソケットが開き、ポートでのリッスンが開始されます。
クライアントが起動すると、ソケット/ポートを検索し、開いている場合はサーバーが新しいスレッドを起動します。
while (true) { new Thread(new comm.Protocol(serverSocket.accept()).start(); }
スレッドに入ると、サーバーは通信に必要なオブジェクト ( ObjectInputStream
& ObjectOutputStream
) を作成し、クライアントがログイン情報を送信するのを待ちます。受信すると、サーバーは新しい接続を作成しようとします。
Class.forName("com.mysql.jdbc.Driver");
connection=DriverManager.getConnection(dbName, username, password);
成功した場合、接続を保存し、クライアントの要求を待機してループを続けます。通信は、クエリに必要なクライアントの要求の種類とデータ オブジェクトを含む DTO を使用して行われます。サーバーは DTO を受け取り、要求の種類を切り替えて、要求されたクエリを実行します。Plain Old Java Object
次に、クエリ対象のテーブルをモデル化するの形式で結果を設定するかjava.util.ArrayList<POJO-Typed-Object>
、DTO で複数結果のクエリを実行し、それをクライアントに送り返します。
それは明らかに正常に動作しますが、いくつかのクエリの後、特に大量の行を持つクエリの後、サーバーアプリケーションがメモリ不足になります。
PreparedStatements
は使用後に閉じられ、ResultSet
s も閉じられるため、メモリがどこにあるのかわかりません。
どんな提案でも大歓迎です。