2017-12-22 13 views
1

を返す連続データベース操作が発生した場合すべてが正常に動作している DataSource.getConnectionメソッドは、ここでは、データベースの再起動後に、既に閉じた接続または理想的な時間切れ

DataSource dataSource = DataSourceBuilder.create().url(url).username(userName).password(password).driverClassName(dataSourceReader.getSqlServerDriverClassName()).build(); 
Connection connection = dataSource.getConnection(); 
System.out.println(connection.isClosed()); //Print false 

DataSourceからデータベース Connectionを取得するために私のコードです。 私のアプリケーションをある程度の時間(接続タイムアウト)で理想的にするか、データベースサーバを再起動して上記のコードを実行しようとすると、閉じた接続が得られ、 connection.isClosed()の出力は真です さらに、 connection例外以下をスローする

com.microsoft.sqlserver.jdbc.SQLServerException: The connection is closed. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:190) ~[sqljdbc4-4.0.jar!/:na] 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.checkClosed(SQLServerConnection.java:388) ~[sqljdbc4-4.0.jar!/:na] 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.prepareCall(SQLServerConnection.java:2176) ~[sqljdbc4-4.0.jar!/:na] 
    at com.microsoft.sqlserver.jdbc.SQLServerConnection.prepareCall(SQLServerConnection.java:1861) ~[sqljdbc4-4.0.jar!/:na] 
    at sun.reflect.GeneratedMethodAccessor148.invoke(Unknown Source) ~[na:na] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45] 
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:126) ~[tomcat-jdbc-8.5.6.jar!/:na] 
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:108) ~[tomcat-jdbc-8.5.6.jar!/:na] 
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:81) ~[tomcat-jdbc-8.5.6.jar!/:na] 
    at com.sun.proxy.$Proxy100.prepareCall(Unknown Source) ~[na:na] 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_45] 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_45] 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_45] 
    at java.lang.reflect.Method.invoke(Method.java:497) ~[na:1.8.0_45] 

驚いたことに、私のJavaアプリケーションを再起動しても、同じコードが正常に動作します。

このような状況に対処するための提案はありますか?

閉じた接続を再度開くことはできますか?

詳細:

  • Javaバージョン:1.8.0_25
  • アプリケーションサーバー:Microsoft SQL Serverの標準版(64ビット)バージョン10.50.1617.0
  • :春ブーツ
  • データベースとTomcatの8
  • データベースドライバ:com.microsoft.sqlserver:sqljdbc4:4.0'

答えて

0
堅牢であるために、あなたのアプリケーションがconneを処理するように設計されなければならない

エンタープライズ環境ではさまざまな理由で発生する可能性があるため、例外が発生する可能性があります。これを処理する1つの方法は、接続オブジェクトからSQL例外を単に捕捉し、成功するか、設定した再試行回数に達するまで接続を再試行することです。環境およびjdbcドライバまたはアプリケーション・サーバーが接続プーリングを実行しているかどうかによって、接続が失敗したときにプールがパージされるまで再試行する必要があります。再試行回数を任意の接続プールのサイズに制限して、無期限にループしないようにすることをお勧めします。

+0

私はdbcpの 'BasicDataSource'を使用しました。これは接続タイムアウトとデータベースの再起動後に動作します。私の問題を解決する –

関連する問題