使用C3P0 链接池,一开始没有设置timeout,死锁不释放,造成程序卡死。
dataSource.setDriverClass("com.mysql.jdbc.Driver");
dataSource.setJdbcUrl(url);//设置连接数据库的URL
dataSource.setUser(user);//设置连接数据库的用户名
dataSource.setPassword(password);//设置连接数据库的密码
dataSource.setMaxPoolSize(20);//设置连接池的最大连接数
dataSource.setMinPoolSize(10);//设置连接池的最小连接数
dataSource.setInitialPoolSize(10);//设置连接池的初始连接数
dataSource.setMaxStatements(500);//设置连接池的缓存Statement的最大
dataSource.setCheckoutTimeout(20000);//当连接池用完时客户端调用getConnection()后等待获取新连接的时间,超时后将抛出SQLException,如设为0则无限期等待。单位毫秒。Default: 0
dataSource.setMaxIdleTime(3000); //最大空闲时间,1800秒内未使用则连接被丢弃。若为0则永不丢弃。Default: 0
1. 在程序中
A{
conn = getConnection,
calll B(conn)
{
getConnection()
call C()
{
getConection()
}
releaseConnection()
}
releaseConnection
}
在这种嵌套的调用中,conn还有传递
如果一个地方没有及时释放,最终导致死锁。 A要获取链接,没有,B在等待释放,A还在等着B返回,再释放链接。
使用的链接的正确方法
获取链接。立刻操作数据库,操作完数据库,立刻将链接释放。 不要一层层将链接往子函数里面传。
原则:
链接操作数据库,立刻释放。不要一直占着
数据库链接设置超时,超时自动释放