现在打算用struts1.2 MYsql开发一个web项目。数据库连接用到proxool 连接池,现遇到3个问题:1.怎么配置proxool, 在项目启动时 就初始化它 :2.初始化 结束后 比如通过 getConn() 获得连接数据库连接,这么写这个方法才能实现每次调用这个方法 都是从连接池中取出一个连接 而不是 从新连接数据库 获得的连接。
3.最后 比如有一个操作
   conn =getConn();
   stmt=conn。createStatment();
   rs=stmt。executeQuery();
   ....  请问操作结束后 rs.close()  stmt。close()   conn 是否还要close(); 
   如果conn。close() 那么下次调用getConn() 是否相当于从新打开数据库 而不是从连接池中取已有连接   如果不关闭conn  那么 proxool 是回收它 还是 conn 泄露请配置过proxool 的人  解答下     最好给出详细代码  感激不尽!

解决方案 »

  1.   

    给你个配置文件实际使用的,由于使用hibernate,这3个问题都不存在了<?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>mysql</alias>
    <driver-url>
    jdbc:mysql://localhost:3306/hehe
    </driver-url>
    <driver-class>com.mysql.jdbc.Driver</driver-class>
    <driver-properties>
    <property name="user" value="root" />
    <property name="password" value="1" />
    </driver-properties><house-keeping-sleep-time>90000</house-keeping-sleep-time>
    <maximum-new-connections>30</maximum-new-connections>
    <prototype-count>5</prototype-count>
    <maximum-connection-count>100</maximum-connection-count>
    <minimum-connection-count>10</minimum-connection-count>
    <house-keeping-test-sql>SELECT CURRENT_USER</house-keeping-test-sql></proxool>
    </something-else-entirely>
      

  2.   

    你要明白连接池的原理,这里只简单说一下获取和关闭getConnection 是从连接池获取一个连接,
    close()是把当前连接返回到连接池,这样getConnection才能获取到。
    由于从连接池拿到的conn是经过包装的,他的close方法不是真正的关闭数据库连接,而是把这个连接返回到池内作为空闲连接使用连接池了,是不是不需要关闭呢?
    错!!! 要调用conn.close()把连接返回到连接池,
    否则,连接池里没有空闲连接,每次get的时候都会去创建一个新的,直到达到最大连接数
      

  3.   

    可能我没说清楚 
    proxool。xml
    <?xml version="1.0" encoding="UTF-8"?>
    <something-else-entirely>
      <proxool>
        <alias>v1Pool</alias>
        <!-- 数据库url连接 -->
        <driver-url>jdbc:mysql://localhost:3306/ecms</driver-url>
        <!-- mysql驱动 -->
        <driver-class>org.gjt.mm.mysql.Driver</driver-class>
        <driver-properties>
          <!-- userName -->
          <property name="user" value=".."/>
          <!-- password -->
          <property name="password" value="..."/>
          <property name="useUnicode" value="true"/>
          <property name="characterEncoding" value="utf-8"/>
        </driver-properties>
        <!--自动侦察各个连接状态的时间间隔(毫秒),侦察到空闲的连接就马上回收,超时的销毁1-->
        <house-keeping-sleep-time>90000</house-keeping-sleep-time>
        <!--最少保持的空闲连接数-->
        <prototype-count>5</prototype-count>
        <!--允许最大连接数,超过了这个连接,再有请求时,就排在队列中-->
        <maximum-connection-count>1000</maximum-connection-count>
        <!--最小连接数-->
        <minimum-connection-count>10</minimum-connection-count>
        <!--最大的等待请求数,即因没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的 用户连接就不会被接受-->
        <proxool.simultaneous-build-throttle>200</proxool.simultaneous-build-throttle>
        <!--Test SQL(SELECT getDate()) -->
        <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
      </proxool>
    </something-else-entirely>
    =================
    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>
      <servlet>
        <servlet-name>Admin</servlet-name>
        <servlet-class>org.logicalcobwebs.proxool.admin.servlet.AdminServlet</servlet-class>
      </servlet>
      <servlet-mapping>
        <servlet-name>Admin</servlet-name>
        <url-pattern>/ecms-proxoolPool</url-pattern>
      </servlet-mapping>===================
    java代码:
    public abstract class BaseDao {
       
        /**
         * 数据库参数变量初始化
         */
        public static Connection conn = null;
        public static Statement stmt = null;
        public static ResultSet rs = null;
        /**
         * GET MTSQL DATABASE CONNECTION
         * @return Connection
         */
        public static Connection getConn() {
            try {
                Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
               conn = DriverManager.getConnection("proxool.v1Pool");        } catch (ClassNotFoundException ex) {
                System.out.println(ex.getMessage());
            }
             return conn;
        }    /**
         * 关闭数据库的连接
         * @return  null
         */
        public static void close() {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException ex) {
                System.out.println("断开数据库操作出现异常!");
                System.out.println(ex.getMessage());
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException ex1) {
                    System.out.println("关闭数据库连接出现异常!");
                    System.out.println(ex1.getMessage());
                }
            }
        }}===========================
    现在请结合 上面的3个问题 看下吧  谢谢各位!
      

  4.   

    没人知道吗、  不相信啊 proxool 连接池 很多人都在用啊是分不够吗   不够可以在加  真心希望  明白的朋友 解释下  还有  最后 弄清楚以后 我会把 具体配置 以及心得都贴出来大家一起学习
      

  5.   

    1.怎么配置proxool, 在项目启动时 就初始化它?
    web。xml 的servlet,其中的ServletConfigurator是装载WEB-INF目录下的proxool.xml,表示启动连接池2、获取连接
      conn = DriverManager.getConnection("proxool.v1Pool"); 
      这样操作的结果就是从连接池中获取一个空闲的链接,并不是重新连接。
    3、conn。close() 
       这样的操作只是将连接返回给连接池,并没有实际上的关闭连接,切记每次执行完毕之后要执行此操作。
      

  6.   

    非常 感谢  7楼的回复但是有的文章 说的要在一个 ServletContextLisener 中 配置 连接池的启动
    从中获取连接, 请问这样配置 和 我的配置 有什么区别吗?