打开mysql配置界面可以配置最大连接数。假如我配置的是600,
然后打开hibernate配置c3p0最大连接数为80
那么程序到底听谁的?
为什么?
还有当我用下面的测试代码测试连接池的时候(不断的打开connection 但是不关闭)for(int i=0;i<500000;i++)
{
System.out.println(i);
Connection conn = null;
try 
{
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/hibblog", "root" , "110119");
conn.setAutoCommit(false);
System.out.println("成功打开第"+i+"个conection!");
conn.commit();


catch (ClassNotFoundException e)
{
e.printStackTrace();

catch (Exception e) {
e.printStackTrace();
}
}
上述测试代码的现象是:每隔700—1000会卡一下,之后继续能得到connection 不抛异常不报错,能得到成千上万个!
不知道为什么?怎么解释?
第二个实验在hibernate的容器下进行,配置了连接池最大连接数为58代码如下:for(int i=1;i<500000;i++)
{
Session ss=sessionFactory.openSession();
org.hibernate.Transaction tx=ss.beginTransaction();
System.out.println("成功打开第"+i+"个conection!");
tx.commit();
}
这端代码的现象是很显然的,就是打开58个连接就卡主了。
小弟对这些玩意原理一直不是很清楚。只是能得到这个现象不知道怎么解释?

解决方案 »

  1.   

    1. MySQL的最大连接数是指数据库的最大连接数. 
    2. 程序c3p0的连接数只是他的连接池最大的连接数. 从程序角度来说, 如果c3p0的连接数是80, mysql的连接数是300, 那么只能说mysql不会中断, 就算是c3p0的连接数已经达到最大.
    你说的情况, 还是在测试c3p0的连接数, 而不是mysql的连接数. 简而言之, 程序中, 你用的是c3p0的连接数, 通常情况下, mysql的连接数应该大于c3p0的连接数. 
    如果你要测试mysql的连接数, 那就应该把c3p0的连接数调整为大于mysql的连接数.
      

  2.   

    MySQL 是一条河,而 c3p0 是河边的某一个蓄水池,一条河可以有多个蓄水池。一般情况下,池子不会比河大,当然你非得修一个比河大的蓄水池,也没人管你,不过河里的水供应不上而已。
      

  3.   

    1楼兄弟说的非常对
    你要注意c3p0的连接数一定要小于mysql的连接数
    测试时他们之间的差值最好不要在10以内
      

  4.   


    恩 我已经有点懂了“数据库的最大连接数”跟“连接池最大的连接数”。
    谢谢你,还有老紫竹的生动的比喻 嘿嘿
    但是对于第一个测试代码,他并没有在配置任何连接池,纯天然绿色jdbc,
    每隔700—1000会卡一下,之后继续能得到connection 不抛异常不报错,能得到很多connection
    这个该怎么解释啊?