`
g21121
  • 浏览: 694690 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

java数据库连接池Proxool

 
阅读更多

        Proxool是一种Java数据库连接池技术。是sourceforge下的一个开源项目,这个项目提供一个健壮、易用的连接池,最为关键的是这个连接池提供监控的功能,方便易用,便于发现连接泄漏的情况。虽说Proxool已经很多年没更新了,但是现在使用Proxool的项目还是非常多的,可见Proxool非常优秀。

 

        Proxool下载:http://proxool.sourceforge.net(能不能打开看你运气了,反正我是没打开)

 

        1.在resource目录新建一个proxool.xml文件,内容为:

<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
	<proxool>
		<alias>mysql</alias>
		<!-- 数据源的别名 -->
		<driver-url>jdbc:mysql://192.168.0.14:3306/test</driver-url>
		<!-- url连接串 -->
		<driver-class>com.mysql.jdbc.Driver</driver-class>
		<!-- 驱动类 -->
		<driver-properties>
			<property name="user" value="xxx"/>
			<!-- 用户名 -->
			<property name="password" value="xxx"/>
			<!-- 密码 -->
		</driver-properties>
		<!-- 
			最大连接数(默认5个),超过了这个连接数,再有请求时,就排在队列中等候,最大的等待请求数由maximum-new-connections决定
		 -->
		<maximum-connection-count>100</maximum-connection-count>
		<!-- 最小连接数(默认2个) -->
		<minimum-connection-count>10</minimum-connection-count>
		<!-- proxool自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁 默认30秒 -->
		<house-keeping-sleep-time>90000</house-keeping-sleep-time>
		<!-- 没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受 -->
		<maximum-new-connections>10</maximum-new-connections>
		<!-- 最少保持的空闲连接数(默认2个) -->
		<prototype-count>5</prototype-count>
		<!-- 在使用之前测试 -->
		<test-before-use>true</test-before-use>
		<!-- 用于保持连接的测试语句  -->
		<house-keeping-test-sql>select * from USER</house-keeping-test-sql>
	</proxool>
</something-else-entirely>

 

 

        2.还是使用我们之前的例子 ,在TestDAO接口和TestDAOImpl实现中添加getUsrInfoWithProxool方法,通过Proxool连接来获取用户信息,TestDAOImpl代码:

package com.test.jdbc.dao.impl;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import org.logicalcobwebs.proxool.CompositeConnectionListener;
import org.logicalcobwebs.proxool.ProxoolException;
import org.logicalcobwebs.proxool.ProxoolFacade;
import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;
import com.mchange.v2.c3p0.ComboPooledDataSource;
import com.test.jdbc.dao.TestDAO;

public class TestDAOImpl implements TestDAO {

    String driver="com.mysql.jdbc.Driver";

    String c3p0JdbcUrl="jdbc:mysql://192.168.0.14:3306/test";
    
    String user="moster";

    String passwd="shzygjrmdwg";

    Connection conn=null;

    /**
     * c3p0实现
     */
    public void getUsrInfoWithC3P0(Integer usrId) {

        ComboPooledDataSource cpds=new ComboPooledDataSource();
        String sql="SELECT * FROM USER u WHERE u.USR_ID=" + usrId;
        try {
            cpds.setDriverClass(driver);
            cpds.setJdbcUrl(c3p0JdbcUrl);
            cpds.setUser(user);
            cpds.setPassword(passwd);
            cpds.setMinPoolSize(5);
            cpds.setAcquireIncrement(5);
            cpds.setMaxPoolSize(20);
            conn=cpds.getConnection();
            Statement st=conn.createStatement();
            ResultSet result=st.executeQuery(sql);
            while(result.next()) {
                System.out.println("c3p0:begin");
                System.out.println("Name:" + result.getString("NAME"));
                System.out.println("c3p0:end");
            }
            result.close();
            st.close();
            conn.close();
        } catch(PropertyVetoException e) {
            e.printStackTrace();
        } catch(SQLException e) {
            e.printStackTrace();
        } 
    }

    /**
     * Proxool实现
     * @throws ProxoolException 
     */
    public void getUsrInfoWithProxool(Integer usrId)  {
        String sql="SELECT * FROM USER u WHERE u.USR_ID=" + usrId;

        try {
            //PropertyConfigurator.configure("resource/proxool.properties");
            JAXPConfigurator.configure("resource/proxool.xml", false);
            ProxoolFacade.addConnectionListener("mysql", new CompositeConnectionListener());
            Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
            conn = DriverManager.getConnection("proxool.mysql");
            Statement st=conn.createStatement();
            ResultSet result=st.executeQuery(sql);
            while(result.next()) {
                System.out.println("Proxool:begin");
                System.out.println("Name:" + result.getString("NAME"));
                System.out.println("Proxool:end");
            }
            
        } catch(ClassNotFoundException e) {
            e.printStackTrace();

        } catch(SQLException e) {
            e.printStackTrace();

        } catch(ProxoolException e) {
            e.printStackTrace();

        } 
    }

}

 

       3.在main函数中添加调用Proxool的方法进行测试,会显示以下结果:

c3p0:begin
Name:g21121
c3p0:end

Proxool:begin
Name:g21121
Proxool:end

  

       上述也可以采用属性文件,加载方法类似。如果是web项目亦可在web.xml中配置:

<!-- 加载proxool配置文件 -->
<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>

 

 

        Proxool监控功能:

        Proxool提供了一个非常实用的功能——监控,通过这个实用的功能我们可以很轻松的观察连接池的状态机变化并作出应对,实现Proxool的监控功能,我们需要对项目进行一些改造:

        1.需要将原项目转换成web项目,这里可以新建或者利用eclipse插件直接转换。

        2.在修改web.xml文件内容:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- 加载proxool配置文件 -->
	<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>

	<!-- proxool监控servlet -->
	<servlet>
		<servlet-name>proxool</servlet-name>
		<servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
	</servlet>

	<servlet-mapping>
		<servlet-name>proxool</servlet-name>
		<url-pattern>/admin</url-pattern>
	</servlet-mapping>


	<welcome-file-list>
		<welcome-file>index.jsp</welcome-file>
	</welcome-file-list>

</web-app>

 

       好了非常简单,打开浏览器输入http://你的服务地址/admin 就行了。

 

 

         下面是Proxool的参数配置及意义:

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

#正如上面所说,你最好配置一个不同的异常来重掷利用这个属性,用户可以包装SQLException,使他变成另外一个异常这个异常或者继承SQLException或者继承字RuntimeExceptionproxool
fatal-sql-exception-wrapper-class=null

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

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

#允许proxool实现被代理的connection
injectable-connection-interface=null

#允许proxool实现被代理的Statement
injectable-statement-interface=null

#允许proxool实现被代理的PreparedStatement
injectable-prepared-statement-interface=null

#允许proxool实现被代理的CallableStatement
injectable-callable-statement-interface=null

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

#这个属性是仅当"jmx"属性设置为"true"才有效。所有注册jmx服务器使用这个属性是不确定的
jmx-agent-id=

#jndi名称
jndi-name=test

#如果housekeeper 检测到某个线程的活动时间大于这个数值它将会杀掉这个线程所以确认一下你的服务器的带宽然后定一个合适的值,单位:分钟,默认5
maximum-active-time=5

#最大的数据库连接数
maximum-connection-count=25

#最小的数据库连接数
minimum-connection-count=1

#一个线程的最大寿命,单位:小时,默认:4
maximum-connection-lifetime=4

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

#连接池中可用的连接数量如果当前的连接池中的连接少于这个数值新的连接将被建立,默认:0
prototype-count=0

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

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

#连接池使用状况统计,参数“10s,1m,1d”,默认:null
statistics=null

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

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

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

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

 

 

        最后是这个项目的源代码供大家参考,代码比较简单没做任何优化,提供一个思路而已。

 

3
4
分享到:
评论

相关推荐

    JAVA数据库连接池proxool

    Java数据库连接池(JDBC Connection Pool)是一种管理数据库连接的技术,它通过预先创建并维护一定数量的数据库连接,为应用程序提供高效、便捷的数据库访问方式。Proxool是Apache Software Foundation开发的一个...

    ssh数据库连接池proxool

    Proxool是SSH框架中常用的数据库连接池之一,以其轻量级、灵活配置和优秀的性能表现而受到青睐。 数据库连接池的基本原理是预先在内存中创建一定数量的数据库连接,应用程序在需要时可以从池中获取连接,使用完毕后...

    使用数据库连接池proxool配置mysql数据库

    Proxool是一个灵活、高效的Java数据库连接池,它支持多种数据库,包括MySQL。它的工作原理是维护一个连接池,当应用程序需要访问数据库时,可以从池中获取一个已存在的连接,用完后归还,而不是每次操作都创建新的...

    数据库连接池包(proxool.jar)

    在Java环境下,Proxool.jar是使用Proxool数据库连接池服务的必备库文件。 首先,我们需要理解数据库连接池的工作原理。数据库连接池在初始化时会创建一定数量的数据库连接并保存在池中,当应用程序需要访问数据库时...

    java连接池proxool

    Proxool是Apache软件基金会开发的一个开源数据库连接池实现,它提供了一种灵活且可配置的方式来管理数据库连接资源。 首先,让我们深入理解什么是Java连接池。在Java编程中,JDBC(Java Database Connectivity)...

    proxool数据库连接池实例(带监控功能)

    本文将详细介绍Proxool数据库连接池及其监控功能,通过一个实际的实例来展示其工作原理和使用方法。 Proxool是Apache软件基金会的一个开源项目,它提供了一个轻量级、高性能的数据库连接池解决方案。Proxool与其他...

    Java各数据库连接池配置介绍

    Java数据库连接池是管理数据库连接的一种机制,它可以有效地复用数据库连接,避免每次数据库操作时创建和销毁连接的开销,从而提高了应用的性能。在Java中,有多种数据库连接池实现,包括C3P0、DBCP和Proxool等。 *...

    proxool_0.9.1

    标签“java 数据库连接池 proxool 中文乱码”揭示了这个包特别适用于解决在Java环境下使用Proxool时可能出现的中文乱码问题。在数据库操作中,如果处理中文字符不当,可能会导致乱码。Proxool的这个版本可能已经针对...

    JAVA数据库连接池(C3P0,Druid,JNDI ,DBCP,Proxool,BoneCP)

    本文将详细介绍几个常见的Java数据库连接池实现:C3P0、Druid、JNDI、DBCP、Proxool以及BoneCP,并结合Spring+MyBatis+maven环境下的应用示例进行解析。 1. C3P0: C3P0是一个开源的JDBC连接池,它实现了数据源和...

    关于proxool数据库连接池的配置集合

    Proxool是Apache软件基金会的一个开源项目,提供了一个轻量级、高性能的数据库连接池解决方案。本篇文章将深入探讨Proxool数据库连接池的配置及其重要性。 首先,理解Proxool的基本概念是必要的。Proxool是Proxy + ...

    各种数据库连接池

    标题中提到的"各种数据库连接池",包括了c3p、DBCP和Proxool,这些都是Java环境下常见的数据库连接池实现: 1. **C3P0**:这是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。...

    proxool数据库连接池配置

    Proxool是一个轻量级的Java数据库连接池管理工具,它可以帮助开发者更高效地管理和利用数据库连接资源。通过Proxool,可以显著减少数据库连接创建和关闭的开销,从而提升应用程序的性能和响应速度。 #### 二、配置...

    数据库连接池-连接的关闭内幕

    ### 数据库连接池-连接的关闭内幕 在深入探讨数据库连接池中连接关闭的问题之前,我们首先需要了解数据库连接池的基本概念以及它在现代应用程序中的重要性。数据库连接池是一种管理多个数据库连接的方法,旨在提高...

    proxool连接池用户名密码加密

    Proxool是一个开源的、轻量级的Java数据库连接池实现,它提供了一种高效、灵活的方式来管理数据库连接。在某些场景下,为了保护敏感信息,如数据库的用户名和密码,我们需要对这些数据进行加密处理。"proxool连接池...

    Java数据库连接池之proxool_动力节点Java学院整理

    总结来说,Proxool是一个功能完备、易于使用的Java数据库连接池,它的监控特性使得开发者能够更好地管理和优化数据库连接,但随着技术的迭代,现在可能已被其他更现代的连接池解决方案所取代。不过,理解Proxool的...

    数据库连接池以及hibernate对各种连接池的整合

    在Java开发中,数据库连接池是一种重要的资源管理工具,它允许开发者高效地管理和复用数据库连接,从而提高系统的性能和稳定性。数据库连接池的基本原理是预先创建一定数量的数据库连接,当应用程序需要访问数据库时...

    java红数据连接池包下载

    Java数据库连接池是一种重要的技术,用于管理数据库连接资源,提高应用程序的性能和效率。在Java中,Proxool是一个流行的选择,它是一个轻量级、开源的数据库连接池实现。标题提到的"java红数据连接池包下载",指的...

    Java实现数据库连接池简易教程

    Java实现数据库连接池简易教程主要涉及了如何在Java应用程序中创建并管理数据库连接池。数据库连接池是一种优化数据库操作的技术,通过复用已存在的数据库连接,减少频繁创建和关闭连接带来的性能开销。本文将介绍一...

    javaEE数据库连接池

    Proxool就是这样一个选择,它是Apache Software Foundation的一个项目,提供了一个高性能、可配置的数据库连接池实现。 Proxool连接池的工作原理主要包括以下几个方面: 1. 连接初始化:在应用启动时,Proxool会...

Global site tag (gtag.js) - Google Analytics