前提・実現したいこと
ResultSetでupdateBigDecimalしたい。
しかし、オープン状態のはずなのに下記のエラーが出てしまう。
"org.postgresql.util.PSQLException: この ResultSet はクローズされています。"
発生している問題・エラーメッセージ
org.postgresql.util.PSQLException: この ResultSet はクローズされています。 at org.postgresql.jdbc.PgResultSet.checkClosed(PgResultSet.java:2741) at org.postgresql.jdbc.PgResultSet.findColumn(PgResultSet.java:2588) at org.postgresql.jdbc.PgResultSet.updateBigDecimal(PgResultSet.java:1467) 秘匿
該当のソースコード
kotlin
1秘匿 2try{ 3 秘匿 4 rset = stmt!!.executeQuery(秘匿); 5 println(rset!!.isClosed());//false 6 while(rset!!.next()){ 7 秘匿 8 println(rset!!.isClosed());//false 9 rset!!.updateBigDecimal(秘匿));//PSQLExceptionの発生行 10 rset!!.updateRow(); 11 println(rset!!.isClosed()); 12 } 13 conn!!.commit(); 14 秘匿 15 } 16}catch(e: Exception){ 17 println(rset!!.isClosed());//false 18 e.printStackTrace(); 19}finally{ 20 println(rset!!.isClosed());//false 21} 22秘匿
試したこと
各所でrset!!.isClosed()を出力してみましたが、すべてfalseで、オープンの状態でした。
私が思いつくのは下記のどちらかです。
isClosedではクローズ状態を判定できない。
または
(ないとは思いますが)表示されるエラーメッセージがおかしい。
補足情報(FW/ツールのバージョンなど)
・kotlincは1.3.60
・PostgreSQL12
・postgresql-42.2.5.jar
参考まで。
[Kotlin入門までの助走読本](https://devlights.hatenablog.com/entry/2017/05/30/123344)の37-38ページ曰く。
> ...!!演算子は危険な操作であり、絶対に一生使わないくらいの気持ちでいるとよいでしょう。
頂いたリンクは残念ながら「Entry is not found」でした。
使い終わったらnullを代入するため、null許容型にしています。
Kotlinのガベージコレクションがよくわからず、これが正しいのかわかりません。
また、1つのSQL文ごとに各関数でDBの接続・切断を行っていたのですが、全体の処理時間の99%以上がDBの接続だったため、グローバル変数にして使いまわしたところ、処理時間は圧倒的に改善したのですが、!!演算子がないとコンパイルが通らなくなってしましました。
DBは占有可能な仕様のためOKとしましたが、この対応で良いのか、私自身、疑問に思っていました。
この場合、普通はどうするのが正解なのでしょうか。
> 頂いたリンクは残念ながら「Entry is not found」でした。
あら。`Kotlin入門までの助走読本`でお探しください。
> 使い終わったらnullを代入するため、null許容型にしています。
Javaのtry-with-resouceぽいことができる use() 関数を使うのも手かと。
https://kotlinlang.org/api/latest/jvm/stdlib/kotlin.io/use.html
`conn.createStatement().use{stmt ->stmt.executeQuery(秘匿).use{rset -> ...}}`
> Kotlinのガベージコレクションがよくわからず、これが正しいのかわかりません。
結局はJVM上で動くので、べつにKotlinだからどうこうはないのではないかと。
> ...この場合、普通はどうするのが正解なのでしょうか。
接続プールを使う、かな。 https://www.postgresql.jp/document/7.4/html/jdbc-datasource.html
回答2件
あなたの回答
tips
プレビュー