IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Hibernate连接池配置实例

博客园-草原和大树 2009-11-10 11:44:26 累计浏览 2,961 次
本机暂存

Hibernate支持第三方的连接池,官方推荐的连接池是C3P0,Proxool,以及DBCP。在Hibernate连接池配置时需要注意的有三点:

一、Apche的DBCP在Hibernate2中受支持,但在Hibernate3中已经不再推荐使用,官方的解释是这个连接池存在缺陷。如果你因为某种原因需要在Hibernate3中使用DBCP,建议采用JNDI方式。

二、默认情况下(即没有配置连接池的情况下),Hibernate会采用内建的连接池。但这个连接池性能不佳,且存在诸多BUG(笔者就曾在Mysql环境下被八小时连接悬空问题困扰过),因此官方也只是建议仅在开发环境下使用。

三、Hibernate2和Hibernate3的命名空间有所变化。例如,配置C3P0时的provider_class有Hibernate2环境下使用net.sf.hibernate.connection.C3P0ConnectionProvider,在Hibernate3环境下使用org.hibernate.connection.C3P0ConnectionProvider。

下面是Hibernate环境下几种常见的连接池配置:

1.默认Hibernate连接池配置

<?xml version='1.0' encoding='UTF-8'?>    <!DOCTYPE hibernate-configuration     PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">    <hibernate-configuration>    <session-factory >    <!―JDBC驱动程序-->    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>    <!-- 连接数据库的URL-->    <property name="connection.url">      jdbc:mysql://localhost:3306/schoolproject     </property>    <property name="connection.useUnicode">true</property>    <property name="connection.characterEncoding">UTF-8</property>    <!--连接的登录名-->    <property name="connection.username">root</property>    <!―登录密码-->    <property name="connection.password"></property>    <!--是否将运行期生成的SQL输出到日志以供调试-->    <property name="show_sql">true</property>    <!--指定连接的语言-->    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>    <!--映射Student这个资源-->    <mapping resource="com/wqbi/model/pojo/student.hbm.xml" />    </session-factory>      </hibernate-configuration>    

 2.C3P0的Hibernate连接池配置

<?xml version='1.0' encoding='UTF-8'?>    <!DOCTYPE hibernate-configuration     PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">    <hibernate-configuration>    <session-factory >    <!―JDBC驱动程序-->    <property name="connection.driver_class">com.mysql.jdbc.Driver</property>    <!-- 连接数据库的URL-->    <property name="connection.url">      jdbc:mysql://localhost:3306/schoolproject     </property>    <property name="connection.useUnicode">true</property>    <property name="connection.characterEncoding">UTF-8</property>    <!--连接的登录名-->    <property name="connection.username">root</property>    <!--登录密码-->    <property name="connection.password"></property>          <!-- C3P0连接池设定-->    <p    <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider     </property>    <property name="hibernate.c3p0.max_size">20</property>    <property name="hibernate.c3p0.min_size">5</property>    <property name="hibernate.c3p0.timeout">120</property>    <property name="hibernate.c3p0.max_statements">100</property>    <property name="hibernate.c3p0.idle_test_period">120</property>    <property name="hibernate.c3p0.acquire_increment">2</property>    <!--是否将运行期生成的SQL输出到日志以供调试-->    <property name="show_sql">true</property>    <!--指定连接的语言-->    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>    <!--映射Student这个资源-->    <mapping resource="com/wqbi/model/pojo/student.hbm.xml" />    </session-factory>      </hibernate-configuration>    
<?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://localhost:3306/schoolproject?useUnicode=true&characterEncoding=UTF8    </driver-url>    <!―JDBC驱动程序-->    <driver-class>com.mysql.jdbc.Driver</driver-class>    <driver-properties>    <property name="user" value="root"/>    <property name="password" value=""/>    </driver-properties>      <!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回     收,超时的销毁-->      <house-keeping-sleep-time>90000</house-keeping-sleep-time>    <!-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的     用户连接就不会被接受-->      <maximum-new-connections>20</maximum-new-connections>    <!-- 最少保持的空闲连接数-->      <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>     

(2)配置hibernate.cfg.xml文件

