0

我一直在将不断增长的 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");
        }

我缺少的 Statement 是否还有其他参数?还是我必须在其他地方设置另一个选项?

编辑:

原来问题不在于流本身,而在于我如何更新 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 本质上是对输入字符串的情感分析。

4

3 回答 3

1

限制你的行:

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

或者

"select  text,value from " + db  + " where text like 'A%'"
于 2012-08-16T01:32:02.310 回答
0

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

于 2012-08-16T01:29:02.473 回答
0

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

您应该使用 Statement stmt = con.createStatement(java.sql.ResultSet.TYPE_SCROLL_SENSITIVE,java.sql.ResultSet.CONCUR_UPDATABLE);

于 2012-08-16T02:28:56.370 回答