连接池的总结

最近项目中用到了spring的连接池,现在记录一下自己认为对线程池的一些理解。

一、原理

      由于数据库连接是一种关键的有限的资源,所以对数据库连接的管理会影响到整个项目的性能,对那些需要高性能的项目显得至关重要。

连接池能够很有效的提升性能,而其的原理如下:

      系统在启动的时候创建默认数量的数据库连接,然后保存到内存中,而在系统运行过程中不再在使用数据库的时候新建一个连接,而是从内存中获取当前空闲的连接,当使用完毕后,也不是用户主动关闭连接,而是重新放入到内存中,提供下一次连接使用。我们可以通过参数的配置设置连接池的初始化大小、连接的上下限数、空闲时间等来进行控制。

二、要素

      最大连接数:如果数据库连接数超过了该数目,那么接下来的数据库连接将被放入请求队列中,会影响到后面的数据库操作。

      最小连接数:是连接池一直保持的连接数目,如果设置的过大,那么空闲的连接数将会非常浪费资源。

如果两个数目相差的太大,那么超过最小连接数的连接将会是一个新建的连接,而这个超过最小数目的连接不会马上释放,而是会被放入连接池等待重复连接,或者等待超时释放。

      这两个数目的设置需要衡量到项目真实运行过程中,同时会被建立的连接数;当然需要考虑到数据库默认的连接数,两者之间需要进行匹配。

三、常用类型(先举出我们项目中的一个连接方式,以后再探讨其他的连接方式)

1.apache的DBCP

目前我们项目中用到的是这个方式

<property name="maxActive" value="500"></property>
		<property name="maxIdle" value="50"></property>
		<property name="maxWait" value="200"></property>
		<property name="testOnBorrow" value="true" />
        <property name="validationQuery">
            <value>select 1 from dual</value>
        </property>

说明:

initialSize:连接池初始化启动时的大小,默认为0

maxActive:可以从线程池中取出的最大连接数,默认为8,据说单机器高峰期并发20,0表示没有限制

maxidle:线程池中最大等待中连接数,0表示没有限制

minidle:线程池中最小等待连接数

maxwait:最大等待时间,当没有可用连接时,连接池等待连接释放的最大时间,如果超时,则会抛出异常

validationquery:验证连接是否成功,sql至少要返回一行

testOnBorrow:获取对象时是否进行验证,默认为false,最好设置为true,因为如果数据库因为某种原因挂起,而再从连接池中取出连接又不进行验证,那么取得的连接依然是无效的。

timebetweenevictionrunsmillis:如果大于0,则在指定时间对空闲连接进行验证,默认为30分钟;mysql的连接空闲时间为8小时,即一个连接超过8小时,mysql会自动断开该连接,而spring是不知道的,那么连接池中的该条连接就失效了。

2.C3P0

3.Proxool 

以上连接池的使用依然在调试中,希望对你有所帮助。

猜你喜欢

转载自qing-gee.iteye.com/blog/2091037
今日推荐