2014-04-03 2 views
1

C3P0 연결 풀이있는 최대 절전 모드를 사용하는 Java EE JSF 응용 프로그램에서 작업하고 있습니다. 나는 가능하고 불가능한 것을 찾아 내려고 노력했으며 많은 것을 시도했지만 couldnt은 이것을 알아 낸다.Java EE에서 Hibernate, C3P0을 사용하여 데이터베이스 연결을 처리하는 방법은 무엇입니까?

문제는 데이터베이스 연결이 실패한 경우입니다 (예 : 데이터베이스가 종료 된 경우). 사용자 인터페이스에서 오류 상태를 표시하는 데 사용할 수있는 ecfeption을 잡는 방법을 찾지 못했습니다. 내가 할 수있는 유일한 방법은 콘솔에서 몇 가지 예외 볼 수 있습니다 :

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. 
    at sun.reflect.GeneratedConstructorAccessor408.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.Util.getInstance(Util.java:386) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1015) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:989) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:975) 
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:920) 
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2404) 
    at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2325) 
    at com.mysql.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:834) 
    at com.mysql.jdbc.JDBC4Connection.<init>(JDBC4Connection.java:46) 
    at sun.reflect.GeneratedConstructorAccessor407.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:416) 
    at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:347) 
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:146) 
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:195) 
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:184) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:200) 
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1086) 
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquireAndDecrementPendingAcquiresWithinLockOnSuccess(BasicResourcePool.java:1073) 
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:44) 
    at com.mchange.v2.resourcepool.BasicResourcePool$ScatteredAcquireTask.run(BasicResourcePool.java:1810) 
    at com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:648) 
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure 
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. 
    at sun.reflect.GeneratedConstructorAccessor404.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:526) 
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1129) 
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:358) 
    at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2498) 
    at com.mysql.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:2343) 
    ... 18 more 
Caused by: java.net.ConnectException: Connection timed out: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:339) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:200) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:182) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:579) 
    at java.net.Socket.connect(Socket.java:528) 
    at java.net.Socket.<init>(Socket.java:425) 
    at java.net.Socket.<init>(Socket.java:241) 
    at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:256) 
    at com.mysql.jdbc.MysqlIO.<init>(MysqlIO.java:308) 
    ... 20 more 
]] 

을하지만이, 그냥 콘솔에서의 잡을 수없고 심지어 클라이언트 스레드는 예외를 수신하지 않습니다 (웹 브라우저 응답 인쇄 아니에요, 그것은 무한대에 대한 페이지를로드하는 동안 매달려 있습니다).

c3p0.testConnectionOnCheckout=true 
c3p0.idleConnectionTestPeriod=60 
c3p0.acquireIncrement=1 
c3p0.preferredTestQuery=SELECT 1 
c3p0.acquireRetryAttempts=1 

내 질문은 : 사용자 친화적 인 방법으로 실패 어떻게 데이터베이스 연결의 경우를 처리하기 위해 내 C3P0 구성은 다음

입니까?

+0

연결 문제 또는 유사한 오류 메시지가 표시됩니다. –

+0

클라이언트 스레드가받는 예외는 무엇입니까? 아니면 단순히 교수형입니까? 쓰레드가 데이터베이스 작업을하려고 할 때 무슨 일이 일어나고 있는가? –

+0

스티브 : 문제가 있습니다. 클라이언트 스레드는 예외를받지 않습니다. 그냥 교수형이야. 데이터베이스에서 작동하는 스레드는 질문에 게시 한 예외를 throw합니다. – James

답변

2

확인, 작업의 며칠 후 나는 해결책을 건설했다.

문제는 단지 전형적인 Hibernate 세션은 데이터베이스가 연결되지 않은 상태에서 그것을 사용하면서 어떤 예외도 던지지 않았다는 것이었다.

Properties p = hibernateConnection.getCfg().getProperties(); 

String url = p.getProperty("hibernate.connection.url"); 
String user = p.getProperty("hibernate.connection.username"); 
String password = p.getProperty("hibernate.connection.password"); 

DriverManager.getConnection(url, user, password).close(); 

가 그래서, 간단한 시도 - 캐치 사용할 수 있습니다하지만이 코드 조각은 데이터베이스가 연결되어 있지 않을 때 (그래서이 테스트로 사용할 수 있습니다) 예외를 발생한다. 예외가 잡히면 연결이 끊어집니다.

데이터베이스 연결을 정기적으로 확인하는 데 사용했습니다. 응용 프로그램을 배포 할 때마다 TimerTask이 1 분마다 실행되도록 예약됩니다. 예외를 잡으면 정적 변수 dbAvailable을 false로 설정하고 (그렇지 않으면 true로 설정합니다.) 이 변수는 모든 HTTP 클라이언트 요청에서 검사되고 true이면 오류 503이 다시 전송됩니다.

타이머 예약을 위해 ServletContextListener을 사용했습니다. 질문에 언급 된 C3P0 구성.

+0

매우 유용합니다! 고마워요. – Niranjan

관련 문제