2007年10月17日水曜日

c3p0とmysqlのReplicationDriver

今作ってるシステムで、DBにデータを入れてすぐに、そのデータを取得する場面が存在する。
MySQLのレプリケーションは非同期なので、Connection.setReadOnly(false)で、
マスターに強制的につないで、データをとるようにしていた。
c3p0でStatementCacheを使うと、デッドロックするというのが、私のところでも起きていたので、
maxStatementsを0にしていたが、試しに10にしてみたら、デッドロックにはならなかったものの、
うまくデータとれない事象が発生するようになった。検索したら、似たことで困ってる人がいた。
私が困ってるのも同じで、setReadOnly(false)してあるコネクションでのトランザクション内。
ReplicationDriverのコネクションは、表向きは1コネクションでも、
内部で切り替えているから、何にも言わないと、こういう事態が発生しそうなのはわかる。
でも、直前にsetReadOnly(false)したコネクションで、しかも1トランザクション内なんだけどな…

c3p0側のStatementキャッシュ周りを調べてみるかな。
この処理の前に、同じStatementをsetReadOnly(true)で実行しているので、
プールからコネクションを取り出したときに、同じコネクションが回ってくると、キャッシュされてるのが使われそう。
キャッシュを使うときに、コネクションをどう処理してるかを見たら、なんかわかるかな。
適当に書いてるけど。
まあ、プール側は単純に1コネクションとしか思ってないだろうから、なんかしら不整合はありそう。
dbcpでもPrepareStatmentのキャッシュが問題だったし。
キャッシュをしないようにするしか解決策がないんだとすると、結局無駄な作業だったのかな…

0 件のコメント:

コメントを投稿