Proxool是一个JavaSQL Driver驱动程序,提供了对你选择的其它类型的驱动程序的连接池封装。可以非常简单的移植到现存的代码中。完全可配置。快速,成熟,健壮。可以透明地为你现存的JDBC驱动程序增加连接池功能。

日前,Hibernate官方宣布由于Bug太多不再支持DBCP,而推荐使用 Proxool或C3P0。

Proxool在Hibernate中的典型配置如下:

配置步聚

(1) 建立proxool.xml文件,路径为根目录src下即与hibernate.cfg.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>mssqlProxool</alias>

<driver-url>jdbc:sqlserver://XXX.XXX.XXX.XX:1433;databaseName=XXX</driver-url>

<driver-class>com.microsoft.sqlserver.jdbc.SQLServerDriver</driver-class>

<driver-properties>

<property name="user" value="sa" />

<property name="password" value="XXX" />

</driver-properties>

<house-keeping-test-sql>selectCURRENT_DATE</house-keeping-test-sql>

<house-keeping-sleep-time>90000</house-keeping-sleep-time>

<simultaneous-build-throttle>20</simultaneous-build-throttle>

<maximum-connection-count>100</maximum-connection-count>

<minimum-connection-count>10</minimum-connection-count>

<maximum-connection-lifetime>3600000</maximum-connection-lifetime>

</proxool>

</something-else-entirely>

属性列表说明:

fatal-sql-exception: 它是一个逗号分割的信息片段.当一个SQL异常发生时,他的异常信息将与这个信息片段进行比较.如果在片段中存在,那么这个异常将被认为是个致命错误 (Fatal SQL Exception).这种情况下,数据库连接将要被放弃.无论发生什么,这个异常将会被重掷以提供给消费者.用户最好自己配置一个不同的异常来抛出.

fatal-sql-exception-wrapper-class:正如上面所说,你最好配置一个不同的异常来重掷.利用这个属性,用户可以包装

SQLException,使他变成另外一个异常.这个异常或者继承SQLException或者继承字RuntimeException.proxool

自带了2个实现:'org.logicalcobwebs.proxool.FatalSQLException'和'org.logicalcobwebs.proxool.FatalRuntimeException'.后者更合适.

house-keeping-sleep-time: house keeper 保留线程处于睡眠状态的最长时间,house keeper 的职责就是检查各个连接的状态,并判断是否需要销毁或者创建.

house-keeping-test-sql: 如果发现了空闲的数据库连接.house keeper 将会用这个语句来测试.这个语句最好非常快的被执行.如果没有定义,测试过程将会被忽略。

injectable-connection-interface: 允许proxool实现被代理的connection对象的方法.

injectable-statement-interface: 允许proxool实现被代理的Statement 对象方法.

injectable-prepared-statement-interface: 允许proxool实现被代理的PreparedStatement 对象方法.

injectable-callable-statement-interface: 允许proxool实现被代理的CallableStatement 对象方法.

jmx: 如果属性为true,就会注册一个消息Bean到jms服务,消息Bean对象名: "Proxool:type=Pool,name=<alias>". 默认值为false.

jmx-agent-id: 一个逗号分隔的JMX代理列表(如使用MBeanServerFactory.findMBeanServer(String agentId)注册的连接池。)这个属性是仅当"jmx"属性设置为"true"才有效。所有注册jmx服务器使用这个属性是不确定的

jndi-name: 数据源的名称

maximum-active-time: 如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.

所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟.

maximum-connection-count: 最大的数据库连接数.

maximum-connection-lifetime: 一个线程的最大寿命.

minimum-connection-count: 最小的数据库连接数

overload-without-refusal-lifetime: 这可以帮助我们确定连接池的状态。如果我们已经拒绝了一个连接在这个设定值(毫秒),然后被认为是超载。默认为60秒。

prototype-count: 连接池中可用的连接数量.如果当前的连接池中的连接少于这个数值.新的连接将被建立

(假设没有超过最大可用数).例如.我们有3个活动连接2个可用连接,而我们的prototype-count是4,那么数

据库连接池将试图建立另外2个连接.这和minimum-connection-count不同.minimum-connection-count

把活动的连接也计算在内.prototype-count 是spare connections 的数量.

recently-started-threshold: 这可以帮助我们确定连接池的状态,连接数少还是多或超载。只要至少有一个连接已开始在此值(毫秒)内,或者有一些多余的可用连接,那么我们假设连接池是开启的。默认为60秒

simultaneous-build-throttle: 这是我们可一次建立的最大连接数。那就是新增的连接请求,但还没有可供使用的连接。由于连接可以使用多线程,在有限的时间之间建立联系从而带来可用连接,但是我们需要通过一些方式确认一些线程并不是立即响应连接请求的,默认是10。

statistics: 连接池使用状况统计。参数“10s,1m,1d”

statistics-log-level: 日志统计跟踪类型。参数“ERROR”或 “INFO”

