c3p0关于mysql8小时的问题

jar包:c3p0-0.9.5-pre6.jar mchange-commons-java-0.2.6.3.jar
背景:以前在使用ORM框架的情况下,使用连接池没出现过空闲连接超时的问题,现在新建个项目没什么框架,使用c3p0,代码如下:
[code="java"]
private static ComboPooledDataSource ds = null;

static {
try {
ds = new ComboPooledDataSource();
ds.setDriverClass(Constant.DRIVER_CLASS_NAME);
ds.setJdbcUrl(Constant.URL);
ds.setUser(Constant.USERNAME);
ds.setPassword(Constant.PASSWORD);
ds.setMaxPoolSize(40);
ds.setMinPoolSize(5);
ds.setAutomaticTestTable("C3P0TestTable");
ds.setIdleConnectionTestPeriod(1800);
ds.setTestConnectionOnCheckin(true);
ds.setTestConnectionOnCheckout(true);
ds.setMaxIdleTime(25000);
} catch (PropertyVetoException e) {
gLog.error("ComboPooledDataSource", e);
}
}

public static synchronized Connection getConn() {
Connection con = null;
try {
con = ds.getConnection();
} catch (SQLException e1) {
gLog.error("getConn", e1);
}
return con;
}

[/code]
[color=red]有个线程用 getConn()获取连接后,长时间不进行数据库操作,隔天触发数据库操作时会报异常[/color]
[code="java"]
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:

** BEGIN NESTED EXCEPTION **

java.net.SocketException
MESSAGE: Software caused connection abort: socket write error

STACKTRACE:

java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65)
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123)
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2637)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1554)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3176)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1153)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1266)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:144)

** END NESTED EXCEPTION **

Last packet sent to the server was 0 ms ago.
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:2652)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1554)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1665)
at com.mysql.jdbc.Connection.execSQL(Connection.java:3176)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1153)
at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:1266)
at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:144)
[/code]
有个线程一直有进行数据库操作,则正常,因此判断是MYSQL8小时问题。但是代码里几个重要属性已经配置了,是否哪里还漏了,错了。
求教!

3个回答

修改mysql的配置文件,[url]http://www.2cto.com/database/201301/185712.html[/url]

xblueskyleng
xblueskyleng 我想我知道我的问题出在哪了,我的线程中,getconn是在while(true)的外面,所以8小时后还是会断掉。如果放在while里面,每次都getconn然后close释放应该就正常了
5 年多之前 回复
xblueskyleng
xblueskyleng c3p0有定时测试空闲连接的配置,这里的空闲连接,包含我已经获取了但是没触发数据库操作的连接吗?
5 年多之前 回复
zyn010101
zyn010101 你首先要对数据库连接池的原理有充分的了解:初始化一定数目的连接,需要的时候直接从连接池中取,避免创建连接释放连接的性能消耗,如果连接不够了则增加连接。连接池是认为里面的连接一直存在的,而mysql数据库在一个连接超时后就回收了。
5 年多之前 回复
xblueskyleng
xblueskyleng 解决这个问题的办法是可以通过数据库,也可以在线程中定时触发一下数据库,但是我想知道这C3P0问题出在哪。解决的方法倒是次要的。
5 年多之前 回复
zyn010101
zyn010101 用sql命令修改,暂时不用重启,等下次重启后修改配置文件。修改该参数不会影响数据库的数据和性能,不会产生其他影响的。
5 年多之前 回复
xblueskyleng
xblueskyleng 就是不想动MYSQL的配置文件,因为数据库要重启,而且改了这个参数,不知道是否会对其他人的程序的业务有影响。
5 年多之前 回复

c3p0应该有闲置多少时间把连接返库的配置吧

1、修改数据库配置
interactive_timeout=?
wait_timeout=?

2、c3p0在断开连接时,不能自动重连,所以不能保证连接池有连接。

3、建议使用proxool连接池。

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!