我有一个具有数据源的应用程序。每次我从管理器GUI取消部署应用程序时,数据源都会关闭。当我尝试重新部署时,数据源保持关闭状态并引发以下异常:
{
"status" : "DOWN",
"error" : "org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Data source is closed"
}
Caused by: java.sql.SQLException: Data source is closed
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.createDataSource(BasicDataSource.java:1362) ~[tomcat-dbcp.jar:7.0.53]
at org.apache.tomcat.dbcp.dbcp.BasicDataSource.getConnection(BasicDataSource.java:1044) ~[tomcat-dbcp.jar:7.0.53]
at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:139) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final]
at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:380) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final]
at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:228) ~[hibernate-core-4.3.1.Final.jar:4.3.1.Final]
... 81 common frames omitted
重新启动服务器可以解决此问题,但这不是生产应用程序可接受的解决方案。
我有一个具有相同问题的不同数据源的不同应用程序。
两个应用程序都使用带有Tomcat 7的Spring Boot版本1.1.4。其中一个应用程序已转换为Spring Boot,并且在转换之前没有数据源问题。
下面是我如何在Spring Boot Application.java文件中当前创建数据源的方法。
@Bean()
public DataSource dataSource() {
return new JndiDataSourceLookup().getDataSource("com.datasource.CONSUMER");
}
我该如何阻止这种情况的发生?
最佳答案
这不是特定于Spring Boot的,而是标准的Spring行为。
默认情况下,Spring会推断出bean的destroy方法。从javadoc for @Bean
:
As a convenience to the user, the container will attempt to infer a destroy method against an object returned from the
@Bean
method. For example, given an@Bean
method returning an Apache Commons DBCPBasicDataSource
, the container will notice theclose()
method available on that object and automatically register it as thedestroyMethod
. This 'destroy method inference' is currently limited to detecting only public, no-arg methods named 'close' or 'shutdown'.
Javadoc继续描述如何禁用此行为:
To disable destroy method inference for a particular
@Bean
, specify an empty string as the value, e.g.@Bean(destroyMethod="")
您需要更新
dataSource()
方法:@Bean(destroyMethod="")
public DataSource dataSource() {
return new JndiDataSourceLookup().getDataSource("com.datasource.CONSUMER");
}
关于tomcat7 - 为什么使用Spring Boot在Tomcat 7取消部署时关闭数据源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25149969/