test-before-use: 如果为true,在每个连接被测试前都会服务这个连接,如果一个连接失败,那么将被丢弃,另一个连接将会被处理,如果所有连接都失败,一个新的连接将会被建立。否则将会抛出一个SQLException异常。

test-after-use: 如果为true,在每个连接被测试后都会服务这个连接,使其回到连接池中,如果连接失败,那么将被废弃。

trace: 如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL).你也可以注册一个ConnectionListener (参看ProxoolFacade)得到这些信息.

(2)修改hibernate.cfg.xml文件,内容如下:

<?xml version='1.0' encoding='UTF-8'?>

<!DOCTYPE hibernate-configuration PUBLIC

"-//Hibernate/Hibernate Configuration DTD 3.0//EN"

"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<!-- Generated by MyEclipse Hibernate Tools.                  -->

<hibernate-configuration>

<session-factory>

<propertyname="hibernate.proxool.pool_alias">mssqlProxool</property>

<propertyname="hibernate.proxool.xml">proxool.xml</property>

<propertyname="hibernate.connection.provider_class">org.hibernate.connection.ProxoolConnectionProvider</property>

<propertyname="hibernate.proxool.existing_pool">true</property>

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

<propertyname="hibernate.cache.use_query_cache">true</property>

</session-factory>

</hibernate-configuration>

这里需注意三点:

1.别名与proxool中的别名保持一致.

2.路径确保正确

3一般网上只说明了以上两点,hibernate.proxool.existing_pool这个参数很重要

hibernate.proxool.existing_pool:此值设为 false,当 hibernate 开始被调用时,就会初始化 proxool,进行数据库连接等操作;

(3)要让程序直接使用proxool连接池,可以在web.xml中配置初始化servlet,在web容器加载的时候自动加载配置文件

<servlet>

<servlet-name>ServletConfigurator </servlet-name>

<servlet-class>org.logicalcobwebs.proxool.configuration.ServletConfigurator</servlet-class>

<init-param>

<param-name>xmlFile</param-name>

<param-value>/WEB-INF/classes/proxool.xml</param-value>

</init-param>

<load-on-startup>1</load-on-startup>

</servlet>

注意:如果同时配置了web.xml和hibernate.cfg.xml会产生错误:

org.logicalcobwebs.proxool.ProxoolException:   Parsing  failed.

因为同名的proxool连接池已经启动,而hibernate开始运行时会自己启动关联的proxool连接池.

所以此时应改变hibernate.cfg.xml配置为:

<propertyname="hibernate.proxool.existing_pool">true</property>

(4)这一步是可选的 在应用中实时监控连接池

<servlet>

<servlet-name>adminProxool</servlet-name>

<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>

</servlet>

<servlet-mapping>

<servlet-name>adminProxool</servlet-name>

<url-pattern>/admin/proxool</url-pattern>

</servlet-mapping>

访问http://localhost:8080/项目名称/admin/proxool即可看到页面

4.错误解析:

常遇到的问题是

org.hibernate.HibernateException:Proxool Provider unable to load JAXPconfigurator file:proxool.xml

这有可能是由于proxool包版本的问题,我先后试过proxool-0.9.0RC1 proxool-0.9.0RC2proxool-0.9.0RC3

proxool-0.9.0 proxool-0.9.1 结果是高版本的0.9.0和0.9.1都会有这个问题,使用RC1或者以下的版本则没有.

基本使用代码,

Connection connection = null;

2.try {

3. Class.forName("org.hsqldb.jdbcDriver");

4.  try {

5.    connection =DriverManager.getConnection("jdbc:hsqldb:test");

6.  } catch (SQLException e) {

7.    LOG.error("Problem gettingconnection", e);

8.  }

9.

10.  if (connection != null) {

11.    LOG.info("Gotconnection :)");

12.  } else {

13.    LOG.error("Didn't getconnection, which probably means that no Driver accepted the URL");

14.  }

15.

16.} catch (ClassNotFoundException e) {

17.  LOG.error("Couldn't finddriver", e);

18.} finally {

19.  try {

20.    // Check to see we actuallygot a connection before we

21.    // attempt to close it.

22.    if (connection != null) {

23.      connection.close();

24.    }

25.  } catch (SQLException e) {

26.    LOG.error("Problem closingconnection", e);

27.  }

28.}

设定为datasource,

Connection connection = null;

2.try {

3. Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");

4.  try {

5.    connection =DriverManager.getConnection("proxool.example:org.hsqldb.jdbcDriver:jdbc:hsqldb:test");

6.  } catch (SQLException e) {

7.    LOG.error("Problem gettingconnection", e);

8.  }

9.

10.  if (connection != null) {

11.    LOG.info("Gotconnection :)");

12.  } else {

13.    LOG.error("Didn't getconnection, which probably means that no Driver accepted the URL");

14.  }

15.

16.} catch (ClassNotFoundException e) {

17.  LOG.error("Couldn't finddriver", e);

18.} finally {

19.  try {

20.    // Check to see we actuallygot a connection before we

21.    // attempt to close it.

22.    if (connection != null) {

23.      connection.close();

24.    }

25.  } catch (SQLException e) {

26.    LOG.error("Problemclosing connection", e);

27.  }

28.}

