Hibernate proxool连接池.docx
《Hibernate proxool连接池.docx》由会员分享,可在线阅读,更多相关《Hibernate proxool连接池.docx(9页珍藏版)》请在冰豆网上搜索。
![Hibernate proxool连接池.docx](https://file1.bdocx.com/fileroot1/2023-3/30/5024fbd9-1244-4d69-8ae1-8fdb3443df91/5024fbd9-1244-4d69-8ae1-8fdb3443df911.gif)
Hibernateproxool连接池
1.下面我介绍一下在使用Hibernate 3.0做数据执久层解决方案时,怎么配置Proxool 0.8.3数据库连接池的方法。
2.1、将proxool-0.8.3.jar以及连接数据库用到的jar文件包含在你的项目的classpath或者WEB-INF/lib下面,本例使用的是MS Sqlserver数据库。
3.2、在和hibernate.cfg.xml平级的目录新建一个proxoolconf.xml文件,添加以下文件内容:
4.
xml version="1.0" encoding="utf-8"?
>
5.
6.
7.proxoolPool
8.
--proxool只能管理由自己产生的连接-->
9.jdbc:
microsoft:
sqlserver:
//192.168.0.5:
1433;DatabaseName=videopublish
10.com.microsoft.jdbc.sqlserver.SQLServerDriver
11.
12.
13.
14.
15.
-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁-->
16.90000
17.
-- 指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->
18.20
19.
-- 最少保持的空闲连接数-->
20.5
21.
-- 允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定-->
22.100
23.
-- 最小连接数-->
24.10
25.
26.
27.3、以上就是proxool所需的配置文件,下面就是hibernate.cfg.xml文件的配置了,也很简单,文件内容如下:
28.
xml version='1.0' encoding='UTF-8'?
>
29.
DOCTYPE hibernate-configuration PUBLIC
30. "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
31. "
32.
33.
34.
35. proxoolPool
36. proxoolconf.xml
37. org.hibernate.connection.ProxoolConnectionProvider
38. com.microsoft.jdbc.sqlserver.SQLServerDriver
39. true
40.
41.
42.
43.
44.
45.
46.4、以上就是配置hibernate+proxool作为数据库连接池的解决方案的代码,本例提供了一个简单的测试代码,如下:
47.<%
48. long r=0;
49. for(int i=0;i<10000;i++){
50. try{
51. long o=new Date().getTime();
52. Session s=HSF.currentSession();
53. Users u=new Users();
54. u.setUsername("zhanglili");
55. u.setUseremail("baidongli@");
56. u.setUsernickname("白冬立");
57. u.setUserpassword("1234567980123456789");
58. u.setUsersex("男");
59. u.setUsersigndate(new Date());
60. Transaction tt=s.beginTransaction();
61. s.save(u);
62. mit();
63. Users user=(Users)s.get(Users.class,new Integer
(1));
64. //out.println(user.getUsername());
65. long n=new Date().getTime();
66. r+=n-o;
67. }catch(Exception e){
68. out.println(e.getMessage());
69. }finally{
70. HSF.closeSession();
71. }
72. }
73. out.println("avg="+r/10);
74.%>
75.5、说明一下,我分别用proxool、tomcat JNDI、Hibernate自带的连接池进行配置之后分别执行以上的10000条数据插入和读取,结果显示proxool的性能要优于tomcat JNDI,而Hibernate自带的就更不用提了,差很远。
依次为:
39265毫秒/10000条、26013毫秒/10000条、50029毫秒/10000条。
76.6、在Hibernate配置连接池时还有一些解决方案,用的比较多的例如:
c3p0,apache dhcp,但网上许多评论显示c3p0在大负荷的负载情况下,性能会降低许多,apache dhcp因为Hibernate作者在测试时发现了性能Bug,所以在Hibernate3.0版本中已经去掉了对其的支持,相比之下,proxool是大家都推荐使用的,许多业界成熟的公司(例如三星)都采用proxool做为方案。
77.7、厚厚,最后,如果有交流struts,hibernate,spring,freemarker,velocity,以及prototype,scriptaculous等ajax框架的朋友,可以加我的msn:
baidongli888@ 2006.10.31
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。
下面是Hibernate环境下几种常见的连接池配置:
1.Hibernate默认连接池
xmlversion='1.0'encoding='UTF-8'?
>
DOCTYPEhibernate-configuration
PUBLIC"-//Hibernate/HibernateConfigurationDTD//EN"
"
—JDBC驱动程序-->
com.mysql.jdbc.Driver
--连接数据库的URL-->
jdbc:
mysql:
//localhost:
3306/schoolproject
true
UTF-8
--连接的登录名-->
root
—登录密码-->
--是否将运行期生成的SQL输出到日志以供调试-->
true
--指定连接的语言-->
org.hibernate.dialect.MySQLDialect
--映射Student这个资源-->
2.C3P0连接配置
xmlversion='1.0'encoding='UTF-8'?
>
DOCTYPEhibernate-configuration
PUBLIC"-//Hibernate/HibernateConfigurationDTD//EN"
"
—JDBC驱动程序-->
com.mysql.jdbc.Driver
--连接数据库的URL-->
jdbc:
mysql:
//localhost:
3306/schoolproject
true
UTF-8
--连接的登录名-->
root
--登录密码-->
--C3P0连接池设定-->
org.hibernate.connection.C3P0ConnectionProvider
20
5
120
100
120
2
--是否将运行期生成的SQL输出到日志以供调试-->
true
--指定连接的语言-->
org.hibernate.dialect.MySQLDialect
--映射Student这个资源-->
3.proxool连接池
(1)先写proxool的配置文件,文件名:
proxool.xml(一般放在与hibernate.cfg.xml文件在同一个目录中)本例配置的是MYSQL数据库,数据库的名字为schoolproject
xmlversion="1.0"encoding="UTF-8"?
>
--theproxoolconfigurationcanbeembeddedwithinyourownapplication's.
Anythingoutsidethe"proxool"tagisignored.-->
--连接池的别名-->
DBPool
--proxool只能管理由自己产生的连接-->
jdbc:
mysql:
//localhost:
3306/schoolproject?
useUnicode=true&characterEncoding=UTF8
—JDBC驱动程序-->
com.mysql.jdbc.Driver
--proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回
收,超时的销毁-->
90000
--指因未有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的
用户连接就不会被接受-->
20
--最少保持的空闲连接数-->
5
--允许最大连接数,超过了这个连接,再有请求时,就排在队列中等候,最大的
等待请求数由maximum-new-connections决定-->
100
--最小连接数-->
10
(2)配置hibernate.cfg.xml文件
xmlversion='1.0'encoding='UTF-8'?
>
DOCTYPEhibernate-configuration
PUBLIC"-//Hibernate/HibernateConfigurationDTD//EN"
"
org.hibernate.connection.ProxoolConnectionProvider
DBPool
proxoolconf.xml
--是否将运行期生成的SQL输出到日志以供调试-->
true
--指定连接的语言-->
org.hibernate.dialect.MySQLDialect
--映射Student这个资源-->
(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)资源文件映射
4.JNDI连接池,数据源已经由应用服务配置好(如Web服务器),Hibernate需要做的只是通过JNDI名查找到此数据源。
应用服务器将连接池对外显示为JNDI绑定数据源,它是javax.jdbc.Datasource类的一个实例。
只要配置一个Hibernate文件,如:
hibernate.connection.datasource=java:
/comp/env/jdbc/schoolproject//JNDI名
hibernate.transaction.factory_class=org.hibe