作者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