数据库连接池技术主要是为了提高数据库操作的性能,它允许应用程序重复使用一个现有的数据库连接,而非重新再建立一个
原理:系统初始化时将数据库连接作为对象存储在内存中,同时可以作些配置,当用户访问数据库时,从连接池中取出一个空闲的连接对象,用完后放会池中,可以重复利用
常用的相关的配置参数:
初始连接数:连接池初始化的连接数
最小连接数:是连接池一直保持的数据库连接数
最大连接数:连接池能申请的最大连接数,超过了就只能等待
每次增加的容量:连接池中的连接耗尽时每次增加的连接数
配置需要注意的地方:
最小连接数:如果应用程序使用的连接并不多,可能造成大量连接的浪费
最大连接数:超过最大连接后,导致连接请求进入队列等待,影响数据库的操作
最小和最大连接数相差过大:在连接请求没有超过最小连接数时用的都是现成的,所以比较快,而超过了之后,以后的连接请求需要重新申请连接,用完后放入连接池重复使用或者空间超时后被释放
java中经常使用的数据库连接产品:DBCP,C3P0,Proxool等
java中开源框架对数据库连接产品的集成情况:Hibernate使用c3p0,Spring使用dbcp,不过三种产品都能很好的整合到SpringFramework中
这里的配置我没有重新写而是借鉴网上的,有兴趣可以看看http://qrqzhujinyi.iteye.com/blog/698279
dbcp:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<!--initialSize: 初始化连接-->
<property name="initialSize" value="5"/>
<!--maxIdle: 最大空闲连接-->
<property name="maxIdle" value="10"/>
<!--minIdle: 最小空闲连接-->
<property name="minIdle" value="5"/>
<!--maxActive: 最大连接数量-->
<property name="maxActive" value="15"/>
<!--removeAbandoned: 是否自动回收超时连接-->
<property name="removeAbandoned" value="true"/>
<!--removeAbandonedTimeout: 超时时间(以秒数为单位)-->
<property name="removeAbandonedTimeout" value="180"/>
<!--maxWait: 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒-->
<property name="maxWait" value="3000"/>
<property name="validationQuery">
<value>SELECT 1</value>
</property>
<property name="testOnBorrow">
<value>true</value>
</property>
</bean>
c3p0:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${db.driverClassName}"/>
<property name="jdbcUrl" value="${db.url}"/>
<!--
<property name="user" value="${db.user}"/>
<property name="password" value="${db.pass}"/>
-->
<property name="properties">
<props>
<!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3-->
<prop key="c3p0.acquire_increment">5</prop>
<!--每60秒检查所有连接池中的空闲连接。Default: 0 -->
<prop key="c3p0.idle_test_period">60</prop>
<prop key="c3p0.max_size">15</prop>
<prop key="c3p0.max_statements">0</prop>
<prop key="c3p0.min_size">10</prop>
<prop key="user">${db.user}</prop>
<prop key="password">${db.pass}</prop>
</props>
</property>
</bean>
proxool:
<bean id="dataSource" class="org.logicalcobwebs.proxool.ProxoolDataSource" destroy-method="close">
<property name="driver" value="${db.driverClassName}"/>
<property name="driverUrl" value="${db.url}"/>
<!--用户名和密码写在一起才调用成功,不然会报 调用无效的参数 错误,下面设置用户名和密码的property好像是无效的,其它数据库也是这样
比如mysql的也要把用户名和密码写在url里:<property name="driverUrl" value="jdbc:mysql://localhost:3306/blogdb?user=lizongbo&password=lizongbo" />
-->
<property name="user" value="${db.user}"/>
<property name="password" value="${db.pass}"/>
<property name="alias" value="${db.alias}"/>
<property name="houseKeepingSleepTime" value="90000"/>
<property name="prototypeCount" value="5"/>
<property name="maximumConnectionCount" value="100"/>
<property name="minimumConnectionCount" value="10"/>
<property name="trace" value="true"/>
<property name="verbose" value="true"/>
</bean>