java数据库连接池详情

来源:互联网 发布:mac air怎么清理内存 编辑:程序博客网 时间:2024/06/10 03:02

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"/> 
</bean> 



maxActive、maxIdle和maxWait参数:

maxActive是最大激活连接数,这里取值为20,表示同时最多有20个数据库连接。

maxIdle是最大的空闲连接数,这里取值为20,表示即使没有数据库连接时依然可以保持20空闲的

连接,而不被清除,随时处于待命状态。

MaxWait是最大等待秒钟数,这里取值-1,表示无限等待,直到

超时为止,也可取值9000,表示9秒后超时。



首先说明的一点,为了应用便于移植以及可配置的角度,建议还是使用jndi统一进行连接池的配置。怎么配置其实网上都有很多例子,
这里简单举个例子(使用spring框架):
首先在应用的上下文定义中配置jndi名称,如一个resource.xml文件,里边的写法
    <bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <property name="jndiName"><value>jdbc/myapp</value></property>
    </bean>
注意dataSource这个bean在dao层(hibernate或jdbc)的配置文件里需要作为dataSource名称的属性配置到所有bean中
其中“jdbc/myds”这个就是jndi名称了,下一步就是在应用服务器连接池里进行数据库连接以及对应的jndi配置了


一 开源数据连接池
1 dbcp
dbcp可能是使用最多的开源连接池,原因大概是因为配置方便,而且很多开源和tomcat应用例子都是使用的这个连接池吧。
这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。这个连接池的配置参见附件压缩包中的:dbcp.xml
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性还是可以,不过速度稍慢,在大并发量的压力下稳定性
有所下降,此外不提供连接池监控

2 c3p0
c3p0是另外一个开源的连接池,在业界也是比较有名的,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
这个连接池的配置参见附件压缩包中的:c3p0.xml。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性相当不错,在大并发量的压力下稳定性也有一定保证,
          此外不提供连接池监控。
          
3 proxool
proxool这个连接池可能用到的人比较少,但也有一定知名度,这个连接池可以设置最大和最小连接,连接等待时间等,基本功能都有。
这个连接池的配置参见附件压缩包中的:proxool.xml。
使用评价:在具体项目应用中,发现此连接池的持续运行的稳定性有一定问题,有一个需要长时间跑批的任务场景任务,同样的代码
在另外2个开源连接池中成功结束,但在proxool中出现异常退出。
但是proxool有一个优势--连接池监控,这是个很诱人的东西,大概的配置方式就是在web.xml中添加如下定义:
    <servlet>
        <servlet-name>admin</servlet-name>
        <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>      
   </servlet>
   <servlet-mapping>
      <servlet-name>admin</servlet-name>
      <url-pattern>/admin</url-pattern>
   </servlet-mapping>   
并在应用启动后访问:http://localhost:8080/myapp/admin这个url即可监控 
不过proxool本身的包在监测使用中会有编码问题,附件中有一个
解决此问题的包,参见附件压缩包中的:proxool-0.9.0RC3.jar。另外需要jdk1.5以上的环境。

总结时刻:
综上所述,这几种开源连接池各有优劣,推荐使用c3p0,经检验这种连接池性能稳定,承压能力强。而proxool尽管有明显的性能问题,但由于它具备监控功能,因此建议在开发测试时使用,有助于确定是否有连接没有被关掉,可以排除一些代码的性能问题。

hibernate一般用c3p0,如果是ibatis或者mybatis用dbcp好些,除此之外还可以使用阿里巴巴的数据库连接池,效果也是很好的。dbcp的话兼容性比c3p0好一些,看你的需求了。

0 0