0

GWT でデータベースにクエリを実行する RPC を実行していますが、プログラムにメモリ リークがあり、クラスのセットアップ方法に強い疑いがあります。現在、私が持っている各メソッド内でデータベースに接続し、メソッドの最後でその接続を閉じる必要があります。このようにすると、メモリリークが発生しますか? このようにプログラミングするとコードが増えて非常に非効率的だと思いますが、良いサンプルがあまり見つかりません。誰かがこれを機能させるためのより良い方法を提案できますか? 名前、IP が変更されました。connect メソッドと、他のメソッドの記述方法のサンプルを投稿しました。

public class DatabaseServiceImpl extends RemoteServiceServlet implements DatabaseService {

private Connection con = null;
String database = "ioma";
String host = "localhost";
String password = "foo";
String url = "jdbc:mysql://" + host + "/" + database;
String user = "foo";

public String connect() {

    String connect = "";
    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection(url, user, password);

    } catch (SQLException e) {
        for (Throwable t : e)
            System.err.println("Error connecting to the database: " + t);
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    }
    connect = "database connection aquired";
    return connect;

}

public int getAssemblerCount() {
    connect();
    try {
        int assemblerCount = 0;
        String query = "SELECT COUNT(*) FROM assemblers";
        PreparedStatement ps = con.prepareStatement(query);
        ResultSet rs = ps.executeQuery();
        rs.next();
        assemblerCount = rs.getInt(1);
        rs.close();
        ps.close();
        con.close();
        return assemblerCount;
    } catch (SQLException e) {
        for (Throwable t : e)
            System.err.println("Database error in getAssemblerCount " + e);
        return 0;
    }

}}
4

1 に答える 1

1

例外が発生した場合にクローズが発生するように、常に「finally」ブロックでクローズする必要があります。

これを適切に行うためのヘルプについては、この関連する質問への回答を参照してください。

これはメモリリークの一般的な原因であり、おそらくあなたの問題です。

于 2013-08-12T23:17:07.973 に答える