[解決済み] java.sql.SQLException を取得中です。ResultSet が閉じた後の操作は許可されません
質問
以下のコードを実行すると、例外が発生します。同じ接続オブジェクトで新しいステートメントを準備しているからだと思います。プリペアド・ステートメントを作成し、かつrs2を使用できるようにするには、どのように書き直せばよいのでしょうか?同じDBに接続する場合でも、新しい接続オブジェクトを作成しなければならないのでしょうか?
try
{
//Get some stuff
String name = "";
String sql = "SELECT `name` FROM `user` WHERE `id` = " + userId + " LIMIT 1;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
name = rs.getString("name");
}
String sql2 = "SELECT `id` FROM `profiles` WHERE `id` =" + profId + ";";
ResultSet rs2 = statement.executeQuery(sql2);
String updateSql = "INSERT INTO `blah`............";
PreparedStatement pst = (PreparedStatement)connection.prepareStatement(updateSql);
while(rs2.next())
{
int id = rs2.getInt("id");
int stuff = getStuff(id);
pst.setInt(1, stuff);
pst.addBatch();
}
pst.executeBatch();
}
catch (Exception e)
{
e.printStackTrace();
}
private int getStuff(int id)
{
try
{
String sql = "SELECT ......;";
ResultSet rs = statement.executeQuery(sql);
if(rs.next())
{
return rs.getInt("something");
}
return -1;
}//code continues
解決方法は?
でのデータ取得方法に問題があります。
getStuff()
. にアクセスするたびに
getStuff()
を取得し、新しい
ResultSet
が、閉じない。
という期待に反しています。
Statement
クラス(こちらをご覧ください - 。
http://docs.oracle.com/javase/7/docs/api/java/sql/Statement.html
):
デフォルトでは、1つのStatementオブジェクトに対して、1つのResultSetオブジェクトしか同時に開くことができません。したがって、ある ResultSet オブジェクトの読み取りと別の ResultSet オブジェクトの読み取りが混在する場合、それぞれは異なる Statement オブジェクトによって生成されたものである必要があります。Statementインターフェイスのすべての実行メソッドは、開いているResultSetオブジェクトが存在する場合、暗黙のうちにStatementの現在のResultSetオブジェクトを閉じます。
さらに事態を悪化させるのは
rs
を呼び出しコードから削除します。このコードも
statement
フィールドがありますが、閉じられてはいません。
結論:複数の
ResultSet
同じ
Statement
オブジェクトが同時に開かれる。
関連
-
[解決済み】"実引数リストと形式引数リストの長さが異なる"
-
[解決済み】不正なエスケープ文字"㊧"について
-
[解決済み】"比較メソッドはその一般契約に違反する!"
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】 JAVA 変数宣言はここではできない
-
[解決済み】メソッド本体がない、またはJavaで抽象的な宣言をする
-
[解決済み】Eclipseで「公開型 <<classname>> は独自のファイルで定義する必要があります」エラー【重複あり
-
[解決済み】Java Error "Exception in thread "main" java.util.InputMismatchException" Array プログラムで発生。
-
[解決済み】予期しない型エラー
-
[解決済み】ホスト 'xxx.xx.xxx.xxx' がこのMySQLサーバーへの接続を許可されていない。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Javaの".class期待値"
-
[解決済み】popBackStack()とreplace()の操作はどう違うのですか?
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み】Mockitoでモックからチェックされた例外を投げる
-
[解決済み】 JAVA 変数宣言はここではできない
-
[解決済み】なぜjava.io.Fileにはcloseメソッドがないのでしょうか?
-
[解決済み】keytoolエラー 鍵屋が改ざんされたか、パスワードが不正確だった場合
-
[解決済み] intellijが自動配線リポジトリにタイプのBeanが見つからないと不正確な発言をする件
-
[解決済み】Javaで文字列をコピーするにはどうしたらいいですか?
-
[解決済み】Eclipseで「パッケージエクスプローラー」ビューが見つからない