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 ( TransactionAspectSu pport.java:414 )Application exception overridden by rollback exception ”
最终,会向调用者抛出一个 TransactionSystemException的实例,通过其getApplicationException()方法可以获得被覆盖前的那个 UncategorizedSQLException的实例。
1. Understanding JDBC Internals & Timeout Configuration
2. Spring transaction timeout doesn't work?
4. Using Spring 3 with Mybatis 3 Tutorial – part 1
http://www.tuicool.com/articles/y2qIrm
相关推荐
6. RowCallbackHandler和ResultSetExtractor:这两个接口用于处理查询结果,可以在每次处理一行数据时进行回调,或者一次性提取所有结果。 7. ExceptionTranslator:转换数据库异常到Spring的DataAccessException,...
Spring提供了声明式事务管理,开发者只需在方法上添加@Transactional注解,就能自动进行事务控制。这样,无需编写大量事务管理代码,就可以确保数据的一致性。 3. 声明式事务管理:在服务类或方法上使用@...
在Spring Boot应用中,你可以通过`@Autowired`注解注入数据源,然后使用`DataSource`提供的`getConnection()`方法获取数据库连接,如下所示: ```java import org.springframework.beans.factory.annotation....
标题中的“Spring JDBC 事务”指的是在Spring框架中使用JDBC进行数据库操作时的事务管理。Spring JDBC模块提供了对数据库事务处理的高级封装,使得开发者能够方便地在应用中实现事务的一致性和隔离性。 首先,...
标题中的“Spring JDBC事务管理”是指在Spring框架中如何利用JDBC进行数据库操作时的事务控制。Spring提供了多种方式来管理事务,使得开发者能够在复杂的业务逻辑中更好地控制数据的持久化过程,确保数据的一致性和...
在本文中,我们将深入探讨如何在SpringBoot项目中整合JDBC和Druid数据源,并创建一个具有监控功能的示例。SpringBoot以其简洁的配置和快速的开发能力,深受Java开发者喜爱。而Druid作为一款优秀的数据库连接池,提供...
"spring-jdbc-4.3.7.RELEASE.jar"是Spring对JDBC进行抽象和封装的模块,它提供了数据库访问的高层API,使得数据库操作变得简单且易管理。主要特性包括: 1. 数据源管理:Spring通过DataSource接口,帮助开发者配置...
本资料包"spring声明式事务管理+jdbc+连接池.zip"显然是针对Spring框架在数据库操作方面的深入学习,特别是如何利用Spring进行声明式事务管理和JDBC操作,以及如何配置和使用数据库连接池。接下来,我们将详细探讨这...
- **maxStatements**:JDBC 的标准参数,用以控制数据源内加载的 PreparedStatement 数量。如果 maxStatements 与 maxStatementsPerConnection 均为 0,则缓存被关闭,默认为 0。 - **maxStatementsPerConnection**...
本文通过对一个基于 Spring、MyBatis 和 Sharding-JDBC 的项目进行分析,介绍了如何构建一个支持数据库分片的应用。通过遵循本文中的步骤,开发者不仅可以快速上手 Sharding-JDBC,还能够在实际项目中有效利用这项...
在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。Spring提供了多种事务管理方式,其中基于注解的事务管理是近年来常用的模式,因为它简化了代码并提高了可读性。本文将...
在Spring框架中,Spring JDBC提供了一种组织和执行JDBC代码的方式,它通过简化异常处理、事务管理和资源管理,降低了数据库操作的复杂性。 首先,Spring JDBC通过`JdbcTemplate`类提供了数据库访问的基本功能。`...
在本文中,我们将以JDBC事务管理为例,详细介绍Spring的事务管理机制。 Spring事务管理机制 Spring的事务管理机制是基于PlatformTransactionManager接口的实现的,该接口定义了三个方法:getTransaction、commit...
在Spring配置文件中,我们需要引入`tx`命名空间,并声明一个`PlatformTransactionManager`实例,例如,对于基于JDBC的事务管理,我们会使用`<bean id="transactionManager" class="org.springframework.jdbc....
这个连接池组件在Spring Boot框架中被广泛使用,以支持内嵌Tomcat服务器运行JDBC操作。本文将深入探讨`tomcat-jdbc-7.0.42.jar`这个库,包括其核心概念、配置、性能优化以及与Spring Boot的集成。 首先,Tomcat ...
- **声明式事务管理**:这是Spring中最常用的方式,基于AOP(面向切面编程)实现,无需在业务代码中显式管理事务。通过在配置文件或注解中声明事务规则,Spring会自动处理事务的开始、提交、回滚等操作。 ### 3. ...
通过本章节的学习,您应该能够掌握如何使用JdbcTemplate进行基本的数据库操作,以及如何在Spring中配置和使用声明式事务来管理复杂的业务流程。这些技能对于开发基于Spring框架的应用程序至关重要。
7. **表达式语言**:Spring Security还引入了访问表达式语言(AOP-based Expression Language),允许在访问控制规则中使用表达式。例如,`@Secured("hasRole('ROLE_ADMIN')"`可以限制只有具有管理员角色的用户才能...
Java 数据源(DataSource)是 JDBC 中的一个重要概念,它提供了连接数据库的统一接口,使得数据库连接的管理更加高效和便捷。在大型应用中,数据源的管理至关重要,因为它可以实现数据库连接的池化,提高系统性能,...
这个压缩包包含的文件是针对Spring项目中的一些关键组件进行整合的配置,包括Spring Security、Hibernate ORM框架、FCKeditor富文本编辑器、JDBC数据访问层以及日志管理工具Log4j。下面我们将逐一探讨这些组件的配置...