JDBC for PostgreSQL を使用して実行しようとしているかなり長いトランザクションがあります。JDBC ではCOMMIT
andROLLBACK
を使用できないため、目的の動作を Java コードで実装しようとしています...
try {
con = DriverManager.getConnection(url, user, password);
con.setAutoCommit(false);
Statement st = con.createStatement();
st.execute(myHugeTransaction);
con.commit();
} catch (SQLException ex) {
try {
con.rollback();
} catch (SQLException ex1) {
// log...
}
// log...
}
小さなステートメントの場合、これはかなりうまく機能しますが、1 つのトランザクションに約 10K のステートメントがある大きなステートメントの場合、これは次のcon.commit
行で失敗します。
org.postgresql.util.PSQLException: ERROR: kind mismatch among backends. Possible last query was: "COMMIT" kind details are: 0[C] 1[N: there is no transaction in progress]
面白いことに、SQL 警告をキャッチするとst.getWarnings();
、送信したスクリプト全体をデータベースが実際に処理していることがわかりますが、コミットに関してはすべて失敗します。
ところで、トランザクションはまったく問題ありません。その正確なコピーをファイルに書き込み、それをpgAdminにコピーすることでエラーなしで実行できます。あなたがそれについて私を助けてくれることを願っています.私は何時間も検索してテストしてきました...
編集
よく分からなかったので、2点質問させてください。
- への 1 回の呼び出しで複数のステートメントを実行できます
Statement.execute()
か? - そうでない場合、JDBC を使用して複数のステートメントでスクリプトを実行する正しい方法は何ですか (解析して単一のステートメントに分割する必要はありません)。