现在的位置: 首页 > 综合 > 正文

Hibernate的三种连接池设置C3P0、Proxool和DBCP

2018年06月10日 ⁄ 综合 ⁄ 共 3785字 ⁄ 字号 评论关闭

引用:http://hxzon00.blog.163.com/blog/static/10489241620103243832920/

 

数据库连接池的选型:DBCP vs C3P0

早上在JavaEye看到Robbin说:

引用:
DBCP的bug非常多,因此Hibernate3已经不再支持DBCP连接池,而推荐使用C3PO。建议你更换数据库连接池。

然后跑去Hibernate官方论坛看,果然,在Please migrate away from DBCP看到Gavin说:

引用:
Guys, after many problems with DBCP, I have decided to remove built-in support for DBCP from Hibernate3, and deprecate DBCP in Hibernate 2.1. I advise everyone to migrate away from DBCP to something that actually works, like C3P0 or Proxool.

(If you /must/ use DBCP, you can always write your own connection provider.)

Actually, it is probably about time we remove any remaining dependencies to Apache commons stuff, since historically they have caused just /so/ much trouble. The only Apache things that do seem to work very well are Ant and log4j. Even commons-logging is a PIA, especially in Tomcat.

这个台湾Guy也是如此建议

引用:
挑選觀念: 是否認為 jakarta 是唯一選擇
是的話, 採用 commons-dbcp ; 不是的話, 採用 proxool / c3p0

Jakarta-commons社区对Hibernate官方不支持DBCP的应对:
http://wiki.apache.org/jakarta-commons/DBCP/Hibernate
==========================
Hibernate的三种连接池设置C3P0、Proxool和DBCP

以下三种连接都是以连接MySQl为例。

<!-- JDBC驱动程序 -->
<property name="connection.driver_class">com.mysql.jdbc.Driver</property> <property name="connection.url">jdbc:mysql://localhost:3306/struts?useUnicode=true&characterEncoding=GBK</property> <!-- 数据库用户名 -->
<property name="connection.username">root</property> <!-- 数据库密码 -->
<property name="connection.password">8888</property>

上 面的一段配置,在c3p0和dbcp中,都是必需的,因为hibernate会根据上述的配置来生成connections,再交给c3p0或dbcp管 理.但是,proxool则不能,虽然说服文档上说proxool也可以和hibernate结合,但我按照官方文档上的说明怎么配也出错,而且,到了 sun和hibernat有的官方网站上问了几天,都没有一个人回复。后来我只能让proxool自身来生成连接,这在下面再讲。

1 C3P0

只需在hibernate.cfg.xml中加入
<property name="c3p0.min_size">5</property>
<property name="c3p0.max_size">30</property>
<property name="c3p0.time_out">1800</property>
<property name="c3p0.max_statement">50</property>

还有在classespath中加入c3p0-0.8.4.5.jar

2 dbcp

在hibernate.cfg.xml中加入

<property name="dbcp.maxActive">100</property>
<property name="dbcp.whenExhaustedAction">1</property>
<property name="dbcp.maxWait">60000</property>
<property name="dbcp.maxIdle">10</property>

<property name="dbcp.ps.maxActive">100</property>
<property name="dbcp.ps.whenExhaustedAction">1</property>
<property name="dbcp.ps.maxWait">60000</property>
<property name="dbcp.ps.maxIdle">10</property>

还有在classespath中加入commons-pool-1.2.jar 和commons-dbcp-1.2.1.jar.

3 proxool

由于数据库connection在较长时间没有访问下会自动断开连接,导致浏览出错,增加proxool作为数据库pool。它有自动连接功能。
1)、从http://proxool.sourceforge.net/下载proxool,释放proxool.jar到WEB-INF/lib

2)、在hibernate.cfg.xml中增加:
<property name="hibernate.proxool.pool_alias">dbpool</property>
<property name="hibernate.proxool.xml">proxool.xml</property>
<property name="connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>

3)、在与hibernate.cfg.xml同级目录(src根目录下)增加proxool.xml文件:
<?xml version="1.0" encoding="utf-8"?>
<!-- the proxool configuration can be embedded within your own application's.
Anything outside the "proxool" tag is ignored. -->
<something-else-entirely>
<proxool>
    <alias>dbpool</alias>
    <!--proxool只能管理由自己产生的连接-->
    <driver-url>
      jdbc:mysql://127.0.0.1:3306/wlsh?characterEncoding=GBK&useUnicode=true&autoReconnect=true     </driver-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <driver-properties>
        <property name="user" value="root" />
        <property name="password" value="123456" />
    </driver-properties>
    <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁-->
    <house-keeping-sleep-time>90000</house-keeping-sleep-time>
    <!-- 最少保持的空闲连接数-->
    <prototype-count>5</prototype-count>
    <!-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定-->
    <maximum-connection-count>100</maximum-connection-count>
    <!-- 最小连接数-->
    <minimum-connection-count>10</minimum-connection-count>
</proxool>
</something-else-entirely>

4)、重起tomcat

在 hibernate3.0中,已经不再支持dbcp了,hibernate的作者在hibernate.org中,明确指出在实践中发现dbcp有 BUG,在某些种情会产生很多空连接不能释放,所以抛弃了对dbcp的支持。proxool不少行家推荐使用.c3p0占用资源比较大,效率也不高.

抱歉!评论已关闭.