http://www.myexception.cn/database/1651797.html

在Spring中基于JDBC进行数据访问时如何控制超时

超时分类

超时根据作用域可做如下层级划分:

Transaction Timeout > Statement Timeout > JDBC Driver Socket Timeout
Transaction Timeout指一组SQL操作执行时应在设定的时间内完成(提交或回滚),否则将引发超时。它的值应大于 N(语句数) * Statement Timeout
Statement Timeout指完成单条SQL语句执行的最大允许时间。它的值应小于JDBC Driver Socket Timeout的值,因为后者会被先检查。
最底层的JDBC Driver Socket Timeout指的是通过socket进行连接时的超时或者进行读写操作时的阻塞超时,如果不设置将使用OS层的Socket Timeout值。

超时设置
大部分场景中,应用主要关心Transaction Timeout的设置,除非Transaction中总是只有单条Statement。超时的具体设置依赖于使用的数据访问框架或者JDBC Driver。如果使用Spring作为基础框架,可以通过为transactionManager的defaultTimeout属性来设置全局的Transaction Timeout,或者在声明式事务(tx:attributes)的配置中为特定的或所有的方法指定timeout属性的值,[email protected]�数来设置。
注意:
1.“Spring事务超时 = 事务开始时到最后一个Statement创建时时间 + 最后一个Statement的执行时超时时间(即其queryTimeout)。”(3)
2. 如果选择JpaTransactionManager作为事务管理器,需要Spring版本在3.0.0之上才能使timeout设置正常工作;
3. 如果选择DataSourceTransactionManager,事务内所有的sql操作必须通过JdbcTemplate执行才能使timeout设置正常工作,通过其他orm(如myBatis)执行的sql操作将无法应用超时设置。这种模式下需要按照具体orm框架的要求配置超时(例如myBatis的defaultStatementTimeout 4)
 
在某些场景中,确实存在混用两种数据访问框架的情况(姑且不讨论这种情况是否合理)。例如在同一事务中混用JdbcTemplate和MyBatis,在这种场景中,为@Transactional或tx:attributes设置的timeout将不会对非JdbcTemplate部分的操作生效,因此实际上已无法控制这个事务的超时。此时,有一种“变通”的方式能够使两种数据访问框架能够“共享”超时设置,那就是设置JDBC Driver Socket阻塞超时。如果使用的是Oracle数据库,并且数据源使用的是DBCP的BasicDataSource,可以在其connectionProperties属性中设置此值,例如:
 

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<!-- 设置毫秒单位的阻塞超时 -->
<property name="connectionProperties" value="oracle.net.READ_TIMEOUT=1000"/> <!-- 其他属性设置... -->
</bean>

如果同时有多个属性要设置,在value中通过分号分隔。其他数据库的设置方式参见资料3。

 
超时捕获
在Transaction timeout设置生效的情况下,发生超时后,框架将主动回滚当前事务并抛出UncategorizedSQLException。这是一个RuntimeException的子类,通过其getSql()或getMessage()方法可以得知引发超时的sql语句。
在使用JDBC Driver Socket阻塞超设置时,发生超时后,当前连接将被driver关闭,事务中正在执行的操作,不论是通过JdbcTemplate还是其他ORM框架执行的,都将引发SQLException(异常信息为:关闭的连接),这个异常将被上层的TransactionInterceptor捕获并被重新包装成一个UncategorizedSQLException的实例,随后回滚事务,但由于连接已关闭,因此又会引发回滚异常,所以会看到

“TransactionInterceptor.completeTransactionAfterThrowing (TransactionAspectSupport.java:414)

Application exception overridden by rollback exception ”
最终,会向调用者抛出一个TransactionSystemException的实例,通过其getApplicationException()方法可以获得被覆盖前的那个UncategorizedSQLException的实例。
 
参考资料
1. Understanding JDBC Internals & Timeout Configuration
2. Spring transaction timeout doesn't work?
3. Spring事务超时时间可能存在的错误认识
4. Using Spring 3 with Mybatis 3 Tutorial – part 1

