在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属性的值,还足以在表明式事务@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照旧其它O帕杰罗M框架执行的,都将掀起SQLException(极度新闻为:关闭的连接),这些那么些将被上层的TransactionInterceptor捕获并被另行李包裹装成贰个UncategorizedSQLException的实例,随后回滚事务,但由于连续已关闭,因而又会掀起回滚非常,所以会看到

“TransactionInterceptor.completeTransactionAfterThrowing (TransactionAspectSupport.java:414)

Application exception overridden by rollback exception ”

终极,会向调用者抛出1个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

网站地图xml地图