`
m635674608
  • 浏览: 5042999 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

在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还是其他ORM框架执 行的,都将引发SQLException(异常信息为:关闭的连接),这个异常将被上层的 TransactionInterceptor捕获并被重新包装成一个 UncategorizedSQLException的实例,随后回滚事务,但由于连接已关闭,因此又会引发回滚异常,所以会看到

TransactionInterceptor.completeTransactionAfterThrowing  ( TransactionAspectSu pport.java:414 )

Application exception overridden by rollback exception  ”

最终,会向调用者抛出一个 TransactionSystemException的实例,通过其getApplicationException()方法可以获得被覆盖前的那个 UncategorizedSQLException的实例。

分享到:
评论

相关推荐

    spring-jdbc源码

    6. RowCallbackHandler和ResultSetExtractor:这两个接口用于处理查询结果,可以在每次处理一行数据时进行回调,或者一次性提取所有结果。 7. ExceptionTranslator:转换数据库异常到Spring的DataAccessException,...

    Spring+JDBC组合开发

    Spring提供了声明式事务管理,开发者只需在方法上添加@Transactional注解,就能自动进行事务控制。这样,无需编写大量事务管理代码,就可以确保数据的一致性。 3. 声明式事务管理:在服务类或方法上使用@...

    JDBC数据源连接池的配置和使用示例

    在Spring Boot应用中,你可以通过`@Autowired`注解注入数据源,然后使用`DataSource`提供的`getConnection()`方法获取数据库连接,如下所示: ```java import org.springframework.beans.factory.annotation....

    spring jdbc 事务

    标题中的“Spring JDBC 事务”指的是在Spring框架中使用JDBC进行数据库操作时的事务管理。Spring JDBC模块提供了对数据库事务处理的高级封装,使得开发者能够方便地在应用中实现事务的一致性和隔离性。 首先,...

    spring JDBC事务管理

    标题中的“Spring JDBC事务管理”是指在Spring框架中如何利用JDBC进行数据库操作时的事务控制。Spring提供了多种方式来管理事务,使得开发者能够在复杂的业务逻辑中更好地控制数据的持久化过程,确保数据的一致性和...

    SpringBoot整合JDBC&Druid;数据源示例

    在本文中,我们将深入探讨如何在SpringBoot项目中整合JDBC和Druid数据源,并创建一个具有监控功能的示例。SpringBoot以其简洁的配置和快速的开发能力,深受Java开发者喜爱。而Druid作为一款优秀的数据库连接池,提供...

    Spring对JDBC的支持jar包.rar

    "spring-jdbc-4.3.7.RELEASE.jar"是Spring对JDBC进行抽象和封装的模块,它提供了数据库访问的高层API,使得数据库操作变得简单且易管理。主要特性包括: 1. 数据源管理:Spring通过DataSource接口,帮助开发者配置...

    spring声明式事务管理+jdbc+连接池.zip

    本资料包"spring声明式事务管理+jdbc+连接池.zip"显然是针对Spring框架在数据库操作方面的深入学习,特别是如何利用Spring进行声明式事务管理和JDBC操作,以及如何配置和使用数据库连接池。接下来,我们将详细探讨这...

    SpringJDBC笔记

    - **maxStatements**:JDBC 的标准参数,用以控制数据源内加载的 PreparedStatement 数量。如果 maxStatements 与 maxStatementsPerConnection 均为 0,则缓存被关闭,默认为 0。 - **maxStatementsPerConnection**...

    Spring Mybatis Sharding-JDBC demo

    本文通过对一个基于 Spring、MyBatis 和 Sharding-JDBC 的项目进行分析,介绍了如何构建一个支持数据库分片的应用。通过遵循本文中的步骤,开发者不仅可以快速上手 Sharding-JDBC,还能够在实际项目中有效利用这项...

    spring 事务基于注解模式

    在Spring框架中,事务管理是实现业务逻辑时不可或缺的一部分,它确保了数据的一致性和完整性。Spring提供了多种事务管理方式,其中基于注解的事务管理是近年来常用的模式,因为它简化了代码并提高了可读性。本文将...

    SpringJDBC

    在Spring框架中,Spring JDBC提供了一种组织和执行JDBC代码的方式,它通过简化异常处理、事务管理和资源管理,降低了数据库操作的复杂性。 首先,Spring JDBC通过`JdbcTemplate`类提供了数据库访问的基本功能。`...

    实例详解Spring JDBC事务管理.doc

    在本文中,我们将以JDBC事务管理为例,详细介绍Spring的事务管理机制。 Spring事务管理机制 Spring的事务管理机制是基于PlatformTransactionManager接口的实现的,该接口定义了三个方法:getTransaction、commit...

    Spring基于XML方式配置事务

    在Spring配置文件中,我们需要引入`tx`命名空间,并声明一个`PlatformTransactionManager`实例,例如,对于基于JDBC的事务管理,我们会使用`&lt;bean id="transactionManager" class="org.springframework.jdbc....

    tomcat-jdbc-7.0.42.jar

    这个连接池组件在Spring Boot框架中被广泛使用,以支持内嵌Tomcat服务器运行JDBC操作。本文将深入探讨`tomcat-jdbc-7.0.42.jar`这个库,包括其核心概念、配置、性能优化以及与Spring Boot的集成。 首先,Tomcat ...

    spring事务管理.rar

    - **声明式事务管理**:这是Spring中最常用的方式,基于AOP(面向切面编程)实现,无需在业务代码中显式管理事务。通过在配置文件或注解中声明事务规则,Spring会自动处理事务的开始、提交、回滚等操作。 ### 3. ...

    4.Spring中的JdbcTemplate,Spring中的的事务,

    通过本章节的学习,您应该能够掌握如何使用JdbcTemplate进行基本的数据库操作,以及如何在Spring中配置和使用声明式事务来管理复杂的业务流程。这些技能对于开发基于Spring框架的应用程序至关重要。

    spring security 2.0.4 中文文档

    7. **表达式语言**:Spring Security还引入了访问表达式语言(AOP-based Expression Language),允许在访问控制规则中使用表达式。例如,`@Secured("hasRole('ROLE_ADMIN')"`可以限制只有具有管理员角色的用户才能...

    轻量级的java数据源jdbc框架

    Java 数据源(DataSource)是 JDBC 中的一个重要概念,它提供了连接数据库的统一接口,使得数据库连接的管理更加高效和便捷。在大型应用中,数据源的管理至关重要,因为它可以实现数据库连接的池化,提高系统性能,...

    Spring项目配置文件(整合security、hibernate、fckeditor、jdbc、log4j)

    这个压缩包包含的文件是针对Spring项目中的一些关键组件进行整合的配置,包括Spring Security、Hibernate ORM框架、FCKeditor富文本编辑器、JDBC数据访问层以及日志管理工具Log4j。下面我们将逐一探讨这些组件的配置...

Global site tag (gtag.js) - Google Analytics