繁体   English   中英

如何为c3p0设置getConnection()超时?

[英]How to set a getConnection() timeout for c3p0?

昨天AWS的RDS下降了 - 我们的数据库也是如此。

发生这种情况时,C3P0会尝试获取数据库连接并挂起。 我显然希望我的应用程序在这些实例中返回错误页面,而不是仅仅等待响应。

这是代码的样子:

ComboPooledDataSource db = new ComboPooledDataSource();
...
Connection conn = db.getConnection();

如何设置从c3p0的连接池获取连接的超时?

我以为checkoutTimeout()就是它 - 但事实并非如此。 它是“当池耗尽时,客户端调用getConnection()将等待连接被签入或获取的毫秒数。” 由于池没有用尽(它只是不可用),这不适用。

我还认为setAcquireRetryAttempts和setAcquireIncrement可以工作 - 但是它们不会因为连接没有失败,所以它只是没有响应。

当我拉动整个堆栈时,这就是它停止的地方:

SocketInputStream.socketRead0(FileDescriptor, byte[], int, int, int) line: not available [native method]    
SocketInputStream.read(byte[], int, int) line: 129  
ReadAheadInputStream.fill(int) line: 113    
ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(byte[], int, int) line: 160    
ReadAheadInputStream.read(byte[], int, int) line: 188   
MysqlIO.readFully(InputStream, byte[], int, int) line: 2428 
MysqlIO.reuseAndReadPacket(Buffer, int) line: 2882  
MysqlIO.reuseAndReadPacket(Buffer) line: 2871   
MysqlIO.checkErrorPacket(int) line: 3414    
MysqlIO.sendCommand(int, String, Buffer, boolean, String) line: 1936    
MysqlIO.sqlQueryDirect(StatementImpl, String, String, Buffer, int, int, int, boolean, String, Field[]) line: 2060   
JDBC4Connection(ConnectionImpl).execSQL(StatementImpl, String, int, Buffer, int, int, boolean, String, Field[], boolean) line: 2542 
JDBC4PreparedStatement(PreparedStatement).executeInternal(int, Buffer, boolean, boolean, Field[], boolean) line: 1734   
JDBC4PreparedStatement(PreparedStatement).executeQuery() line: 1885 
NewProxyPreparedStatement.executeQuery() line: 76   
C3P0PooledConnectionPoolManager.initializeAutomaticTestTable(String, DbAuth) line: 799  
C3P0PooledConnectionPoolManager.createPooledConnectionPool(DbAuth) line: 696    
C3P0PooledConnectionPoolManager.getPool(DbAuth) line: 257   
C3P0PooledConnectionPoolManager.getPool() line: 271 
ComboPooledDataSource(AbstractPoolBackedDataSource).getNumThreadsAwaitingCheckoutDefaultUser() line: 203    
NativeMethodAccessorImpl.invoke0(Method, Object, Object[]) line: not available [native method]  
NativeMethodAccessorImpl.invoke(Object, Object[]) line: 39  
DelegatingMethodAccessorImpl.invoke(Object, Object[]) line: 25  
Method.invoke(Object, Object...) line: 597  
BeansUtils.extractAccessiblePropertiesToMap(Map, Object, Collection) line: 359  
BeansUtils.appendPropNamesAndValues(StringBuffer, Object, Collection) line: 324 
ComboPooledDataSource.toString() line: 539  
ComboPooledDataSource(AbstractPoolBackedDataSource).getPoolManager() line: 462  
ComboPooledDataSource(AbstractPoolBackedDataSource).getConnection() line: 128   

当我搜索“socketRead0 timeout”和“socketRead0 hang”时 - 我看到很多问题,但没有真正的解决方案。

有没有办法在这里强制超时?

谢谢!

问题出在MySQL的ReadAheadInputStream中,它使用阻塞读取。 本机套接字被阻止,从不(?)返回错误代码。 所以连接也挂起了。

我没有看到一种方法来处理它,而不是将代码放入线程并使用超时join()。 我不相信这个问题可以证明并发症:我希望亚马逊能够从停机时间得出正确的结论,并且不会让它再次发生。

好吧,您可以在连接级别分配queryTimeout。 IIRC,MySQL确实遵守这一点。 Dunno如果C3P0会喜欢它,但它可能会奏效。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM