我一直在将一个不断增长和不断增长的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基本上是对输入字符串的情感分析。
答案 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);