看板 java 關於我們 聯絡資訊
如標題,主要是想用類似資料庫連線(Connection) 或是socket連線上 像這種東西,我覺得有一個很麻煩的地方 就是必須要在不用時,去呼叫close的方法 程式才會去關閉連線 如果忘記呼叫的話,像下面這樣 //開個資料庫連線,然後把他設null,不呼叫close() Conn conn= new Conn(); conn.select(); //conn.close(); conn=null; Thread.sleep(600000L); 就會....... mysql> SHOW PROCESSLIST; +----+------+----------------+------+---------+------+-------+---------------- | Id | User | Host | db | Command | Time | State |Info +----+------+----------------+------+---------+------+-------+---------------- | 42 | root | localhost:2769 | test | Sleep | 163 | |NULL | 44 | root | localhost:2772 | NULL | Query | 0 | NULL |SHOW PROCESSLIST +----+------+----------------+------+---------+------+-------+---------------- 2 rows in set (0.00 sec) 上面那個資料庫連線就一直卡在那邊了..... 現在我正在寫個連線池去管理資料庫連線。 請問有任何辦法可以防止,使用這個連線池的人,拿了連線就沒還的狀況嗎? 不管是吐錯誤也好,或是強制回收連線也行..... 或是,有辦法去取得,有多少物件正在參照這個物件嗎? 如果有的話就能自己寫回收機制了..... -- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 125.233.153.51
awert:雖然不同,不過可考慮用 guava i/o supplier的方式 06/12 00:55
joetsai:官網的 http://ppt.cc/oBJW 06/12 01:10
看了官網的lease,他是用個bool去判斷是不是在使用中。 然後記錄領取時間,超時的話就自己收回去 public synchronized boolean lease() { if(inuse) { return false; } else { inuse=true; timestamp=System.currentTimeMillis(); return true; } } 不是很想這樣用 因為假設我打算長時間使用資料庫連線的話 可能用到一半就被收回去了。 ※ 編輯: LaPass 來自: 125.233.153.51 (06/12 01:31)
awert:有什麼特別需求要一直開著連線嘛? 06/12 01:35
lausai:不怕麻煩的話..寫一個conn wapper? 06/12 01:59
qrtt1:為什麼不直接用 connection pool library 06/12 07:21
qrtt1:自己實作除了興趣,其實很難保證考慮到各種情況。 06/12 07:21
LaPass:應該說是.... 針對自己的習慣下去寫吧 06/12 08:11
qrtt1:什麼樣的習慣? 06/12 09:35
LaPass:一些自己的介面以及一些狀況的處理原則之類的 06/12 11:58
qrtt1:那到底是什麼!? 06/12 12:52
aleelyle:他是從c++跳過來的吧 這是c++常用的 RAII 06/12 13:34
Chikei:finalize或PhantomReference+ReferenceQueue 06/12 17:18
Chikei:不過都不保證執行時間點 06/12 17:19
LPH66:以他的狀況來看用 finalize 應該就行了 06/12 17:53
LaPass:如果仍然連線中,finalize就不會被執行到,試過了 06/12 18:59
bitlife:不應該在finalize中才去釋放自OS/其它AP 取得應還的資源 06/12 19:01
LaPass:PhantomReference跟ReferenceQueue我再去研究看看這是什麼 06/12 19:02
Chikei:掛個proxy class然後在proxy object跑finalize,這樣也會因 06/13 01:28
Chikei:為後端conn obj還在連線而不會被回收? 06/13 01:29
Chikei:anyway, it's nondeterministic safeguard approach 06/13 02:20
Chikei:對JVM來說"物件沒有參照了"這件事的時間點是非確定性的 06/13 02:22
aceldama:java 7有 try with resource 可以用嗎? 06/16 12:30