【转】在Spring中基于JDBC进行数据访问时怎么控制超时的更多相关文章

  1. 在Spring中基于JDBC进行数据访问时如何控制超时

    超时分类 超时根据作用域可做如下层级划分: Transaction Timeout > Statement Timeout > JDBC Driver Socket Timeout Tra ...

  2. Spring中的JDBC API

    1 JdbcTemplate的诞生 JDBC作为Java平台访问关系数据库的标准API,其成功是有目共睹的.为了避免在JDBC API在使用中的种种尴尬局面(几乎程式一样的代码,繁琐的异常处理),Sp ...

  3. spring框架总结(04)----介绍的是Spring中的JDBC模板

    1.1  Jdbc模板概述 它是spring框架中提供的一个对象,是对原始Jdbc API对象的简单封装.spring框架为我们提供了很多的操作模板类,入下图所示: 我们今天的主角在spring-jd ...

  4. Spring中使用JDBC

    Spring中的数据库异常体系 使用JDBC(不使用Spring)的时候,我们需要强制捕获SQLException,否则无法使用JDBC处理任何事情.SQLException表示尝试访问数据库的时候出 ...

  5. Spring框架学习(3)spring中使用jdbc

    内容源自:spring中使用jdbc spring dao层中对jdbc进行了封装,使用模板模式的设计模式,通过ioc被动注入的方式将jdbcTemplate这个模板类注入到数据对象中,进行数据库操作 ...

  6. Spring 框架的概述以及Spring中基于XML的IOC配置

    Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...

  7. 在Spring中配置jdbc为什么不能用${username}问题

    楼主在spring中配置jdbc时,引用的是dbcp.jar包,在dataSource.properties配置文件中,有mysql用户名,楼主自然的选择了使用username,密码是root, 然后 ...

  8. Spring 中基于 AOP 的 @AspectJ

    Spring 中基于 AOP 的 @AspectJ @AspectJ 作为通过 Java 5 注释注释的普通的 Java 类,它指的是声明 aspects 的一种风格. 通过在你的基于架构的 XML ...

  9. Spring 中基于 AOP 的 XML架构

    Spring 中基于 AOP 的 XML架构 为了使用 aop 命名空间标签,你需要导入 spring-aop j架构,如下所述: <?xml version="1.0" e ...

随机推荐

  1. VS2015 开发人员命令提示,如何实现记事本编程

    开始,选择VS2015 开发人员命令提示,打开 找到.c文件的位置,复制位置 在VS2015 开发人员命令提示, 输入cd 位置 回车 然后输入cl 文件名 回车 这样进行编译

  2. ASP.NET MVC 学习之路-1

    本文在于巩固基础 学习参考书籍:ASP.NET MVC4 Web编程 首先确定我们学习MVC的目标: 我们学习ASP.NET MVC的目的在于开发健壮的.可维护的Web应用,当然这需要一定的知识基础, ...

  3. ORACLE EBS BOM 展开(使用标准程序bompexpl.exploder_userexit展开)

    create or replace package cux_bom_pub is PROCEDURE bom_expand_to_temp( p_organization_id number, p_i ...

  4. Linux学习之停止进程

    首先,用ps查看进程,方法如下: ps -ef ……smx       1822     1  0 11:38 ?        00:00:49 gnome-terminalsmx       18 ...

  5. Docker容器的网络连接

    Docker容器的网络连接 Docker容器的网络连接 我们用ifconfig命令来查看网络设备 我们可以看到上面有个叫docker0的网络设备,docker守护进程就是通过docker0为docke ...

  6. HTML5 canvas入门

    HTML5 Canvas入门 <canvas> 标签定义图形,比如图表和其他图像,您必须使用脚本来绘制图形.在画布上(Canvas)画一个红色矩形,渐变矩形,彩色矩形,和一些彩色的文字. ...

  7. 【grunt整合版】学会使用grunt打包前端代码

    grunt 是一套前端自动化工具,一个基于nodeJs的命令行工具,一般用于:① 压缩文件② 合并文件③ 简单语法检查 对于其他用法,我还不太清楚,我们这里简单介绍下grunt的压缩.合并文件,初学, ...

  8. js关闭 window.open 打开的页面

    1.关闭 当前页面 window.opener = null; window.open('', '_self', ''); window.close(); 但是在FF中就是不行: 2.项目中情况是通过 ...

  9. WinCE 5.0模拟器,在 win7 下安装后, VS2008里不显示

    来源:http://blog.csdn.net/masterlonely/article/details/8302932 现状: Win7 32位旗舰版 VS2008 Team 在安装了: Windo ...

  10. IP地址、子网掩码和地址分类

    http://blog.csdn.net/bluishglc/article/details/47909593?utm_source=tuicool&utm_medium=referral 实 ...