我有一个具有数据源的应用程序。每次我从管理器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中获取@Bean:
@Bean
为了方便用户,容器将尝试针对从该@Bean方法返回的对象推断一个destroy 方法。例如,给定一个@Bean返回Apache Commons DBCP BasicDataSource的close()方法,容器将注意到该对象上可用的方法并将其自动注册为destroyMethod。目前,这种“销毁方法推论”仅限于仅检测名为“ close”或“ shutdown”的公共无参数方法。
BasicDataSource
close()
destroyMethod
Javadoc继续描述了如何禁用此行为:
要禁用特定的destroy方法推断@Bean,请指定一个空字符串作为值,例如@Bean(destroyMethod="")
@Bean(destroyMethod="")
您需要更新您的dataSource()方法:
dataSource()
@Bean(destroyMethod="") public DataSource dataSource() { return new JndiDataSourceLookup().getDataSource("com.datasource.CONSUMER"); }