2017-07-15 80 views
0

我在我的項目中使用了Spring數據jpa。我想處理一些異常,如SQLNonTransientConnectionException,並將其展開以顯示適當的消息。在下面的堆棧跟蹤中,沒有任何類指向我的代碼。如何在彈簧數據中處理SQLNonTransientConnectionException和其他DAO異常jpa

15-Jul-2017 23:12:00.900 WARNING [Task-[email protected]411e79f0] com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run [email protected]77 -- Acquisition Attempt Failed!!! Clearing pending acquires. While trying to acquire a needed new resource, we failed to succeed more than the maximum number of allowed acquisition attempts (30). Last acquisition attempt exception: 
java.sql.SQLNonTransientConnectionException: Could not create connection to database server. Attempted reconnect 3 times. Giving up. 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:526) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:513) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:505) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:479) 
    at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:489) 
    at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:1677) 
    at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:1601) 
    at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:633) 
    at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:347) 
    at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:219) 
    at com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134) 
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182) 
    at com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171) 
    at com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137) 
    at com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014) 
    at com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32) 
    at com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810) 
    at com.mchange.v2.async.ThreadPerTaskAsynchronousRunner$TaskThread.run(ThreadPerTaskAsynchronousRunner.java:255) 
Caused by: com.mysql.cj.core.exceptions.CJCommunicationsException: 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.GeneratedConstructorAccessor88.newInstance(Unknown Source) 
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) 
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) 
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:54) 
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:93) 
    at com.mysql.cj.core.exceptions.ExceptionFactory.createException(ExceptionFactory.java:133) 
    at com.mysql.cj.core.exceptions.ExceptionFactory.createCommunicationsException(ExceptionFactory.java:149) 
    at com.mysql.cj.mysqla.io.MysqlaSocketConnection.connect(MysqlaSocketConnection.java:83) 
    at com.mysql.cj.mysqla.MysqlaSession.connect(MysqlaSession.java:122) 
    at com.mysql.cj.jdbc.ConnectionImpl.connectWithRetries(ConnectionImpl.java:1619) 
    ... 12 more 
Caused by: java.net.ConnectException: Connection refused: connect 
    at java.net.DualStackPlainSocketImpl.connect0(Native Method) 
    at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:79) 
    at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 
    at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
    at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
    at java.net.Socket.connect(Socket.java:589) 
    at com.mysql.cj.core.io.StandardSocketFactory.connect(StandardSocketFactory.java:202) 
    at com.mysql.cj.mysqla.io.MysqlaSocketConnection.connect(MysqlaSocketConnection.java:57) 
    ... 14 more 

回答

0

SQLNonTransientConnectionException這是子類型的SQLException,它的檢查excecption。 如果你知道它可能來的地方,你可以添加try catch塊。 如果你想捕獲任何sqlException,你可以使用AOP(AfterThrowing如果你只需要記錄它,並且如果你需要包裝異常並重新拋出)

@Aspect 
@Component 
public class ExceptionAdvice { 

    @AfterThrowing(pointcut = "execution(* *.*(..))",throwing = "e") 
    public void catchIfSqlException(JoinPoint joinPoint, SQLException e) {  
     if(e instanceOf SQLNonTransientConnectionException){ 
      .... 
     } 
     if(e instanceof){ 
      ..... 
     } 
    } 

    @Around(pointcut = "execution(* *.*(..))") 
    public void executeAndWrapSqlExceptionIfOccure(ProceedingJoinPoint pjp) 
                  throws Throwable { 
     try { 
      pjp.proceed(); 
     } catch (Throwable exception) { 
      if(e instanceOf SQLNonTransientConnectionException){ 
       .... wrap and re-throw 
      } 
      if(e instanceof){ 
       ..... 
      } 
     } 
    } 
}