论坛首页 入门技术论坛

Java实现数据库连接池

浏览 13241 次
该帖已经被评为新手帖
作者 正文
   发表时间:2011-02-21   最后修改:2011-02-21
beeke 写道
连接池获得的connection应该是个proxy,不然close就完了
实现连接池非常简单,核心就两个模式flyweight和proxy
当然要实现工业强度的还是比较困难


你的建议很好,但我有两点疑问:
1、连接池获得的connection应该是个proxy,不然close就完了,一定要代理吗?重写close应该也行。
2、实现连接池非常简单,核心就两个模式flyweight和proxy,能否来个具体的代码或者例子,谢谢。
0 请登录后投票
   发表时间:2011-02-21  
pouyang 写道
kimmking 写道
PooledConnection 没有继承 Connection ,并重写close方法
这将导致每次获取到的是一个实际的Connection,close了就真close了,
达不到重用效果。

class PooledConnection extends java.sql.Connection {
@override
 public void close() {
   //回收到连接池里,并不是去关闭他,应该就是置状态为闲吧?
 }
}


我有两个问题:

1、这个5秒,怎么确定,真正的环境中,怎么确定这个时间?
如果5秒中之后,连接也仍处在忙的状态,强制关闭,会不会?
// 如果对象忙则等 5 秒 ,5 秒后直接刷新
if (pConn.isBusy()) {
	wait(5000); // 等 5 秒
}

// 关闭此连接,用一个新的连接代替它。
closeConnection(pConn.getConnection());
pConn.setConnection(newConnection());
pConn.setBusy(false);



2、刷新连接的时候,这里直接置空闲,行吗?
// 先找到连接池中的要返回的连接对象
if (conn == pConn.getConnection()) {
	// 找到了 , 设置此连接为空闲状态
	pConn.setBusy(false);
	break;




完全乱讲 你能继承java.sql.Connection  搞笑了 

继承也不是最好的解决方案  最起码你该想到内聚   然后代理  。。。。
0 请登录后投票
   发表时间:2011-02-21  
楼主你要讲出这个连接池实现的要点,否则只是把网上经典的连接池实现贴出来,
1其实就是用flag来表示一个连接是否正在被使用。
2池化管理,回收。
3超时机制。
0 请登录后投票
   发表时间:2011-02-21   最后修改:2011-02-21
tonyruiyu 写道
pouyang 写道
kimmking 写道
PooledConnection 没有继承 Connection ,并重写close方法
这将导致每次获取到的是一个实际的Connection,close了就真close了,
达不到重用效果。

class PooledConnection implements java.sql.Connection {
 public void close() {
   //回收到连接池里,并不是去关闭他,应该就是置状态为闲吧?
 }
}


我有两个问题:

1、这个5秒,怎么确定,真正的环境中,怎么确定这个时间?
如果5秒中之后,连接也仍处在忙的状态,强制关闭,会不会?
// 如果对象忙则等 5 秒 ,5 秒后直接刷新
if (pConn.isBusy()) {
	wait(5000); // 等 5 秒
}

// 关闭此连接,用一个新的连接代替它。
closeConnection(pConn.getConnection());
pConn.setConnection(newConnection());
pConn.setBusy(false);



2、刷新连接的时候,这里直接置空闲,行吗?
// 先找到连接池中的要返回的连接对象
if (conn == pConn.getConnection()) {
	// 找到了 , 设置此连接为空闲状态
	pConn.setBusy(false);
	break;




完全乱讲 你能继承java.sql.Connection  搞笑了 

继承也不是最好的解决方案  最起码你该想到内聚   然后代理  。。。。


请把的代码贴出来,行么,不要光说不做。
0 请登录后投票
   发表时间:2011-02-21  
http://yulon.iteye.com/blog/526273
0 请登录后投票
   发表时间:2011-02-22   最后修改:2011-02-22
getconnection() 用 sync 关键字效率很低,考虑一下concurrent包里面threadpool的实现

赞同前面说的,需要proxy 真实的connection, ProxyConnection 在 close的时候应该是将 DBConnection放回池里,这要就可以实现重用了,看看dbcp的实现应该挺有帮助的
0 请登录后投票
   发表时间:2011-02-22  
tonyruiyu 写道
pouyang 写道
kimmking 写道
PooledConnection 没有继承 Connection ,并重写close方法
这将导致每次获取到的是一个实际的Connection,close了就真close了,
达不到重用效果。

class PooledConnection extends java.sql.Connection {
@override
 public void close() {
   //回收到连接池里,并不是去关闭他,应该就是置状态为闲吧?
 }
}


我有两个问题:

1、这个5秒,怎么确定,真正的环境中,怎么确定这个时间?
如果5秒中之后,连接也仍处在忙的状态,强制关闭,会不会?
// 如果对象忙则等 5 秒 ,5 秒后直接刷新
if (pConn.isBusy()) {
	wait(5000); // 等 5 秒
}

// 关闭此连接,用一个新的连接代替它。
closeConnection(pConn.getConnection());
pConn.setConnection(newConnection());
pConn.setBusy(false);



2、刷新连接的时候,这里直接置空闲,行吗?
// 先找到连接池中的要返回的连接对象
if (conn == pConn.getConnection()) {
	// 找到了 , 设置此连接为空闲状态
	pConn.setBusy(false);
	break;




完全乱讲 你能继承java.sql.Connection  搞笑了 

继承也不是最好的解决方案  最起码你该想到内聚   然后代理  。。。。


自己去扒扒 dbcp c3p0之类的东西去
0 请登录后投票
   发表时间:2011-02-23  
beeke 写道
连接池获得的connection应该是个proxy,不然close就完了
实现连接池非常简单,核心就两个模式flyweight和proxy
当然要实现工业强度的还是比较困难



pouyang 写道
http://yulon.iteye.com/blog/526273




受教,谢谢!
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics