`
mocca3in1
  • 浏览: 44208 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
阅读更多
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 连接池实际在某些地方也是不尽如人意的。
分享到:
评论

相关推荐

    Java 连接池实现

    总的来说,Java连接池是提高数据库应用性能的重要工具,通过合理配置和选择合适的连接池实现,我们可以有效地管理和利用数据库连接,减少系统资源的消耗,提升整体系统的响应速度和稳定性。对于开发者来说,理解和...

    java socket连接池 实现

    Java Socket 连接池实现是提高网络应用性能和效率的关键技术之一。在高并发的网络环境中,频繁地创建和销毁Socket连接会导致大量的系统资源浪费,影响整体性能。为了解决这个问题,开发人员通常会使用连接池来管理和...

    okhttp中连接池实现

    本文将深入探讨OkHttp中的连接池实现,包括连接对象的添加、移除机制以及其工作原理。 首先,我们需要了解什么是连接池。连接池是一种资源管理技术,用于存储和管理预先建立的网络连接,避免每次请求都创建新的TCP...

    JAVA 完整的数据库连接池实现

    总结,Java 完整的数据库连接池实现涉及到选择合适的连接池实现、配置参数、初始化连接池以及在代码中正确地获取和释放连接。理解这些概念和步骤对于优化 Java 应用程序的数据库性能至关重要。通过合理配置和使用...

    连接池实现原理及效率测试

    《连接池实现原理及效率测试》 连接池是数据库应用中的一个重要概念,它在系统设计中扮演着提高性能、优化资源利用的关键角色。本文将深入探讨连接池的实现原理,并通过实际测试分析其效率。 首先,我们需要理解...

    JDBC数据库连接池实现原理

    1. **选择连接池实现**:首先,我们需要选择一个合适的数据库连接池实现,如Apache的DBCP、C3P0、HikariCP或Tomcat JDBC连接池等。这些连接池库提供了管理和维护数据库连接的功能。 2. **配置连接池**:在应用的...

    tomcat连接池实现增删改查

    tomcat连接池实现增删改查 mysql数据库 FCKeditor文本编辑器

    thinkphp5-swoole 数据库连接池实现

    基于tp5的swoole支持,对th5的connection进行改造,使用Swoole\Coroutine\MySQL重写了基于swoole的PDO接口,实现了mysql的数据库连接池,本地测试可用。使用时,替换thinkphp/library/think/db/Connection.php,并...

    编码实现MQ连接池实现JMS消息发送连接管理

    本文将详细解析如何通过编码实现MQ连接池,以便有效地管理和发送JMS消息。 首先,理解JMS的基本概念是至关重要的。JMS提供两种主要的消息模型:点对点(Point-to-Point,P2P)和发布/订阅(Publish/Subscribe,Pub/...

    java连接池实现

    Java连接池实现是一种高效管理数据库连接的技术,它允许应用程序重复使用已经建立的数据库连接,而不是每次需要时都创建新的连接。这大大降低了系统的资源消耗,提高了应用的性能和响应速度。连接池的基本思想是初始...

    一个Demo小例子让你了解数据库连接池实现的4种方式

    本文将通过一个Demo小例子详细介绍四种常见的数据库连接池实现方式:C3P0、DBCP、HikariCP以及Druid。 首先,让我们了解数据库连接池的基本原理。数据库连接池在初始化时会创建一定数量的数据库连接,这些连接在...

    基于Swoole的通用连接池实现常用来作为数据库连接池

    “基于Swoole的通用连接池实现常用来作为数据库连接池” 这个标题指出了一个关键的编程实践,即利用Swoole扩展在PHP中构建一个通用的连接池,特别是用于管理数据库连接。Swoole是一个高性能的PHP扩展,它提供了异步...

    c# mysql数据库连接池实现

    在.NET Core 2.1框架下,可以使用.NET Standard库来实现高效、优化的数据库连接管理,特别是通过连接池来提高性能。本文将深入探讨如何在C#中使用MySQL数据库连接池。 首先,我们需要了解什么是数据库连接池。...

    JDBC数据连接池实现

    "JDBC数据连接池实现"这个主题主要涉及Java数据库连接(JDBC)以及如何有效地管理数据库连接,以提高应用程序的性能和资源利用率。连接池技术在此扮演着至关重要的角色。 首先,JDBC是Java编程语言与各种类型数据库...

    RabbitMQ客户连接池实现示例代码

    在Java中,我们可以使用Apache Commons Pool库来创建一个连接池,或者使用PooledConnectionFactory类,这是RabbitMQ的官方提供的连接池实现。 以下是一个基本的RabbitMQ生产者连接池实现的代码框架: ```java ...

    SpringBoot2.2+commons-pool2实现多Ftp连接池完整项目,开箱即用,经过长期生产使用稳定可靠

    使用JDK1.8、SpringBoot2.2.10.RELEASE、lombok1.18.8、guava23.0、hutool5.3.10、commons-pool2 2.7.0、tika1.22等实现多Ftp连接池实现,通过守护线程实现连接池内连接可用性校验,配置最大、最小连接个数防止Ftp...

    连接池 (jsp)

    在JSP和MVC应用中,我们通常使用像Apache DBCP、C3P0或HikariCP这样的连接池实现。这些库提供了初始化连接池、设置最大最小连接数、超时策略等功能。配置连接池通常涉及以下步骤: 1. 添加对应连接池的依赖到项目中...

Global site tag (gtag.js) - Google Analytics