【问题标题】:Connection closes using JNDI in Tomcat在 Tomcat 中使用 JNDI 关闭连接
【发布时间】:2018-08-30 11:14:05
【问题描述】:

在 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)

我尝试用这个函数创建数据源:

@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 的配置都不是问题。

知道连接关闭的原因吗?

谢谢。

【问题讨论】:

  • 为什么要在数据源上调用getConnection()?也看看stackoverflow.com/questions/25149969/…
  • 我在您提供的任何地方都看不到这与打开连接有任何关系,该错误专门与数据源关闭有关。这可能表明它一开始就没有成功打开过。配置中的那个jndi名字看起来很奇怪,里面真的有空格吗?
  • 我打电话给getConnection,只是为了测试。如果连接关闭,Java 会抛出异常。

标签: java spring tomcat jndi


【解决方案1】:

我找到了解决方案。 就是用这条指令创建Bean

@Bean(name = "dataSource", destroyMethod = "")

问题在于 Spring 进行了取消部署,销毁 Bean 并关闭连接。为了避免这种情况,我必须更改 Spring 的默认行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-04-09
    • 1970-01-01
    • 2016-08-24
    • 2019-01-04
    • 2013-05-07
    • 1970-01-01
    • 2019-10-22
    • 1970-01-01
    相关资源
    最近更新 更多