接池为我们开发带来了极大的便利,它为我们开发者承担了数据库连接管理的压力,让我们从烦琐的数据库事务中解脱出来,专心研究业务逻辑实现业务,是我们的一大福音。
本文分析的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 " >sa</ property >
< !--连接最大数据-->
< property name="hibernate.connection.pool_size">20</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 >
<! 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 " >sa</ property >
< !--连接最大数据-->
< property name="hibernate.connection.pool_size">20</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连接配置
<?
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连接池设定 -->
< 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 >
<!-- 最大的PreparedStatement的数量 -->
< property name = " hibernate.c3p0.max_statements " > 100 </ property >
<!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
< property name = " hibernate.c3p0.idle_test_period " >12 0 </ property >
<!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
< 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 >
<! 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连接池设定 -->
< 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 >
<!-- 最大的PreparedStatement的数量 -->
< property name = " hibernate.c3p0.max_statements " > 100 </ property >
<!-- 每隔120秒检查连接池里的空闲连接 ,单位是秒-->
< property name = " hibernate.c3p0.idle_test_period " >12 0 </ property >
<!-- 当连接池里面的连接用完的时候,C3P0一下获取的新的连接数 -->
< 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 >
3 . proxool 连接池
(1) 先写proxool的配置文件,文件名:proxool.xml(一般放在与hibernate.cfg.xml文件在同一个目录中)本例配置的是MYSQL数据库,数据库的名字为schoolproject
<?
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 >
<!-- 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 >
<?
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 >
<! 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 >
(2) hibernate.proxool.pool_alias 这里就是用我们上面提到的连接池的别名
(3) hibernate.proxool.xml 是向Hibernate声明连接池的配置文件位置,可以用相对或绝对路径,用相对路径时要注意一定在要Path范围内!不然会抛出异常。
(4) dialect 是声明SQL语句的方言
(5) show_sql 定义是否显示Hibernate生成的SQL语言,一般在调试阶段设为true,完成后再改成false,这样有利于调试。
//还要在classespath中加入proxool-0.8.3.jar
4.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 >
< 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 >
在hibernate3.0中,已经不再支持dbcp了,hibernate的作者在hibernate.org中,明确指出在实践中发现 dbcp有BUG,在某些种情会产生很多空连接不能释放,所以抛弃了对dbcp的支持。proxool不少行家推荐使用.c3p0占用资源比较大,效率也不高.
5. JNDI 连接池,数据源已经由应用服务配置好 ( 如 Web 服务器 ) , Hibernate 需要做的只是通过 JNDI 名查找到此数据源。应用服务器将连接池对外显示为 JNDI 绑定数据源,它是 javax.jdbc.Datasource 类的一个实例。只要配置一个 Hibernate 文件,如:
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
hibernate.transaction.factory_class = org.hibernate.transaction.JTATransactionFactory
hibernate.transaction.manager_loopup_class = org.hibernate.transaction.JBossTransactionManagerLookup
hibernate.dialect = org.hibernate.dialect.MySQLDialect