http://topic.csdn.net/u/20100604/22/16fbdbad-ca19-4f00-ab67-60200e0ceb50.html
是要自己实现一个连接池,还是要使用既有开源的连接池做东西呢?
如果需要自己实现一个连接池的话,最起码得对这些技术灵活运用:
* JDBC(java.sql.*, javax.sql.*)
* 线程处理、定时任务
* 动态代理(java.lang.reflect.Proxy, java.lang.reflect.InvocationHandler)
* 集合(java collection framework)
用到的 Java 技术基本上就是这些了。
我草拟了一些连接池实现中主要的技术难点(个人观点仅供参考):
1:Connection#close 问题。使用者使用连接池与不使用连接池,除了从哪获得 Connection 对象不一样之外,其他 JDBC 的代码是完全相同的,并不能因为使用连接池而改变既有的 JDBC 代码。如果不能改变 JDBC 代码,就带来了一个 Connection close 的问题,大家都知道这个调用是关闭数据库连接,如果在连接池中这么做的话就会关闭连接,使用连接得不到重用。
解决方案:
1. 动态代理重写 close 方法,将其改为把连接还回到池中去;
2. 使用装饰器模式重写 close 方法,其他方法进行委托调用。
2:连接被动关闭问题。为了保证连接的复用性,将连接一直保存在池中。有些数据库服务器会将已经连接很久的客户端连接主动踢掉,如果碰到这种情况,在池中的这个连接池就会变为不可用状态,如果被客户端使用的话将会抛出连接被关闭的 SQLException。
解决方案:
使用一个守护线程定时地检查池中连接的健康状态,如果是不健康的连接就将其抛弃,重新生成一个放回池中以便补充。
3:连接回收问题。假如我们的连接池最大设为 50 个,在某一并发很高的时段达到了 50 个,但是过后并发率就降下去了,对于连接池来说池中还是 50 个连接,实际上后面根本不需要那么多连接。这时连接池白白地浪费了几十个数据库宝贵的连接(数据库对于客户端的连接数是有限制的),如果连接池占用了很多的连接,那么可能会导致其他应用程序因为数据库客户端的连接数到了限制而无法再获得连接。我们应该及时地将不需要使用的连接关闭还给数据库服务器,保留一些基本连接数。
解决方案:
配置连接池最大和最小的连接数,以及最大的空闲时间。使用一个守护线程定时查询池中哪些连接空闲的时间已经超过了配置的空闲时间时,就将其取出关闭还给数据库,这时如果池中连接数小于配置最小的连接数时,由这个守护线程打开几个连接填充到池中去。
4:网络中断重连问题。连接池中的连接在网络中断时,池中连接会全部断开,数据库服务端也会回收断开的连接。但是网络中断后,过了一些时间又连上了,这时池中的连接依然是断开的,如果取出来用的话,不用说就会抛出异常的。一个优秀的连接池,必须实现自动重连功能,否则就没有可用的价值。
解决方案:
与问题 1 的解决方案类似,但是这个线程应在网络中断时尝试关闭连接,并扔掉池中连接,启动网络连接监测直到网络通信恢复为止,当一监测到恢复时,立即从数据库中获得连接填充连接池。
--------------------------------------------------------------------
总之,要自己实现一个可用、高效的连接池,难度非常大。就算是著名的 Apache Commons DBCP 连接池实际在某些地方也是不尽如人意的。
分享到:
相关推荐
tomcat连接池实现增删改查 mysql数据库 FCKeditor文本编辑器
基于tp5的swoole支持,对th5的connection进行改造,使用Swoole\Coroutine\MySQL重写了基于swoole的PDO接口,实现了mysql的数据库连接池,本地测试可用。使用时,替换thinkphp/library/think/db/Connection.php,并...
oracle 数据库,在C++中用连接池实现高速连接与访问.rar
使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...
JAVA 完整的数据库连接池实现 可以配置根据自己需要
NULL 博文链接:https://j2ee2009.iteye.com/blog/734794
c#语言下,使用netcore2.1框架,调用netstandard数据库连接池组件
代码中包含okhhtp中连接池的设计,包含连接对象的添加,连接对象何时被移除。
NULL 博文链接:https://cuisuqiang.iteye.com/blog/1329455
一个Demo小例子让你了解数据库连接池实现的4种方式
NULL 博文链接:https://516100981.iteye.com/blog/2314314
RabbitMQ客户端连接池实现代码可直接复制项目中使用,内含MQhelper getMessage sendMessage
数据库连接池 数据库连接池 数据库连接池 数据库连接池
java数据库连接池实现源码,有注释,对数据库开发人员有用
简单易懂,通过C3P0连接池实现对mysql数据库的添加数据。
NULL 博文链接:https://smallbee.iteye.com/blog/1698708
在较为完备的数据库连接池实现中,可根据预先的连接占用超时设定,强制收回被占用连接。从而避免了常规数据库连接操作中可能出现的资源泄漏 。 由于数据库连接得到重用,避免了频繁创建、释放连接引起的大量性能...
Java的JDBC数据库连接池实现方法.doc