nos*_*omo 10 java timeout jdbc c3p0 amazon-rds
昨天AWS的RDS下降了 - 我们的数据库也是如此.
发生这种情况时,C3P0会尝试获取数据库连接并挂起.我显然希望我的应用程序在这些实例中返回错误页面,而不是仅仅等待响应.
这是代码的样子:
ComboPooledDataSource db = new ComboPooledDataSource();
...
Connection conn = db.getConnection();
Run Code Online (Sandbox Code Playgroud)
如何设置从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
Run Code Online (Sandbox Code Playgroud)
当我搜索"socketRead0 timeout"和"socketRead0 hang"时 - 我看到很多问题,但没有真正的解决方案.
有没有办法在这里强制超时?
谢谢!
问题出在 MySQL 的 ReadAheadInputStream 中,它使用阻塞读取。本机套接字被阻止并且从不(?)返回错误代码。所以连接也挂起。
除了将代码放入线程中并在超时的情况下 join() 到它之外,我没有找到处理它的方法。我不认为这个问题可以证明复杂性是合理的:我希望亚马逊能够从停机中得出正确的结论,并且不会让这种情况再次发生。
| 归档时间: |
|
| 查看次数: |
3256 次 |
| 最近记录: |