2013-10-29 54 views
0

我正在使用Tomcat和JDBC連接池以及mysql數據庫。當創建java.sql.Connection並設置了#setAutoCommit(false),並且在沒有提交的情況下執行select語句,然後關閉連接時,它似乎將緩存的連接返回到池。之後創建的後續連接將執行相同的選擇,並返回數據庫中的陳舊數據。這種行爲似乎很奇怪,因爲我被強制提交只執行選擇的會話,否則我看不到其他節點反映的更改。有沒有解決此問題的方法,還是必須提交每個選擇?SQL選擇不提交緩存中的結果

+1

能否請您發佈一些代碼? – Zeus

+1

在Tomcat連接池配置中將'rollbackOnReturn'或'commitOnReturn'屬性設置爲true,請參閱以下鏈接:http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html#Tomcat_JDBC_Enhanced_Attributes。如果autocommit爲false,則您必須**明確提交或回滾事務。 – krokodilko

+0

問題是,爲什麼我**沒有對底層數據庫進行任何更改時提交**。這種行爲似乎很奇怪。人們會期望在連接上調用.close(),這將是你將這個連接釋放到數據庫所必須做的所有事情。 – cole

回答

0

問題在於如何爲連接API定義合同。 commit [1]和rollback [2]方法是在數據庫上釋放鎖的時候。由於在選擇之後我沒有提交或回滾,因此連接將返回到池中時會保留這些鎖。因此,必須在做出選擇後進行提交或回滾,以便釋放連接中保留的鎖定。

[1] http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#commit() [2] http://docs.oracle.com/javase/7/docs/api/java/sql/Connection.html#rollback()