DataSource.getConnection method returns an already closed connection after database restart or ideal timeout(DataSource.getConnection方法在数据库重新启动或理想超时后返回已关闭的连接)
问题描述
以下是我从DataSource
Connection
的代码
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
执行任何操作,它都会抛出以下异常
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
- 应用服务器:带有Spring Boot的Tomcat 8
- 数据库:Microsoft SQL Server Standard Edition(64位)版本10.50.1617.0
- 数据库驱动程序:
com.microsoft.sqlserver:sqljdbc4:4.0'
推荐答案
要保持健壮,您的应用程序应该设计为处理连接异常,因为它们在企业环境中可能(并且确实)会因多种原因而发生。处理此问题的一种方法是简单地从Connection对象捕获SQL异常,并尝试再次连接,直到成功或达到您设置的某个重试限制。根据环境以及JDBC驱动程序或应用程序服务器是否正在执行连接池,您可能需要重试,直到池自行清除失败的连接。您可能希望将重试次数限制为任何连接池的大小,以便不会无限循环。
这篇关于DataSource.getConnection方法在数据库重新启动或理想超时后返回已关闭的连接的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:DataSource.getConnection方法在数据库重新启动或理想超时后返回已关闭的连接
基础教程推荐
- 在螺旋中写一个字符串 2022-01-01
- Java 中保存最后 N 个元素的大小受限队列 2022-01-01
- 首次使用 Hadoop,MapReduce Job 不运行 Reduce Phase 2022-01-01
- 如何使用 Stream 在集合中拆分奇数和偶数以及两者的总和 2022-01-01
- 如何在不安装整个 WTP 包的情况下将 Tomcat 8 添加到 Eclipse Kepler 2022-01-01
- Spring Boot Freemarker从2.2.0升级失败 2022-01-01
- 由于对所需库 rt.jar 的限制,对类的访问限制? 2022-01-01
- 如何对 HashSet 进行排序? 2022-01-01
- 如何强制对超级方法进行多态调用? 2022-01-01
- 如何使用 Eclipse 检查调试符号状态? 2022-01-01