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

标签 tomcat7 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");
    }   

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

最佳答案

这不是特定于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 DBCP BasicDataSource, the container will notice the close() method available on that object and automatically register it as the destroyMethod. 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/

相关文章:

java - Put 请求上的 HTTP 403 Forbidden Jersey

java - 无法在 spring 上下文中加载属性文件

mysql - Sonar Tomcat 安装失败

java - 在 CRaSH shell(Spring-boot 远程 shell)中过滤 Spring beans

java - 每个实体或表的 Hibernate_Sequence

java - 通过与 IIS 8.5 连接的 TomCat 管理器部署时出现 404 错误

java - Tomcat 7 到 8.5 升级 : getResourceAsStream throws NPE

java - 找不到接口(interface) org.springframework.data.domain.Pageable 的主构造函数或默认构造函数

Spring-boot 2.0.0 M1 - 执行器不工作

java - Spring Boot 服务层 : Unit or Integration tests?