Hibernate3配置proxool连接池

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

一、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。

另外,有一些外国文章称C3PO在性能上有点缺陷,所以本文主要谈谈如何采用proxool作为Hibernate3的连接池。

OK,Let'Go!!!

一、获取proxool

从proxool的官网上下载最新版本的proxool,官网地址是http://proxool.sourceforge.net/

二、编写proxool的配置文件

假设配置文件名为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://localhost/hibernate_many2one?useUnicode=true&amp;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>

三、修改hibernate.cfg.xml

由于引入了连接池,而且连接池配置文件中已经定义好数据源了,所以hibernate.cfg.xml就无须再配置数据库url、driver、username和password了,不过我们却要配上连接池(不然的话Hibernate怎么识别proxool呀)。以下是修改后的hibernate.cfg.xml:

<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
<session-factory>
<!-- 配置proxool连接池 -->
<property name="hibernate.connection.provider_class">
org.hibernate.connection.ProxoolConnectionProvider
</property>
<property name="hibernate.proxool.pool_alias">DBPool</property>
<property name="hibernate.proxool.xml">proxool.xml</property>

<property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>

<!-- 在控制台能显示hibernate执行的sql语句 -->
<property name="hibernate.show_sql">true</property>

<mapping resource="my/User.hbm.xml" />
<mapping resource="my/Group.hbm.xml" />
</session-factory>
</hibernate-configuration>

这样,我们就给Hibernate加上proxool连接池了!

最后还是补充3点值得注意的地方:

1、proxool配置文件的名字要跟hibernate.cfg.xml文件中的<property name="hibernate.proxool.xml"></property>标签对的值对应;

2、proxool配置文件中的<alias></alias>标签对的值也要跟hibernate.cfg.xml中标签对<property name="hibernate.proxool.pool_alias"></property>的值一致;

3、一定要注意,大家可能和我一样,喜欢在配置文件中添加注释说明,但是在proxool配置文件中千万不要添加任何注释,不然的话编译器就很可能会抛异常!!!