首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

Java数据库连接池(2)

2012-09-06 
Java数据库连接池(二)? Java数据库连接池(二)?连接池的一般实现几个概念Connection:是指JDBC规范中的Conne

Java数据库连接池(二)

?

Java数据库连接池(二)

?

连接池的一般实现

几个概念

Connection:是指JDBC规范中的Connection,与接口java.sql.Connection相对应。与特定数据库的连接(会话)。在连接上下文中执行 SQL 语句并返回结果,一个Connection代表一个物理数据库连接。

PhysicalConnection:物理连接,真正完成数据库与应用之间的连接建立和维护,并解析语义,返回相应,一般由各个厂家在驱动程序中提供。例如:Oracle的为oracle.jdbc.driver.PhysicalConnection。

PooledConnection:是与JDBC规范中javax.sql.PooledConnection相对应,为连接池管理提供钩子 (hook) 的对象。PooledConnection 对象表示到数据源的物理连接。该连接在应用程序使用完后可以回收而不用关闭,从而减少了需要建立连接的次数。应用程序员不直接使用 PooledConnection 接口,而是通过一个管理连接池的中间层基础设施使用,例如数据库连接池。

ConnectionProxy:连接代理,一般由数据库连接池提供,完成对物理连接的包装,通过代理连接将一些操作交给物理连接去完成,一些操作自己完成,例如:close方法,一般物理连接的close方法是指物理上彻底关闭连接,而Proxy的一般实现是将该ConnectionProxy标记为闲置状态,并将其放回到连接池中,一般下次可用。

Pool:连接池的核心实现者,主要完成ConnectionProxy的存储,以及连接的获取、释放、创建、物理销毁、连接可用性探测、性能监控。连接池的核心,直接影响到连接池的高可用性、高并发、高性能等特性。

DataSource:是指JDBC规范中的DataSource,与接口java.sql.DataSource相对应。

PooledDataSource:连接池对DataSource的一种实现,意在从Pool中获取连接,达到连接的可重用性。

???????? 掌握了几个概念之后,就可以很清楚的知晓连接池的一般实现了,一般是应用获取一个数据库连接,需要通过调用PoolingDataSource的getConnection方法,getConnection方法就是从Pool中获取一个可用的连接,如果池中有现成的可用的,则直接返回,并将连接标记为繁忙状态。如果当前连接池中无可用连接,则会从驱动程序中获取一个物理连接,并将其包装为ConnectionProxy,返回到Pool中,将其标记为繁忙再次返回给应用。

???????? 而连接的关闭逻辑是这样的,应用App在试用完连接时,调用close方法进行连接的释放操作,而这时调用的是ConnectionProxy的close,ConnectionProxy方法一般是将该连接重新释放到连接中,并标记为闲置状态,以便其他线程去获取。

?Java数据库连接池(2)

下面举个具体的例子,例如DBCP框架中的各个角色与其对应类的实现。

Java数据库连接池(2)

C3p0的实现

?

Java数据库连接池(2)

BoneCP的实现

由此可见在大部分的连接池框架中都可以找到这几个概念。

几个参数

???????? 数据库能否正常工作还要依赖具体环境和应用场景的具体配置,对于数据库连接池的调优也往往是集中在这几个参数上。这几个参数的配置在不同的应用甚至是不同的压力下,都应当有不同的配置,所以我们需要不断的测试调整这些参数以此达到数据库连接池最优。没有绝对正确的参数,只有适合某些场景下的参数,设置是相同的应用在不同的访问压力下,也应当有不同的参数配置。

???????? 虽然目前市场上Java的开源框架繁多,但是大部分的连接池配置参数都有大同小异。首先是连接池在启动时会初始化initMinNum个数据库连接,然后在应用压力逐渐上升时,不断的创建连接,直到MaxNum个,当压力回落时,会逐渐的释放连接直到闲置连接数达到MaxIdleNum。还有一个参数需要特别注意,就是MaxWaitTime,该参数的含义为当数据库连接池中没有可供使用的闲置连接时,连接池会在等待MaxWaitTime时间后会抛出异常或者是其他方式通知调用者。所以该参数应当分场景和分情况来测试,开发环境和测试环境应当尽量设置为较短的时间,例如10秒钟,为的是将问题尽量的暴露出来,引起人们的注意,去排查问题。而在生产环境中应当设置为稍小于用户可接收的等待时间。例如一分钟。

1) 最小连接数

  是连接池一直保持的数据库连接,所以如果应用程序对数据库连接的使用量不大,将会有大量的数据库连接资源被浪费;

2) 最大连接数

  是连接池能申请的最大连接数,如果数据库连接请求超过此数,后面的数据库连接请求将被加入到等待队列中,这会影响之后的数据库操作。

3) 如果最小连接数与最大连接数相差太大,

  那么最先的连接请求将会获利,之后超过最小连接数量的连接请求等价于建立一个新的数据库连接。不过,这些大于最小连接数的数据库连接在使用完不会马上被释放,它将被放到连接池中等待重复使用或是空闲超时后被释放。

总结

???????? 这些数据库连接池实现各自都有自己的特点,例如:BoneCP已分治的原理,将一个Pool分化成为若干个parttition从而解决高 并发,达到高性能。尽管如此,但还是可以看的出,大部分的连接池都遵循以上原则,可以找到以上几个概念的影子,既然是这样就可以针对大部分的连接池开发出一个通用的监控工具。下篇博文我将利用通用原理,开发适用大部分数据库连接池的监控工具,以便大家能够对数据库连接池调优。

热点排行