<?xml version='1.0' encoding='UTF-8'?>    <!DOCTYPE hibernate-configuration     PUBLIC "-//Hibernate/Hibernate Configuration DTD//EN"     "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">    <hibernate-configuration>    <session-factory >    <property name="hibernate.connection.provider_class">    org.hibernate.connection.ProxoolConnectionProvider     </property>    <property name="hibernate.proxool.pool_alias">DBPool</property>    <property name="hibernate.proxool.xml">proxoolconf.xml</property>    <!--是否将运行期生成的SQL输出到日志以供调试-->    <property name="show_sql">true</property>    <!--指定连接的语言-->    <property name="dialect">org.hibernate.dialect.MySQLDialect</property>    <!--映射Student这个资源-->    <mapping resource="com/wqbi/model/pojo/student.hbm.xml" />    </session-factory>      </hibernate-configuration>    

(1) hibernate.connection.provider_class定义Hibernate的连接加载类,这里Proxool连接池是用这个,不同 的连接池有不同的加载类,可以查阅Hibernate文档获取相关信息

(2) hibernate.proxool.pool_alias这里就是用我们上面提到的连接池的别名

(3) hibernate.proxool.xml是向Hibernate声明连接池的配置文件位置,可以用相对或绝对路径,用相对路径时要注意一定在要Path范围内!不然会抛出异常。

(4) dialect是声明SQL语句的方言

(5) show_sql定义是否显示Hibernate生成的SQL语言,一般在调试阶段设为true,完成后再改成false,这样有利于调试

(6) <mapping >资源文件映射

3.   JNDI方式的Hibernate连接池配置

数据源已经由应用服务配置好(如Web服务器),Hibernate需要做的只是通过JNDI名查找到此数据源。应用服务器将连接池对外显示为JNDI绑定数据源,它是javax.jdbc.Datasource类的一个实例。只要配置一个Hibernate文件,如:hibernate.properties

hibernate.connection.datasource=java:/comp/env/jdbc/schoolproject //JNDI名     hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory     hibernate.transaction.manager_loopup_class =     org.hibernate.transaction.JBossTransactionManagerLookup     hibernate.dialect=org.hibernate.dialect.MySQLDialect    

结论:

由于在Hibernate3.0中,已经不再支持dbcp了,Hibernate的作者在hibernate.org中,明确指出在实践中发现dbcp有 BUG,在某些种情会产生很多空连接不能释放,所以抛弃了对dbcp的支持。我不知是否在dbcp最新版本中解决了这个问题,我以前在一个访问量不大的项目中用过dbcp,运行了一年多都没出现问题。不过在网上的确也有不少网友指出dbcp在大型的应用中会出现不稳定的情况。所以在真相未经证实的情况下,我觉得对dbcp持慎重的态度。

至于c3p0,有评论说它的算法不是最优的,而且,我在matrix中,见到有网友做了一个实验,在同一项目中分别用了几个常用的Hibernate连接池配置,然后测试其性能,发现c3p0占用资源比较大,效率也不高。

所以,基于上述原因,我才花两晚的时间去研究proxool的配置,proxool不少行家推荐使用,而且暂时来说,是负面评价是最少的一个。在三星中也有项目是用proxool的。

同分类推荐文章

  1. 使用deepseek进行Oracle恢复,引起重大故障 (2026-06-22 10:56:00)
  2. 接手一个只差临门一脚的数据库恢复 (2026-06-18 00:13:09)
  3. 我做了一个 AI 版的 StarRocks 升级风险扫描工具,直接帮我定位到一个风险 (2026-06-15 01:00:00)

查看更多 数据库 文章 →

建议继续学习

  1. SmartSprites - 命令行形式的CSS Sprites生成器 (累计阅读 123,895)
  2. Java开发岗位面试题归类汇总 (累计阅读 22,157)
  3. android 开发入门 (累计阅读 19,529)
  4. 我的PHP,Python和Ruby之路 (累计阅读 13,149)
  5. HashMap解决hash冲突的方法 (累计阅读 12,654)
  6. 一个大二学生有关如何成为一名软件工程师的疑问及答复 (累计阅读 9,181)
  7. Java程序员应该知道的10个eclipse调试技巧 (累计阅读 8,014)
  8. 如何让员工忠于公司? (累计阅读 7,940)
  9. Java技术路线 (累计阅读 7,727)
  10. 聊聊ThoughtWorks面试 (累计阅读 7,616)