嵌入式tomcat上的JDBC连接问题

Posted

技术标签:

【中文标题】嵌入式tomcat上的JDBC连接问题【英文标题】:JDBC Connection issue on embedded tomcat 【发布时间】:2015-12-01 06:47:22 【问题描述】:

在我的 Spring Boot 应用程序中,我正在使用 org.apache.tomcat.jdbc.pool.DataSource 创建一个数据源。我正在使用嵌入式tomcat。以下是我设置的一些属性

myDS.setDriverClassName(driverClassName);
myDS.setUrl(databaseURL);
myDS.setUsername(databaseUserId);
myDS.setTestWhileIdle(false);
myDS.setTestOnBorrow(true);
myDS.setValidationQuery("SELECT 1");
myDS.setTestOnReturn(false);
myDS.setValidationInterval(30000);
myDS.setTimeBetweenEvictionRunsMillis(30000);
myDS.setMaxActive(100);
myDS.setInitialSize(10);
myDS.setMaxWait(10000);
myDS.setRemoveAbandonedTimeout(60);
myDS.setMinEvictableIdleTimeMillis(30000);
myDS.setMinIdle(10);
myDS.setLogAbandoned(true);
myDS.setRemoveAbandoned(true);

我在两个具有原型作用域的 spring bean 中使用了这个 ds 对象。当我使用第一个使用第一个 spring bean 应用程序的功能时,它工作正常。然后我点击使用相同 ds 对象的第二个功能然后我得到以下错误

org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Failed to validate a newly established connection.

在我的代码内部,我使用 jdbcTemplate 进行数据库操作。我尝试使用destroy方法,但它不起作用

@Bean(destroyMethod="") 公共数据源 appDS()

请推荐

【问题讨论】:

你用的是什么数据库? 你为什么不使用 spring.datasource 命名空间。它会自动完成所有这些操作。 我更改了验证查询,它开始正常工作。我的问题是为什么我在嵌入式 tomcat 上会收到此错误,为什么在外部或独立 tomcat 上却没有 我正在使用 DB2 数据库,将验证查询更改为 SELECT current date FROM sysibm.sysdummy1 【参考方案1】:

由于我使用的是 DB2 数据库,因此我将验证查询更改如下,它开始工作

从 sysibm.sysdummy1 中选择当前日期

注意 - 对于相同的配置,嵌入式 Tomcat 和独立 Tomcat 的行为是不同的。在独立的 tomcat 上,您不会收到无效验证查询的异常。外部tomcat版本7

【讨论】:

以上是关于嵌入式tomcat上的JDBC连接问题的主要内容,如果未能解决你的问题,请参考以下文章

将 JDBC 连接池与嵌入式数据库一起使用有啥好处?

Tomcat JDBC MySQL ClassNotFoundException

以编程方式将数据源添加到嵌入式 tomcat 7 中的 JNDI 上下文

带有球衣的嵌入式 tomcat 上的 java.net.SocketTimeoutException

如何在 spring-boot 中拦截嵌入式 Tomcat 上的“全局”404

在 Spring Boot 中的多个连接器之间共享嵌入式 Tomcat 执行器