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. JScript中的prototype(原型)属性研究

    今天看到同事使用js中的Prototype,感觉很是新鲜.由此想深入学习一下prototype(英['prəʊtətaɪp] 美['protə'taɪp]n. 原型:标准,模范),在学习prototy ...

  2. 404 Not Found The requested URL * was not found on this server

    1. 把从SVNcheckout下来的代码搭建起来.CakePHP+mysql.改动数据库配置. 2. 配置虚拟主机,发现訪问不了/user/login这个URL,报这个错误:404 Not Foun ...

  3. leetcode之 median of two sorted arrays

    这是我做的第二个leetcode题目,一开始以为和第一个一样很简单,但是做的过程中才发现这个题目非常难,给人一种“刚上战场就踩上地雷挂掉了”的感觉.后来搜了一下leetcode的难度分布表(leetc ...

  4. android 计时器,倒计时

    自己定义CountDownTimer /** * 计时器 * @author Administrator * */ class TimeCount extends CountDownTimer{ pu ...

  5. php什么是变量的数据类型

    什么是变量的数据类型 在变量中,由于变量占用的空间单元不一样(占的地盘大小不一样),也分成几种数据类型,就像超市商品的包装袋,有几种不同类型,不同的商品使用不同的包装袋.我们可以通过使用“memory ...

  6. Semantic UI中的验证控件的事件的使用

    1.Semantic UI中的验证控件,功能挺不错的,中文官网的文档写的都比较详细了,我再这里就不再进行重复了,主要是想说一下它的事件的使用方法,这个可能有部分朋友刚开始接触的时候不太了解 注意看这几 ...

  7. 修改AspNetSqlMembershipProvider的密码规则

    在AspNetSqlMembershipProvider中,默认的密码规则为长度大于等于7,并且包含1个除字母和数字外的特殊字符,这项规则主要由minRequiredPasswordLength和mi ...

  8. 最近做OpenWrt的总结

    用到了哪些东西 需要在OpenWrt上开发一个客户端,用C语言写还比较方便,最开始在linux上跑,后面移植到路由器上,做成ipk.除了稍微修改了下Makefile,其他的什么都没改. 因为需要做个配 ...

  9. [C++空间分配]new运算符、operator new、placement new的区别于联系

    先科普一下: 1. new的执行过程: (1)通过operator new申请内存 (2)使用placement new调用构造函数(内置类型忽略此步) (3)返回内存指针 2. new和malloc ...

  10. interview collect

    1. binary tree inorder traversal 不能用recursive写 (LC原题)2. 比如有个数组F={1,3, 4, 5, 2, 0}, A=3, 那么F[A]=5, F[ ...