- ベストアンサー
JAVAからMYSQL使用時のキャッシュ無効化方法
- JAVAからMYSQLを使用している際にキャッシュが残っている場合の無効化方法について教えてください。
- SQL文の結果がDBを更新しても変わらない可能性があります。
- MYSQLの各種設定や接続方法についても教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>30秒おきに使用しているSQL文の結果が とありますが、データベースとの接続は毎回行っていますか? それとも、接続しっぱなしですか? もし、接続しっぱなしの場合は、トランザクションの分離レベル(隔離レベル、遮断レベルなど)の問題かもしれません。 接続しっぱなしでない場合は、以下は無視してください。 MySQLのデフォルトの分離レベルは「REPEATABLE READ」だそうなので、トランザクション実行中は、一度読みだした値は他のトランザクションが変更しても、変更前の値のままになります。 JAVAのAPIによると、REPEATABLE READになっている場合、 1つのトランザクションがある行を読み込み、2番目のトランザクションがその行を変更した場合に、最初のトランザクションがその行を読込みし直したときに2度目は異なる値を取得するという状況が禁止されます だそうです。 http://docs.oracle.com/javase/jp/8/docs/api/java/sql/Connection.html#TRANSACTION_REPEATABLE_READ なので、分離レベルを「READ COMMITTED」などに下げれば解決しそうですが、そうすると、他の問題が出てくるかもしれませんので、十分注意してください。それよりも、接続しっぱなしをやめた方がいいかもしれません。 分離レベルを変更するためには、Connection の setTransactionIsolation で設定します。 http://docs.oracle.com/javase/jp/8/docs/api/java/sql/Connection.html#setTransactionIsolation-int- トランザクションの分離レベルの話は、このブログがわかりやすそうです。 http://gyouza-daisuki.hatenablog.com/entry/2013/11/19/150838
その他の回答 (1)
- maiko0333
- ベストアンサー率19% (839/4401)
更新しているプログラムでcommitしていますか? insertしているレコードを読むならこのプログラムでcommitかrollback すればよいかと。
補足
commitというのはinsertでということでしょうか。 insertのプログラムは、以下の通りです。 query = "LOAD DATA LOCAL INFILE '" + dataFile + "' INTO TABLE " + テーブル名 + " FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n';" cursor.execute(query) connection.commit() 上記は一部ですが、commitしているので問題ないと思います。