成長し続ける 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 がストリーミング中の場合、RS を更新できませんか? コンソールは次のように表示されます。
SQLException: Operation not supported for streaming result sets
SQLState: S1009
VendorError: 0
処理後に DB を更新するために使用しているコードは次のとおりです。
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 は、基本的に入力文字列のセンチメント分析です。