四个流行的Java连接池之Proxool篇的更多相关文章

  1. 四大流行的java连接池之BoneCP篇

    BoneCP 是一个开源的快速的 JDBC 连接池.BoneCP很小,只有四十几K(运行时需要log4j和Google Collections的支持,这二者加起来就不小了),而相比之下C3P0 要六百 ...

  2. 四大流行的jdbc连接池之C3P0篇

    C3P0是一个开放源代码的JDBC连接池,它在lib目录中与Hibernate一起发布,包括了实现jdbc3和jdbc2扩展规范说明的Connection 和Statement 池的DataSourc ...

  3. 几个主流java连接池

    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...

  4. 转载: 几个主流的Java连接池整理

    https://www.cnblogs.com/linjian/p/4831088.html 池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所 ...

  5. 几个主流的Java连接池整理

    池(Pool)技术在一定程度上可以明显优化服务器应用程序的性能,提高程序执行效率和降低系统资源开销.这里所说的池是一种广义上的池,比如数据库连接池.线程池.内存池.对象池等.其中,对象池可以看成保存对 ...

  6. [JavaEE] 了解Java连接池

    转载自51CTO http://developer.51cto.com/art/201006/207768.htm 51CTO曾经为我们简单的介绍过Java连接池.要了解Java连接池我们先要了解数据 ...

  7. Java 连接池的工作原理(转)

    原文:Java 连接池的工作原理 什么是连接? 连接,是我们的编程语言与数据库交互的一种方式.我们经常会听到这么一句话“数据库连接很昂贵“. 有人接受这种说法,却不知道它的真正含义.因此,下面我将解释 ...

  8. Redis Java连接池调研

    Redis Java连接池调研 线上服务,由于压力大报错RedisTimeOut,但是需要定位到底问题出现在哪里? 查看Redis慢日志,slowlog get 发现耗时最大的也是11000us也就是 ...

  9. 【JAVA】 Java 连接池的工作原理

    什么是连接?         连接,是我们的编程语言与数据库交互的一种方式.我们经常会听到这么一句话“数据库连接很昂贵“.         有人接受这种说法,却不知道它的真正含义.因此,下面我将解释它 ...

随机推荐

  1. MFC消息顺序

    1.AfxWndProc()      该函数负责接收消息,找到消息所属的CWnd对象,然后调用AfxCallWndProc 2.AfxCallWndProc()  该函数负责保存消息(保存的内容主要 ...

  2. 【GIVENCHY商务休闲风格/白色/100%精梳棉/撞色拼接领/长袖衬衣】玛萨玛索男装网购商城

    [GIVENCHY商务休闲风格/白色/100%精梳棉/撞色拼接领/长袖衬衣]玛萨玛索男装网购商城 GIVENCHY商务休闲风格/白色/100%精梳棉/撞色拼接领/长袖衬衣

  3. poj 1080 zoj 1027(最长公共子序列变种)

    http://poj.org/problem?id=1080 http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=27 /* zoj ...

  4. STL vector使用方法介绍

    介绍 这篇文章的目的是为了介绍std::vector,怎样恰当地使用它们的成员函数等操作.本文中还讨论了条件函数和函数指针在迭代算法中使用,如在remove_if()和for_each()中的使用.通 ...

  5. iOS UISearchBar UISearchController

    搜索栏的重要性我们就不说了,狼厂就是靠搜索起家的,现在越来越像一匹没有节操的狼,UC浏览器搜索栏现在默认自家的神马搜索,现在不管是社 交,O2O还是在线教育等都会有一个搜索栏的实现,不过彼此实现效果是 ...

  6. 写一个方法完成如下功能,判断从文本框textbox1输入的一个字符,如果是数字则求该数字的阶乘,如果是小写字条,则转换为大写,大写字符不变,结果在文本框textbox2中显示

    窗体设计: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System. ...

  7. HTML文档类型声明的坑...

    如果发现js莫名其妙的报错(比如demo不报错,自己写的就报错),或者样式显示不正常,一定记得检查HTML页面里面加没加如下文档声明: <!DOCTYPE HTML PUBLIC "- ...

  8. redis的管理工具

    phpredisadmin工具 rdbtools管理工具 saltstack管理redis 通过codis完成redis管理 一:phpredisadmin工具:类似于mysqladmin管理mysq ...

  9. emoji表情键盘 回退删除方法

  10. 【转】OpenCV中使用神经网络 CvANN_MLP

    原文见:http://blog.csdn.net/xiaowei_cqu/article/details/9027617 OpenCV的ml模块实现了人工神经网络(Artificial Neural ...