1

次のコードを含むリスナー メソッドがあります。そのメソッドは、1 秒間に複数回呼び出されます。ただし、アプリケーション内でメモリ リークが発生しています。

準備されたステートメントを処理する方法(受け取ったオブジェクトごとに新しいステートメントを作成する)にあると思います。私は明らかに間違ったことをしていますか?PS を使用したら、PS を null に設定する必要がありますか? なんらかの理由で PS が保持されていますか?

また、PS のテーブル名を手動で指定しています。その再定義は、Prepared Statement を使用する目的を完全に無効にしていますか?

String text = object.getText();

//determineDb method determines the db for the object based on its content
ArrayList<Topic> toAddList = determineDatabase(text);
if (toAddList.size() > 0) {
    int epoch = (int) (System.currentTimeMillis() / 1000);
    //Topic class contains DB info, topic name and associated terms
    for (Topic a : toAddList) {
        try {
            pst = con
    .prepareStatement("INSERT INTO "
            + a.getTopic()
            + " (created, received, username, text, ignored, retweet, value) VALUES(?, ?, ?, ?, ?, ?, ?)");
            pst.setString(1, String.valueOf(object.getCreatedAt().getTime() / 1000));
            pst.setString(2, String.valueOf(epoch));
            pst.setString(3, object.getUser());
            pst.setString(4, text);
            pst.setInt(5, 0);
            pst.setInt(6, object.isOriginal() ? 1 : 0);
            pst.setDouble(7, otherClass.analyzeString(object.getText()));
            pst.executeUpdate();
        } catch (SQLException ex) {
            System.out.println(ex);
        }
    }
}
4

1 に答える 1

3

PreparedStatement を使用した後は、常に finally ブロックで閉じる必要があります。外部リソースに対応する可能性のある Java のオブジェクトは、常に慎重に処理する必要があります (不要になったらすぐにクリーンアップします)。すべての JDBC リソースは、このカテゴリ (ResultSet、Statement、Connection) に分類されます。

于 2012-10-31T01:23:04.447 に答える