Hibernate3配置proxool连接池
自:http://hi.baidu.com/waltertan/blog/item/05449ced9222134379f05575.html
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&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配置文件中千万不要添加任何注释,不然的话编译器就很可能会抛异常!!!