2011-04-22 5 views
10

어제 AWS의 RDS가 내려갔습니다. Google 데이터베이스도 마찬가지였습니다.c3p0에 대한 getConnection() 시간 초과를 설정하는 방법은 무엇입니까?

이 경우 C3P0은 데이터베이스 연결을 시도하고 중단됩니다. 분명히 응답을 영원히 기다리지 않고 내 애플리케이션이 이러한 인스턴스에서 오류 페이지를 반환하는 것이 분명합니다.

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

방법 C3P0의 연결 풀에서 연결을 얻기위한 시간 제한을 설정할 수 있습니다

다음은 코드가 어떻게 생겼는지입니까?

나는 checkoutTimeout()이 될 것이라고 생각했지만 - 그렇지 않습니다. "getConnection()을 호출 한 클라이언트가 풀이 고갈되었을 때 Connection이 체크인 또는 획득 될 때까지 기다리는 시간 (밀리 초)입니다." 수영장은 소진되지 않았으므로 (단지 사용할 수 없음) 적용되지 않습니다.

setAcquireRetryAttempts 및 setAcquireIncrement도 작동한다고 생각했지만 연결에 실패하지 않았기 때문에 응답하지 않습니다. 이 포장 마차 곳

나는 전체 스택을 뽑아이다 : 나는 "socketRead0 타임 아웃"과 "socketRead0 요령"을 봤

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 

- 난 문제가 있지만 실제 솔루션을 많이 참조하십시오.

여기서 제한 시간을 적용 할 수있는 방법이 있습니까?

감사합니다.

답변

3

문제는 MySQL의 ReadAheadInputStream 내에서 차단 읽기를 사용합니다. 네이티브 소켓이 차단되었고 절대로 (?) 오류 코드가 반환됩니다. 그래서 연결이 끊어집니다.

코드를 스레드에 배치하고 타임 아웃을 사용하여 join()하는 것보다 짧은 방법을 다루지 않습니다. 나는 문제가 합병증을 정당화하지만 믿지 않는다 : 나는 아마존이 중단 시간으로부터 올바른 결론을 내리고 그것이 다시 일어나게하지 않기를 바란다.

1

글쎄, 연결 레벨에서 queryTimeout을 지정할 수 있습니다. IIRC, MySQL은 이것을 준수합니다. Dunno가 C3P0을 좋아한다면 좋겠지 만 작동 할 수도 있습니다.

관련 문제