小编典典

为什么使用Spring Boot在Tomcat 7取消部署时关闭数据源

spring-boot

我有一个具有数据源的应用程序。每次我从管理器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");
    }

如何阻止这种情况的发生?


阅读 393

收藏
2020-05-30

共1个答案

小编典典

这不是特定于Spring Boot,而是标准的Spring行为。

默认情况下,Spring将推断bean的destroy方法。从javadoc中获取@Bean

为了方便用户,容器将尝试针对从该@Bean方法返回的对象推断一个destroy 方法。例如,给定一个@Bean返回Apache Commons
DBCP
BasicDataSourceclose()方法,容器将注意到该对象上可用的方法并将其自动注册为destroyMethod。目前,这种“销毁方法推论”仅限于仅检测名为“
close”或“ shutdown”的公共无参数方法。

Javadoc继续描述了如何禁用此行为:

要禁用特定的destroy方法推断@Bean,请指定一个空字符串作为值,例如@Bean(destroyMethod="")

您需要更新您的dataSource()方法:

@Bean(destroyMethod="")
public DataSource dataSource() {
    return new JndiDataSourceLookup().getDataSource("com.datasource.CONSUMER");
}
2020-05-30