锁定老帖子 主题:Java实现数据库连接池
该帖已经被评为新手帖
|
|
---|---|
作者 | 正文 |
发表时间:2011-02-21
最后修改:2011-02-21
beeke 写道 连接池获得的connection应该是个proxy,不然close就完了
实现连接池非常简单,核心就两个模式flyweight和proxy 当然要实现工业强度的还是比较困难 你的建议很好,但我有两点疑问: 1、连接池获得的connection应该是个proxy,不然close就完了,一定要代理吗?重写close应该也行。 2、实现连接池非常简单,核心就两个模式flyweight和proxy,能否来个具体的代码或者例子,谢谢。 |
|
返回顶楼 | |
发表时间: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 搞笑了 继承也不是最好的解决方案 最起码你该想到内聚 然后代理 。。。。 |
|
返回顶楼 | |
发表时间:2011-02-21
楼主你要讲出这个连接池实现的要点,否则只是把网上经典的连接池实现贴出来,
1其实就是用flag来表示一个连接是否正在被使用。 2池化管理,回收。 3超时机制。 |
|
返回顶楼 | |
发表时间: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 搞笑了 继承也不是最好的解决方案 最起码你该想到内聚 然后代理 。。。。 请把的代码贴出来,行么,不要光说不做。 |
|
返回顶楼 | |
发表时间:2011-02-21
http://yulon.iteye.com/blog/526273
|
|
返回顶楼 | |
发表时间:2011-02-22
最后修改:2011-02-22
getconnection() 用 sync 关键字效率很低,考虑一下concurrent包里面threadpool的实现
赞同前面说的,需要proxy 真实的connection, ProxyConnection 在 close的时候应该是将 DBConnection放回池里,这要就可以实现重用了,看看dbcp的实现应该挺有帮助的 |
|
返回顶楼 | |
发表时间: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之类的东西去 |
|
返回顶楼 | |
发表时间:2011-02-23
beeke 写道 连接池获得的connection应该是个proxy,不然close就完了
实现连接池非常简单,核心就两个模式flyweight和proxy 当然要实现工业强度的还是比较困难 pouyang 写道 http://yulon.iteye.com/blog/526273
受教,谢谢! |
|
返回顶楼 | |