超时分类

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

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属性的值,还可以在注解式事务@Transactional标记中通过timeout参数来设置。
注意:
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进行数据访问时怎么控制超时

    http://www.myexception.cn/database/1651797.html 在Spring中基于JDBC进行数据访问时如何控制超时 超时分类 超时根据作用域可做如下层级划分: Tr ...

  2. Spring中的JDBC API

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

  3. Spring中使用JDBC

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

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

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

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

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

  6. 【原创】打造基于Dapper的数据访问层

    [原创]打造基于Dapper的数据访问层   前言 闲来无事,花几天功夫将之前项目里用到的一个数据访问层整理了出来.实现单个实体的增删改查,可执行存储过程,可输出返回参数,查询结果集可根据实际情况返回 ...

  7. Spring中基于xml的AOP

    1.Aop 全程是Aspect Oriented Programming 即面向切面编程,通过预编译方式和运行期动态代理实现程序功能的同一维护的一种技术.Aop是oop的延续,是软件开发中的 一个热点 ...

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

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

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

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

随机推荐

  1. Mac. 文件夹赋予权限

    1. click on your background to go to finder click on go and go to folder /usr right click on local a ...

  2. Android WiFi开发教程(一)——WiFi热点的创建与关闭

    相对于BlueTooth,WiFi是当今使用最广的一种无线网络传输技术, 几乎所有智能手机.平板电脑和笔记本电脑都支持Wi-Fi上网.因此,掌握基本的WiFI开发技术是非常必要的.本教程将围绕一个小D ...

  3. (原创)linux安装xgboost快速高效方法

    1.先安装git ubuntu:   apt-get install git centos:    yum install git 2.下载xgboost仓库,注意有--recursive(有子模块哦 ...

  4. GPS整数。度分秒转换

    例如30.453280 104.2018怎么把度数转换为度分秒的格式要详细换算方法 例如30.453280°,30.453280°,则有30°0.453280°×60= 27.1968′则有27′0. ...

  5. SVG图片背景透明

    今天在调整网页的时候,将logo以原有直接贴代码形式,改为加载文件. 其实真正的目的是做SEO.上次SEO交流后得出 结论:核心在于内容的本身的优化.信噪比很重要.也就是有效信息需要占文章的主要内容, ...

  6. jquery方法

    $.inArray(被判断的量,ArrayName);  如果存在返回索引值,如果不存在返回-1 $.unique() 数组去重   根据去重前后的长度,判断是否有重复 $.each(被遍历的数组,f ...

  7. VS2015 定位内存泄漏工具vld

    介绍一款在vs2015开发环境定位内存泄漏工具:Visual Leak Detector ,具体的使用方法如下: 1.  安装vld-2.5-setup.exe (下载链接地址后面会给出),安装过程会 ...

  8. Easy UI form表单提交 IE浏览器不执行success ,以及 datagrid 展示过慢

    最近在做一个Easy ui的项目 发现了一些问题,在这里总结下 1.表单提交,后端代码 public ActionResult Save(Request model) { ResultInfo _in ...

  9. java 开发环境安装

    一.在mac上安装jdk 1. 下载Mac版本的JDK并安装      http://www.oracle.com/technetwork/java/javase/downloads/index.ht ...

  10. QTreeWidget 的用法

    Qt QTreeWidget 新建一个Qt Widgets Application,拖拽一个Tree Widget 到 ui 界面上,最后实现的效果如下: 添加代码 //test.h //在头文件里添 ...