sqlitedabaseislocked問題解決
1、sqlite
database is locked問題解決
在使用synchronized無效的情況下,今天嘗試瞭如下幾中方案ThreadLocal,和重入鎖ReentrantLock兩種方案
A、ThreadLocal方式
public ThreadLocal<Connection> threadLocal=new ThreadLocal<Connection>();
public Connection getConnection(){ {
Connection conn=null;
if(threadLocal.get()==null){
conn=DriverManager.getConnection(URL);
threadLocal.set(conn);
return conn;
}else{
return (Connection)threadLocal.get();
}
}
public void closeConnection() throws SQLException{
Connection conn=(Connection)threadLocal.get();
threadLocal.set(null);
if(conn!=null){
conn.close();
conn=null;
}
}
說明:如果對ThreadLocal理解透徹,顯而易見,對於一個執行執行緒而言得到的是同一個資料庫連線,不同的執行緒得到的是不同的資料庫連線。所以我們說實現了執行緒安全的資料庫連線。如果深入研究ThreadLocal類,SUN是這樣解釋,由一個HashMap維護每一個執行緒獨立擁有的變數,HashMap的鍵值就是執行緒的序號,SUN公佈了部分API的實現細節,有興趣的朋友也可以自己試著來實現這個ThreadLocal類。
OK大功靠成!,之前必現的locked問題得到解決!
B、採用重入鎖ReentrantLock對連結的建立和關閉進行手動加鎖
public Connection getConnection(){
lock.lock();
Connection conn = null;
try {
conn = DriverManager.getConnection(URL);
}catch(SQLException e) {
lock.unlock();
throw e;
}
return conn
}
public void closeConnection(Connection conn) {
if(conn!=null){
conn.close();
conn=null;
}
lock.unlock;
}
採用這種方式遇到了如下問題:
(1) 由於我只在dispose(Conn)方法中呼叫了unlock,雖然出現的概率降低,但偶爾還是會出現
後來在所有 關閉Conn的方法中都unlock,這個問題也不再出現了!
(2)、使用Lock的情況下,方法上還有synchronized關鍵字的情況 下,導致死鎖,介面卡死,程式不動了!
去掉synchronized修飾符,解決該問題!
總結:這個問題糾結了我兩天時間,才開始考慮從SQLITE本身來找問題,網路上的千篇一律,後來想SQLITE使用的是非常廣泛的,應該不至於這麼爛,於是,首先是排查所有DAO操作,檢查是否存在Conn等資料庫資源沒有釋放的;另外就是從程式層面使用鎖或者執行緒安全方面來考慮,終得解決!嘻嘻。。。。
sqlite dabase is locked 問題解決 ,未完待續。。。。
相關文章
- 提問題比解決問題更重要
- 解決跨域問題跨域
- SERVICE問題解決方法
- 解決 Unexpectedlexicaldeclarationincaseblock的問題BloC
- 解決mapper重名問題APP
- qeephp 解決跨越問題PHP
- 解決高度塌陷問題
- 解決 github 訪問不了的問題Github
- 解決github訪問慢的問題Github
- 解決 Github 國內訪問問題Github
- No module named MYSQLdb 問題解決MySql
- rabbitmq解決erlang版本問題MQ
- 解決高度塌陷、定位問題
- display:flex解決的問題Flex
- As常見問題解決方法
- WebSocket跨域問題解決Web跨域
- 解決中文亂碼問題
- Java解決跨域問題Java跨域
- Flask解決跨域問題Flask跨域
- MySQL 中文 like 問題解決MySql
- CROS 解決跨域問題ROS跨域
- thinkphp-queue問題解決PHP
- sql多參問題解決SQL
- 解決所有環境問題
- windows解決埠占用問題Windows
- 解決問題通用方法論
- git常見問題解決Git
- SignalR跨域問題解決SignalR跨域
- 解決docker換源問題Docker
- cors解決跨域問題CORS跨域
- OOM問題解決實踐OOM
- mysql大小寫問題解決MySql
- 磁碟問題定位與解決
- 遇到問題的解決方法
- Luffy - 解決跨域問題跨域
- 解決圖片訪問403 Forbidden問題ORB
- 解決JS跨域訪問的問題JS跨域
- 解決windows docker lnmp訪問慢問題WindowsDockerLNMP
- git 解決版本衝突問題Git