数据库重新启动或理想超时后,DataSource.getConnection方法返回已关闭的连接

时间:2017-12-22 06:45:44

标签: java sql-server spring jdbc datasource

以下是从Connection

获取数据库DataSource的代码
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

如果连续数据库操作发生,一切正常。 如果我把我的应用程序理想一段时间(连接超时)或我重新启动我的数据库服务器并尝试执行相同的上述代码,我得到关闭连接并且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
  • Application Server:带Spring Boot的Tomcat 8
  • 数据库:Microsoft SQL Server标准版(64位)版本10.50.1617.0
  • 数据库驱动程序:com.microsoft.sqlserver:sqljdbc4:4.0'

1 个答案:

答案 0 :(得分:0)

为了保持健壮,您的应用程序应该设计为处理连接异常,因为它们可以(并且确实)在企业环境中出于多种原因而发生。处理此问题的一种方法是简单地从连接对象中捕获sql异常并尝试再次建立连接,直到您成功或者您已达到某个已设置的重试限制。根据环境以及jdbc驱动程序或应用程序服务器是否正在执行连接池,您可能需要重试,直到池清除自身连接失败。您可能希望将重试次数限制为任何连接池的大小,这样您就无法无限循环。