论坛首页 Java版

c3p0的最大空闲时间为什么不起作用。(新dbcp问题)

浏览 979 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
时间:2007-10-18 关键字: c3p0
请看6楼的,现在是dbcp的问题,谢谢
public class Test_c3p0 {

	public static void main(String[] args) throws Exception {
		Test_c3p0 c3p0=new Test_c3p0();
		Connection conn=c3p0.getConn();
		Statement stmt=conn.createStatement();
		String strSql="select count(0) from suggest";
		ResultSet rs=stmt.executeQuery(strSql);
		System.out.println(1);
		if(rs!=null&&rs.next())
			System.out.println(rs.getString(1));
		rs.close();
		
		System.in.read();//我在这里等了一会儿,大约十几秒
		
		System.out.println(2);
		ResultSet rs2=stmt.executeQuery(strSql);//十几秒后到这里,是不是就应该出异常了,因为已经超过最大空闲时间了
		if(rs2!=null&&rs2.next())
			System.out.println(rs2.getString(1));
	}
	
	private Connection getConn() throws Exception{
		ComboPooledDataSource dataSource=new ComboPooledDataSource();
		//数据库驱动
		dataSource.setDriverClass("com.mysql.jdbc.Driver");
		//url
		dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1/search?useUnicode=true&characterEncoding=GBK");
		//user
		dataSource.setUser("root");
		//password
		dataSource.setPassword("");
		//最小连接数
		dataSource.setMinPoolSize(3);
		//最大连接数
		dataSource.setMaxPoolSize(30);
		//初始化时获取的连接数,介于minPoolSize和maxPoolSize之间
		dataSource.setInitialPoolSize(3);
		//当前连接数耗尽时一次获取的连接数
		dataSource.setAcquireIncrement(3);
		//最大空闲时间,空闲的连接过时后会被回收
		dataSource.setMaxIdleTime(9);
		
		return dataSource.getConnection();
	}
}


在getConn这个方法里设置了连接最大空闲时间是9秒:dataSource.setMaxIdleTime(9);
在main里共用了两次连接对象,第一次和第二次之间相差有十几秒,可是这个连接没有因为超过了最大空闲时间被断开,第二次还是可以照常使用连接对象。

请指点。
   
时间:2007-10-19
加上dataSource.setIdleConnectionTestPeriod(3);也不行.
   
0 请登录后投票
时间:2007-10-19
配置文件里加上这句
<property name="maxIdleTime"><value>1800</value></property>
   
0 请登录后投票
时间:2007-10-19
和dataSource.setMaxIdleTime(9); 不是一样吗?
   
0 请登录后投票
时间:2007-10-19
idletime说的是池里未被使用的连接的存在时间。不会检查已经被获取的连接。
   
0 请登录后投票
时间:2007-10-20
后来才发现当活动连接数将接近池最大连接数的时候才会自动回收那些超过最大空闲时间的连接...

其实也不是自动去回收,而是有新连接请求的时候才去尝试回收那些空闲的连接,也就是说只要还没有接近最大连接数,即使有连接超时了dbcp也不会去回收它.

但现在又有新问题了,如果短时间内活动连接数达到上限,再也取不出新连接,也就触发不了dbcp去回收那些
空闲的连接,再继续请求时就是报错了.

dbcp有没有自动的去回收空闲连接的功能?

我看到timeBetweenEvictionRunsMillis,minEvictableIdleTimeMillis这两个参数,网上有人这样解释这两个参数:

当timeBetweenEvictionRunsMillis 大于0时,每过timeBetweenEvictionRunsMillis 时间,就会启动一个线程,校验连接池中闲置时间超过minEvictableIdleTimeMillis的连接对象。

我设置了这两个参数还是不能解决池连接数短时间达到上限后,请求新连接报错的问题..
   
0 请登录后投票
论坛首页 Java版

跳转论坛: