SpringJDBC与事务管理全解析
立即解锁
发布时间: 2025-08-19 02:32:42 阅读量: 3 订阅数: 11 


Spring框架下的Java开发实践与进阶
### Spring JDBC与事务管理全解析
#### 一、Spring JDBC的额外考量
在使用Spring的JDBC抽象框架成功实现基于JDBC的解决方案之前,有一些问题需要考虑。
##### 1. 性能方面
- **常规查询和更新**:Spring的`JdbcTemplate`及其回调方法在执行查询和常规更新时,与直接使用JDBC相比,性能上没有显著差异。因为对象创建、查询执行和序列化数据传输占据了大部分处理时间,额外的几个回调对性能影响不大,包括执行查询和更新的RDBMS操作类。
- **批量更新**:批量更新存在轻微的性能损失。因为在整个批量操作过程中会创建并持有新对象,批量刷新时一次性写入。这种方式虽然限制了数据库连接的打开时间,但会带来一定的性能开销。不过,在极端情况下(如每个事务进行一百万次更新),Spring JDBC的批量更新仍能展现出出色的性能。
- **性能调优**:当检索大量行时,可以更改JDBC驱动在需要更多行时从数据库获取的行数,以减少与数据库的往返次数。示例代码如下:
```java
JdbcTemplate jt = new JdbcTemplate(ds);
jt.setFetchSize(100);
```
需要注意的是,不要将`fetchSize`设置得过高,否则可能会导致内存不足。
##### 2. JDBC与O/R映射的选择
当数据库解决方案限于关系数据库时,数据访问技术的选择有直接JDBC、Spring的JDBC框架、TopLink、iBATIS、Hibernate或JDO。选择不同技术的因素如下:
- **直接JDBC**:只有在不允许使用J2SE或J2EE之外的任何框架时,才是首选方案。
- **Spring JDBC**:如果项目中只有少数持久类,或者需要映射到具有多个存储过程的现有数据库,Spring JDBC解决方案是合适的。配置简单,对于少量类映射到Java类,`MappingSQLQuery`使映射变得直接,`StoredProcedure`类简化了存储过程的使用。
- **Hibernate或JDO**:如果有许多类需要映射到现有数据库,且映射大多是一个Java类对应一个表,Hibernate或JDO是不错的选择。
- **iBATIS SQL Maps**:如果一组表映射到一个Java类,使用iBATIS SQL Maps进行映射会更容易。iBATIS和Hibernate/JDO都允许在映射不合适或需要使用存储过程与数据库交互时,使用Spring的JDBC层。
##### 3. JDBC版本和J2EE版本
使用应用程序框架与应用程序服务器结合时,会面临各种API支持版本的问题。目前大多数应用程序服务器支持的J2EE规范是J2EE 1.3,其中包含的JDBC规范是JDBC 2.1。现在有J2SE 1.4和J2EE 1.4中的JDBC 3.0规范,但应用程序服务器和大多数数据库供应商尚未广泛支持。Spring JDBC支持基于JDBC 2.1规范,这意味着在较旧的应用程序服务器中几乎可以使用Spring JDBC的所有功能。不过,检索生成的键和`RowSet`支持这两个功能需要JDBC 3.0支持。
#### 二、事务与资源管理概述
事务和资源管理是重要的话题,下面将介绍事务的基本概念、属性以及在J2EE环境中的处理方式。
##### 1. 事务的定义
事务是由一组针对一个或多个资源的操作组成的工作单元,必须完整完成。例如,从储蓄账户向支票账户转账,储蓄账户扣款和支票账户入账必须作为一个整体完成,如果入账失败,扣款操作应撤销。
##### 2. ACID属性
- **原子性**:事务的所有步骤必须全部完成或全部不完成。可以通过声明事务开始,然后决定是提交所有更改还是回滚来保证。代码示例如下:
```java
//start the transaction
begin work
// do your work
read ...
u
```
0
0
复制全文
相关推荐









