详细错误信息如下:
org.springframework.jdbc.datasource.DataSourceUtils -564890472 [DefaultQuartzScheduler_Worker-2] ERROR org.springframework.jdbc.datasource.DataSourceUtils - Could not close JDBC Connection
java.sql.SQLException: Already closed.
at org.apache.tomcat.dbcp.dbcp.PoolableConnection.close(PoolableConnection.java:114)
at org.apache.tomcat.dbcp.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:191)
at org.springframework.jdbc.datasource.DataSourceUtils.doReleaseConnection(DataSourceUtils.java:286)
at org.springframework.jdbc.datasource.DataSourceUtils.releaseConnection(DataSourceUtils.java:247)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:292)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:348)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:352)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:356)
at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:387)
at cn.sh.ideal.sendsms.dao.TimingSendSmsDao.getAllSmsReceive(TimingSendSmsDao.java:127)
at cn.sh.ideal.sendsms.service.TimingSendSmsService.timingSendSmsDay(TimingSendSmsService.java:117)
at cn.sh.ideal.sendsms.job.TimingSendSmsJob.timingSendSms(TimingSendSmsJob.java:49)
at sun.reflect.GeneratedMethodAccessor84.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:248)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:165)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:90)
at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:549)
[secs] 2012-11-15 04:15:30,746 - cn.sh.ideal.sendsms.job.TimingSendSmsJob -564890473 [DefaultQuartzScheduler_Worker-2] ERROR cn.sh.ideal.sendsms.job.TimingSendSmsJob - (两小时执行一次)定时短信发送异常:
org.springframework.dao.DataAccessResourceFailureException: StatementCallback; SQL [SELECT T.MOBILE mobile FROM T_REPORT_SMS_SET T]; Io 异常: Connection timed out; nested exception is java.sql.SQLException: Io 异常: Connection timed out
java.sql.SQLException: Io 异常: Connection timed out
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:112)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:146)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:255)
at oracle.jdbc.driver.T4CStatement.executeForDescribe(T4CStatement.java:817)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1039)
at oracle.jdbc.driver.T4CStatement.executeMaybeDescribe(T4CStatement.java:841)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1134)
at oracle.jdbc.driver.OracleStatement.executeQuery(OracleStatement.java:1274)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at org.apache.tomcat.dbcp.dbcp.DelegatingStatement.executeQuery(DelegatingStatement.java:208)
at org.springframework.jdbc.core.JdbcTemplate$1QueryStatementCallback.doInStatement(JdbcTemplate.java:333)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:282)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:348)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:352)
at org.springframework.jdbc.core.JdbcTemplate.query(JdbcTemplate.java:356)
at org.springframework.jdbc.core.JdbcTemplate.queryForList(JdbcTemplate.java:387)
at cn.sh.ideal.sendsms.dao.TimingSendSmsDao.getAllSmsReceive(TimingSendSmsDao.java:127)
at cn.sh.ideal.sendsms.service.TimingSendSmsService.timingSendSmsDay(TimingSendSmsService.java:117)
at cn.sh.ideal.sendsms.job.TimingSendSmsJob.timingSendSms(TimingSendSmsJob.java:49)
at sun.reflect.GeneratedMethodAccessor84.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.util.MethodInvoker.invoke(MethodInvoker.java:248)
at org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean$MethodInvokingJob.executeInternal(MethodInvokingJobDetailFactoryBean.java:165)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:90)
at org.quartz.core.JobRunShell.run(JobRunShell.java:216)
原因:
数据源出现长时间没有使用中断后。出现Could not close JDBC Connection这种问题。
解决方案:
将testOnBorrow设置为true而validationQuery没有设置,或为空,或你给的不是一个select语句且没有数据返回。testOnBorrow也是白设。validationQuery这个的SQL语句一般查询dual表.常用的有SELECT 1 FROM DUA
修改后的tomcat JNDI配置如下:
<?xml version='1.0' encoding='utf-8'?>
<Context allowLinking="true">
<WatchedResource>WEB-INF/web.xml</WatchedResource>
<Resource name="jdbc/tx" auth="Container" type="javax.sql.DataSource"
username="xxx"
password="xxx"
driverClassName="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@xxx.xx.xx.xx:1521:xx"
maxActive="500"
maxIdle="10"
maxWait="120000"
validationQuery="SELECT 1 FROM DUAL"
/>
</Context>
结论:
正式系统中使用的数据源最好是用上这个testOnBorrow+validationQuery。这样可以保证使用的每个数据源都不会出现长时间没有使用中断后。出现Could not close JDBC Connection这种问题。
分享到:
相关推荐
在Spring配置文件中,可以通过`org.springframework.jndi.JndiObjectFactoryBean`类来定义一个数据源。例如: ```xml <bean id="sysDB" class="org.springframework.jndi.JndiObjectFactoryBean"> ...
2. 引入JDBC API:在Java代码中,导入所需的JDBC类,例如`java.sql.Connection`, `java.sql.DriverManager`, `java.sql.Statement`, 和 `java.sql.ResultSet`。 3. 注册驱动:使用`Class.forName()`方法注册SQL ...
Tomcat6+Spring+JNDI配置数据源说明 本文档主要介绍了Tomcat6+Spring+JNDI配置数据源的详细步骤和原理。数据源是一个池子,里面有若干个数据连接对象,当需要时就从里面拿一个使用,使用完毕就放回去,如果超过最大...
在这个场景中,“intellij idea使用tomcat开发时自动部署jndi数据源”是一个重要的知识点,它涉及到如何在IDE中配置和管理数据库连接,以便于在应用运行时动态地查找和使用数据源。 JNDI(Java Naming and ...
Tomcat 配置 JNDI 数据源 Tomcat 是一个流行的 Java Web 服务器,JNDI(Java Naming and Directory Interface)是 Java 中的一种命名和目录接口规范。Tomcat 中的 JNDI 数据源是指将数据库连接信息注册到 JNDI ...
【标题】:“Tomcat配置JNDI数据源” 【描述】:“在Tomcat服务器上配置JNDI数据源,特别是通过DBCP连接池的方式” 【标签】:“tomcat,配置,JNDI数据源” 【内容】:配置JNDI数据源在Java Web应用程序中是一个...
标题中的"sqljdbc_7.4.1.0_enu.tar.gz"是一个包含SQL Server JDBC驱动的压缩包,这是微软官方提供的用于Java应用程序与Microsoft SQL Server数据库之间进行数据交互的驱动程序。"enu"通常代表"English",意味着这是...
### Java中使用Tomcat提供的JNDI数据源详解 #### 一、JNDI简介与重要性 Java Naming and Directory Interface(JNDI)是一种Java应用程序查找和访问各种命名及目录服务的API。它允许Java应用程序查找并使用远程...
TOMCAT8 JNDI对用户名和密码加密
"JNDI 数据源配置(tomcat)" JNDI(Java Naming and Directory Interface)是一种Java API,用于访问命名和目录服务。JNDI 数据源配置是 Java Web 应用程序中常用的数据库连接方式。Tomcat 是一个流行的 Java Web ...
在Java应用服务器中,如Tomcat 6.0,JNDI(Java Naming and Directory Interface)数据源是一种标准的方法来管理数据库连接。JNDI允许应用程序通过一个全局名称查找资源,比如数据源,而无需硬编码数据库连接参数。...
Oracle JDBC驱动程序是连接Java应用程序与Oracle数据库的关键组件。在Oracle 12c版本中,12.2.0.1是其中一个重要的发行版,它提供了对最新Oracle数据库特性的支持,同时也增强了性能和稳定性。Oracle JDBC驱动主要有...
Spring框架作为一个强大的IoC(Inversion of Control)和AOP(Aspect Oriented Programming)容器,提供了多种配置数据源的方式,其中包括通过JNDI(Java Naming and Directory Interface)来查找和配置数据源。...
标题“sqljdbc.jar”指的是微软提供的Java数据库连接驱动(JDBC Driver)用于与SQL Server 2005数据库进行交互。这个驱动程序是Java应用程序连接到SQL Server数据库的关键组件,它实现了Java.sql和javax.sql接口,...
在%TOMCAT_HOME%\conf\Catalina\localhost中建立虚拟目录描述文件jndi.xml,内容如下: <context displayName="jndi" docBase="D:/jndi" path="/jndi" workDir="work\Catalina\localhost\jndi"> ...
自定义jndi数据源factory类,用于解密jndi中的加密数据,解密方式为DES,具体可根据实际需求修改。
在Java应用服务器中,Tomcat是一个广泛使用的轻量级服务器,它支持JNDI(Java Naming and Directory Interface)来管理数据源,使得应用程序能够透明地访问数据库资源。JNDI配置数据源是将数据库连接池集成到Tomcat...
这个数据源是Tomcat内建的一种连接池,它在性能和内存管理上比标准的Java JDBC连接池更优秀,尤其适用于高并发的Web应用。 标题中提到的"tomcat-jdbc.jar"和"tomcat-juli.jar"是使用Tomcat-jdbc数据源所必需的两个...
总之,解决“Name jdbc is not bound in this Context”错误的关键在于正确配置数据源,并在Java代码中使用JNDI查找数据源以获取数据库连接。理解并熟练掌握这些步骤对于开发基于Java Web的应用程序来说至关重要。
总之,`spring-jdbc-4.2.xsd`是Spring JDBC模块配置的核心,它为Spring JDBC的配置提供了一套规范,使得开发者可以清晰、有序地设置数据库连接、数据源、事务管理等相关属性,提高了代码的可读性和可维护性。...