10

昨日、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   

「socketRead0timeout」と「socketRead0hang」をグーグルで検索すると、多くの問題が発生しましたが、実際の解決策はありません。

ここでタイムアウト期間を強制する方法はありますか?

ありがとう!

4

2 に答える 2

3

この問題は、ブロッキング読み取りを使用するMySQLのReadAheadInputStream内にあります。ネイティブソケットがブロックされ、never(?)がエラーコードを返します。そのため、接続もハングします。

コードをスレッドに配置し、タイムアウトでそれにjoin()する以外に、それを処理する方法がわかりません。問題が複雑さを正当化するものの、私は信じていません。Amazonがダウンタイムから正しい結論を出し、それが二度と起こらないようになることを願っています。

于 2011-04-23T03:00:34.107 に答える
1

そうですね、接続レベルでqueryTimeoutを割り当てることができます。IIRC、MySQLはこれに従います。C3P0が気に入るなら、Dunnoですが、うまくいくかもしれません。

于 2011-04-23T18:34:34.107 に答える