[問題] 在物件被註銷時自動執行某些事

看板java作者 (LaPass)時間13年前 (2012/06/12 00:05), 編輯推噓7(7015)
留言22則, 10人參與, 最新討論串1/7 (看更多)
如標題,主要是想用類似資料庫連線(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

06/12 00:55, , 1F
雖然不同,不過可考慮用 guava i/o supplier的方式
06/12 00:55, 1F

06/12 01:10, , 2F
06/12 01:10, 2F
看了官網的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)

06/12 01:35, , 3F
有什麼特別需求要一直開著連線嘛?
06/12 01:35, 3F

06/12 01:59, , 4F
不怕麻煩的話..寫一個conn wapper?
06/12 01:59, 4F

06/12 07:21, , 5F
為什麼不直接用 connection pool library
06/12 07:21, 5F

06/12 07:21, , 6F
自己實作除了興趣,其實很難保證考慮到各種情況。
06/12 07:21, 6F

06/12 08:11, , 7F
應該說是.... 針對自己的習慣下去寫吧
06/12 08:11, 7F

06/12 09:35, , 8F
什麼樣的習慣?
06/12 09:35, 8F

06/12 11:58, , 9F
一些自己的介面以及一些狀況的處理原則之類的
06/12 11:58, 9F

06/12 12:52, , 10F
那到底是什麼!?
06/12 12:52, 10F

06/12 13:34, , 11F
他是從c++跳過來的吧 這是c++常用的 RAII
06/12 13:34, 11F

06/12 17:18, , 12F
finalize或PhantomReference+ReferenceQueue
06/12 17:18, 12F

06/12 17:19, , 13F
不過都不保證執行時間點
06/12 17:19, 13F

06/12 17:53, , 14F
以他的狀況來看用 finalize 應該就行了
06/12 17:53, 14F

06/12 18:59, , 15F
如果仍然連線中,finalize就不會被執行到,試過了
06/12 18:59, 15F

06/12 19:01, , 16F
不應該在finalize中才去釋放自OS/其它AP 取得應還的資源
06/12 19:01, 16F

06/12 19:02, , 17F
PhantomReference跟ReferenceQueue我再去研究看看這是什麼
06/12 19:02, 17F

06/13 01:28, , 18F
掛個proxy class然後在proxy object跑finalize,這樣也會因
06/13 01:28, 18F

06/13 01:29, , 19F
為後端conn obj還在連線而不會被回收?
06/13 01:29, 19F

06/13 02:20, , 20F
anyway, it's nondeterministic safeguard approach
06/13 02:20, 20F

06/13 02:22, , 21F
對JVM來說"物件沒有參照了"這件事的時間點是非確定性的
06/13 02:22, 21F

06/16 12:30, , 22F
java 7有 try with resource 可以用嗎?
06/16 12:30, 22F
文章代碼(AID): #1FrXTKl8 (java)
討論串 (同標題文章)
文章代碼(AID): #1FrXTKl8 (java)