数据库连接池Proxool


一、引子
     要问WEB程序与什么关系最紧密,那答案毫无疑问将会是数据库,我们几乎所有的WEB程序都是建立在数据库之上的,怪不得有些人说WEB程序其实就是跑到数据库操作系统之上的应用程序。而相应的一些数据库产品和解决方案也就应运而生,比如大到Oracle,DB2,小到Mysql,另一方面数据库性能优化的方案例如连接池的出现也就好不奇怪了。而我们今天所要探讨的正是数据库连接池的一个方面。

二、Proxool介绍

    目前数据库连接池产品非常之多,DBCP、C3P0、Proxool等都是非常优秀的产品,至于到底是用哪一个好那就取决与自己的喜好了,而我们今天将着重讨论Proxool,它这是一个Java SQL Driver驱动程序可以透明地为你现存的JDBC驱动程序增加连接池的功能,另外它提供一个的监控程序,可以实时的查看你系统所有连接池的使用情况,所以我个人偏好与它。

(PS:Hibernate最近声称DBCP存在问题,它将不会在新的版本中增加对DBCP的支持,并建议开发者使用C3P0或者Proxool,至于什么问题我们这里就不加讨论了)

三、使用Proxool

      说到使用很多人看到大篇大篇的使用文档就会头疼,看到英文资料就会退缩,在这里我将会用我的方式简单的罗列出它基本的使用方法其他生僻的用法将会被忽略,虽然基本但我保证胜任你的项目绝对没有问题,不信?那就跟着我一点一点的深入:)
3.1 你需要了解
    1.它的版本:目前最新版本是Proxool 0.9.0RC2,06年3月份刚更新
    2.配置连接池的几种方式:总共3种,属性文件Properties方式、Xml方式、程序中声明方式,由于最后一种(程序声明方式)比较老土也比较少用,所以在接下来的说明种将忽略它。
    3.连接池的使用范围:2种情况-web中的使用(带servlet的)、应用程序中的使用(带main函数的)。
3.2 配置第一步
    这一步我们将配置proxool的监控程序。

    准备条件:
          1、一个空的web工程项目,可以部署到应用服务器。
          2、加载proxool-0.9.0RC2到lib目录

   配置步骤:
    1、在WEB-INF下增加文件proxool.xml,文件内容如下

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
    xmlns="http://java.sun.com/xml/ns/j2ee"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
    <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>
</web-app>

至此你的监控程序已经部署完成了!啊?这么快?对!就这么简单,你可以访问http://localhost:8080/proxool/admin来查看了,可惜的是现在没有一个连接创建。。。那接下来就让我们开始创建连接噢!
3.3 配置第二步
    这一步主要以xml的方式配置数据库的各个参数。
   准备条件:
       在第一步完成的基础之上。
   配置步骤:
        1、在WEB-INF下建立proxool.xml文件,文件内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<something-else-entirely>
  <proxool>
    <alias>magicexml</alias>
    <driver-url>jdbc:mysql://127.0.0.1:3306/gatewayserver</driver-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <driver-properties>
      <property name="user" value="root"/>
      <property name="password" value="1234"/>
    </driver-properties>
    <minimum-connection-count>6</minimum-connection-count>
    <maximum-connection-count>20</maximum-connection-count>
    <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
  </proxool>
</something-else-entirely>

至于文件内容中的各个参数的含义,待会将会逐一解释,而在这里你需要修改的地方有<diriver-url>、<driver-class>以及数据库用户名和密码。
       2、修改web.xml文件,增加一下内容:

<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/proxool.xml</param-value>
      </init-param> 
      <load-on-startup>1</load-on-startup> 
</servlet>
     3、建立testservlet这样一个servlet类,类的代码如下

package DBProxool;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class testservlet extends HttpServlet ......{

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException ......{       

        Connection conn = null;
        try ......{
               Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
               conn = DriverManager.getConnection("proxool.magicexml");
                                                  /** *//** *//** *//**
                                                     用conn做任何你想做的事情
                                                  **/
               if(conn!=null)......{
                                       conn.close();
               }
           
        } catch (ClassNotFoundException e) ......{
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) ......{
            e.printStackTrace();
        }
               
    public void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException ......{
                      
    }

}



重启服务器,访问testservlet,查看监控程序,哈哈~看到连接了,如下图

3.4 配置第三步
      这一步主要配置连接池的一些参数。
      由于整个程序已经可以运行起来了,或许你很高兴,但是你可不要高兴的太早,如果就这样拿你的项目去做压力测试,那十有八九是通不过的!为什么啊?因为你的连接池还没有经过参数的调优,下面我就简单的介绍一下各个参数的意思,你明白了这些,压力测试肯定不成问题。
      house-keeping-sleep-time: house keeper 保留线程处于睡眠状态的最长时间,house keeper 的职责就是检查各个连接的状态,并判断是否需要销毁或者创建,这个的默认值是30秒。
      house-keeping-test-sql:  如果发现了空闲的数据库连接.house keeper 将会用这个语句来测试.这个语句最好非常快的被执行.如果没有定义,测试过程将会被忽略。
      maximum-active-time: 如果housekeeper 检测到某个线程的活动时间大于这个数值.它将会杀掉这个线程.所以确认一下你的服务器的带宽.然后定一个合适的值.默认是5分钟。经常有些人或许会遇到正在执行的程序忽然拒绝连接,莫明其妙的程序假死,这些都与这个参数的设置有关,我们大部分数据库操作都会在5分钟之内完成,可是偏偏有些可能5分钟还完成不了,而这个值如果按照默认值的话,连接池就会不管你到底有没有执行完,都会强行关闭数据库连接,所以这个值你可要小心设置哦:)
     maximum-connection-count: 最大的数据库连接数.一般的大应用设置30就足够了。
     maximum-connection-lifetime: 一个线程的最大寿命.
     minimum-connection-count: 最小的数据库连接数,一般最好事先初始化一部分连接这样,对于初次连接数据库的应用效率比较高,推荐设置5-10
     prototype-count: 连接池中可用的连接数量.如果当前的连接池中的连接少于这个数值.新的连接将被建立(假设没有超过最大可用数).例如.我们有3个活动连接2个可用连接,而我们的prototype-count是4,那么数据库连接池将试图建立另外2个连接.这和 minimum-connection-count不同. minimum-connection-count把活动的连接也计算在内.prototype-count 是spare connections 的数量.
      trace: 如果为true,那么每个被执行的SQL语句将会在执行期被log记录(DEBUG LEVEL).你也可以注册一个ConnectionListener (参看ProxoolFacade)得到这些信息.
四、结束
     至此有关于proxool的讨论到此为止,感觉是不是很简单呢?~没错如果学会的话就是这么简单^_^,至于怎么去在spring中集成等深入的讨论,在我以后的系列中你将会一点一点的接触到。

你可能感兴趣的:(sql,mysql,Web,应用服务器,servlet)