PreparedStatement导致OOM错误

时间:2012-10-31 01:06:33

标签: java memory-management memory-leaks garbage-collection prepared-statement

我有一个包含以下代码的侦听器方法。该方法每秒被调用多次。但是,它在我的应用程序中导致内存泄漏。

我认为这可能与我处理预准备语句的方式有关(为每个收到的对象创建一个新语句)。我做了什么明显错误的事吗?一旦使用PS,我应该将其设置为空吗? PS是否因某种原因被保留?

另外,我手动指定PS的表名。这种重新定义是否完全违背了使用预备声明的目的?

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);
        }
    }
}

1 个答案:

答案 0 :(得分:3)

必须关闭你的PreparedStatement后使用它,总是在finally块中。 java中任何可以对应外部资源的对象都应该始终小心处理(一旦不再有用就立即清理)。所有JDBC资源都属于此类别(ResultSet,Statement,Connection)。

相关问题