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