java - 在 Tomcat 中使用 JNDI 关闭连接
问题描述
在 Tomcat 9 和 JDK 1.8 下运行,使用 Spring 5,我正在尝试配置 JNDI 连接以获取数据源。
如果我通过 XML 配置 Spring,我会得到我的 DataSource,并且一切似乎都工作正常。我以这种方式在 applicationContext.xml 中配置了 DataSource:
<jee: jndi-lookup id = "dataSource" jndi-name = "jdbc / yages"
resource-ref = "true" />
当我使用 AbstractAnnotationConfigDispatcherServletInitializer 类初始化 Spring 时,我的 DataSource 被创建,但是当我尝试捕获连接时,它给了我以下错误:
java.sql.SQLException:数据源在 org.apache.tomcat.dbcp.dbcp2.BasicDataSource.createDataSource 关闭(BasicDataSource.java:2049)
我尝试使用此函数创建 DataSource:
@Bean (name = "dataSource")
public DataSource dataSource (Environment env) throws NamingException
{
DataSource datasource = null;
try {
JndiDataSourceLookup lookup = new JndiDataSourceLookup ();
datasource = lookup.getDataSource ("jdbc/yages");
datasource.getConnection ();
return datasource;
} catch (SQLException ex) {
ex.printStackTrace ();
}
return datasource;
}
似乎 DataSource 已正确创建,但与数据库的连接似乎已关闭。但是,如果我使用 DataSource,通过 XML 配置它,它对我来说效果很好,这就是为什么我认为与数据库的连接和 Tomcat 的配置都不是问题。
知道为什么连接关闭了吗?
谢谢你。
解决方案
我找到了解决方案。就是用这个指令创建 Bean
@Bean(name = "dataSource", destroyMethod = "")
问题是 Spring 进行取消部署,销毁 Bean 并关闭连接。为避免这种情况,我必须更改 Spring 的默认行为。
推荐阅读
- reactjs - 为什么即使在playing={false}时react-player也在播放视频?
- wordpress - 使用来自 Gatsby 的元查询查询 wordpress
- python - 如何使用apache-beam连接Oracle并查询数据
- java - 如何为数据框中的每条记录调用特定方法?
- sql - 基于行值的条件连接
- c - 将文件中的单词读入动态二维数组
- regex - 在 JMeter 中使用正则表达式提取器时的特殊(元)字符
- angular - 意外值中的错误'SomeModule in C:/Users/... 请添加 @NgModule 注释
- python-3.x - Azure selenium 管道凭据失败
- javascript - React Hook useEffect 缺少带有 redux 函数的依赖道具