hiberanteとPostgreSQL

仕事が忙しくて一月の間放置。久しぶりです。

で、忙しかった仕事はPostgreSQLのDBにHibernateを使ってDBアクセスする方式。初めてのHibernateであったけど、使い方は概ね障害となることもなく進んだのだが、いまだに解決できていない問題がある。それは、Hibernateのセッションはcloseしているのだけど、PostgreSQLから見るとトランザクションの途中で排他ロックしているオブジェクトが残ってしまう。PGの意図としてはセッションをcloseしたのだからトランザクションも終了して欲しいのだが、現実は残っている。

事象をもう少し説明すると、SELECTだけを実行しているのにトランザクションの途中になっている。まあ、暗黙的にトランザクションを開始しているのだろうけど、セッションを終了させたのだから暗黙的に開始されたトランザクションも終了して欲しいな。と。半月近く悩み続けているこの問題。ちょっと余裕が出てきたので考え直し。
これまでは、JDBC(というかjava.sql.*のクラスを直接実行する方式だけでしか業務アプリを作成したことがなく、これまではSELECTだけであればfinallyでjava.sql.Connectionをcloseすることでトランザクションも終了させていた。が、今回はそうもいかない。

余裕があることで、Hierbateのソースを持ってきてeclipseからふにふにとデバック実行ですよ。org.hibernate.impl.SessionImpl#Close()を追っていくと、java.sql.Connectionのセッションをクローズする分岐に入っていかないな。なんでだろう・・・

試しに明示的にトランザクションを開始させ、セッションをcloseするためにトランザクションをcommitするとPostgreSQLにトランザクション途中のものはなくなっている。

Webの記事を見ていると、Hibernate + PostgreSQLの例があるが、SELECTだけでも明示的にとトランザクションを開始/終了している記事は見つけられず。なにか、設定が足りないのか外れを引いてしまったのか・・・

Trackback URL

Leave a comment

Your comment