Java ResultSet内存不足,无法使用PreparedStatement进行更新

时间:2012-08-16 01:15:26

标签: java mysql jdbc resultset

我一直在将一个不断增长和不断增长的ResultSet加载到内存中,直到现在它确实不是一个问题。它现在太大而无法合理使用。我已经研究过创建可滚动的结果集,但是我在实现它时遇到了一些麻烦。这是我尝试过的:

    Statement stmt = con.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY);
    stmt.setFetchSize(Integer.MIN_VALUE);
    try {

        if (stmt.execute("SELECT text, value FROM " + db)) {
            rs = stmt.getResultSet();
        } else {
            System.err.println("select failed");
        }

我还缺少一些其他的声明参数吗?或者我还有其他选择吗?

修改

原来问题不是流本身,而是我如何更新RS。如果它是流媒体,我可以不更新RS吗?控制台弹出以下内容:

SQLException: Operation not supported for streaming result sets
SQLState: S1009
VendorError: 0

以下是我在处理数据库后用来更新数据库的代码:

rs.getDouble("value");
if (rs.wasNull()) {
StringValue analysis = new StringValue(dict);
int id = rs.getRow();
String entry = rs.getString("text");
double val = analysis.analyzeString(entry);
pst.setDouble(1, val);
st.setInt(2, id);
System.out.println(id+": " + val + " : " + rs.getString(5));
pst.executeUpdate();

准备好的声明的结构如下:

pst = conn.prepareStatement("UPDATE "+ db +" SET value=? WHERE id=?");

相当简单,StringValue方法analyzeString基本上是对输入字符串的情感分析。

3 个答案:

答案 0 :(得分:1)

限制你的行:

"select text, value from " + db  + " limit 100"

"select  text,value from " + db  + " where text like 'A%'"

答案 1 :(得分:0)

我建议你为JVM添加一些参数以扩大JVM内存,例如-Xmx,-Xms,你可以参考JVM Memory Structure来获取更多细节。

答案 2 :(得分:0)

  

Statement stmt = con.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY,java.sql.ResultSet.CONCUR_READ_ONLY);

你应该使用     语句stmt = con.createStatement(java.sql.ResultSet.TYPE_SCROLL_SENSITIVE,java.sql.ResultSet.CONCUR_UPDATABLE);