作者LaPass (LaPass)
看板java
標題[問題] 在物件被註銷時自動執行某些事
時間Tue Jun 12 00:05:37 2012
如標題,主要是想用類似資料庫連線(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
1F:→ awert:雖然不同,不過可考慮用 guava i/o supplier的方式 06/12 00:55
看了官網的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)
3F:→ awert:有什麼特別需求要一直開著連線嘛? 06/12 01:35
4F:推 lausai:不怕麻煩的話..寫一個conn wapper? 06/12 01:59
5F:推 qrtt1:為什麼不直接用 connection pool library 06/12 07:21
6F:→ qrtt1:自己實作除了興趣,其實很難保證考慮到各種情況。 06/12 07:21
7F:→ LaPass:應該說是.... 針對自己的習慣下去寫吧 06/12 08:11
8F:→ qrtt1:什麼樣的習慣? 06/12 09:35
9F:→ LaPass:一些自己的介面以及一些狀況的處理原則之類的 06/12 11:58
10F:→ qrtt1:那到底是什麼!? 06/12 12:52
11F:→ aleelyle:他是從c++跳過來的吧 這是c++常用的 RAII 06/12 13:34
12F:推 Chikei:finalize或PhantomReference+ReferenceQueue 06/12 17:18
13F:→ Chikei:不過都不保證執行時間點 06/12 17:19
14F:推 LPH66:以他的狀況來看用 finalize 應該就行了 06/12 17:53
15F:→ LaPass:如果仍然連線中,finalize就不會被執行到,試過了 06/12 18:59
16F:→ bitlife:不應該在finalize中才去釋放自OS/其它AP 取得應還的資源 06/12 19:01
17F:→ LaPass:PhantomReference跟ReferenceQueue我再去研究看看這是什麼 06/12 19:02
18F:推 Chikei:掛個proxy class然後在proxy object跑finalize,這樣也會因 06/13 01:28
19F:→ Chikei:為後端conn obj還在連線而不會被回收? 06/13 01:29
20F:→ Chikei:anyway, it's nondeterministic safeguard approach 06/13 02:20
21F:→ Chikei:對JVM來說"物件沒有參照了"這件事的時間點是非確定性的 06/13 02:22
22F:推 aceldama:java 7有 try with resource 可以用嗎? 06/16 12:30