我的是struts2+hibernate+spring的结构,用了proxool连接池,请教两个问题,
我的配置如下:
   </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>30000</house-keeping-sleep-time>  
        <!--没有空闲连接可以分配而在队列中等候的最大请求数,超过这个请求数的用户连接就不会被接受-->  
        <maximum-new-connections>10</maximum-new-connections>    
        <!--最少保持的空闲连接数(默认2个)-->  
        <prototype-count>5</prototype-count>    
        <!--在使用之前测试-->  
        <test-before-use>true</test-before-use>  
但问题是,我在本机测试时,发现用PROXOOL的监控页面,发现
connections:2 (active),30(available),100(MAX),那么我想
问下的是:这里30是否说目前连接池能提供30个可用的连接呢?
这个avaiable的值是系统自动分配的还是可以通过proxtool设置的呢?我发现一放到真实环境上去测试,
就看到avaiable的值才变成10个,变的很小了,代码等都是一样的,这个大概如何解析呢?

解决方案 »

  1.   

    30应该是一步步增大的吧?
    启动时那个30应该是10(mininum)?真实环境,构造一个测试程序,光请求连接不释放,再看咯,肯定很快超过10
      

  2.   


    package net.blogjava.lzqdiy;import java.net.URL;
    import java.sql.*;
    import org.logicalcobwebs.proxool.ProxoolException;
    import org.logicalcobwebs.proxool.ProxoolFacade;
    import org.logicalcobwebs.proxool.configuration.JAXPConfigurator;
    import org.logicalcobwebs.proxool.admin.SnapshotIF;public class DBConnection
    {    private static boolean initialized = false;    private static int activeCount = 0;    public static Connection getConnection() throws SQLException
        {
            Connection connection = null;
            if (!initialized)
            {            init();
            }        connection = DriverManager.getConnection("proxool.Develop");
            try
            {
                SnapshotIF snapshot = ProxoolFacade.getSnapshot("Develop", true);
                int curActiveCount = snapshot.getActiveConnectionCount();// 获得活动连接数
                int availableCount = snapshot.getAvailableConnectionCount();// 获得可得到的连接数
                int maxCount = snapshot.getMaximumConnectionCount();// 获得总连接数
                if (curActiveCount != activeCount)// 当活动连接数变化时输出信息
                {
                    System.out.println("----------------------------------");
                    System.out
                            .println(curActiveCount + "(active)  " + availableCount
                                    + "(available)  " + maxCount + "(max)");
                    System.out.println("----------------------------------");
                    activeCount = curActiveCount;
                }        } catch (ProxoolException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            if (connection != null)
            {            return connection;
            } else
            {
                throw new NullPointerException(
                        "Didn't get connection, which probably means that no Driver accepted the URL");
            }    }    private static void init()
        {
            String fileName = "proxool.xml";
            URL resourceURL = null;
            try
            {
                if (Thread.currentThread().getContextClassLoader() != null)
                {
                    resourceURL = Thread.currentThread().getContextClassLoader()
                            .getResource(fileName);
                }            if (resourceURL == null)
                {
                    resourceURL = DBConnection.class.getClassLoader().getResource(
                            fileName);
                }            JAXPConfigurator.configure(resourceURL.getFile(), false);
                Class.forName("org.logicalcobwebs.proxool.ProxoolDriver");
            } catch (ClassNotFoundException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (ProxoolException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            initialized = true;
        }
    }
      

  3.   

    proxool.xml内容
    <?xml version="1.0" encoding="UTF-8"?>
    <something-else-entirely>
      <proxool>
        <alias>Develop</alias>
        <driver-url>jdbc:oracle:thin:@(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.0.6)(PORT=1521)))(CONNECT_DATA=(SID=lzqdiy)(SERVER=DEDICATED)))
        </driver-url>
        <driver-class>oracle.jdbc.driver.OracleDriver</driver-class>
        <driver-properties>
          <property name="user" value="lzqdiy"/>
          <property name="password" value="lzqdiy"/>
        </driver-properties>
        <maximum-connection-count>120</maximum-connection-count>
        <minimum-connection-count>20</minimum-connection-count>
        <house-keeping-test-sql>select CURRENT_DATE</house-keeping-test-sql>
      </proxool>
    </something-else-entirely>http://java.chinaitlab.com/advance/719806.html
      

  4.   

    proxtool里的那个监控里,details:里的born就是表示可供使用的连接什么时候产生吧,我晚上10点多,看到born是22:10,last start那里是空的,这个时候应该是还没外来连接过来吧? 
    但我很快,都10点多了,很快就发现last start里有时间显示里,这个时候应该是有连接过来了吧?但业务专家分析,我们的系统,不大可能晚上也经常有连接过来的,我观察了周6,日,晚上也都是这个情况,不大符合逻辑,那个last start的含义其实是什么呢?