主要关注点有:

  • JDBC的配置方式
  • 事务的配置方式

JDBC

JDBCTemplate简介

为了使JDBC更加易于使用,Spring在JDBC API上定义了一个抽象层,以此建立一个JDBC存取框架。

作为Spring JDBC框架的核心,JDBC模板的设计目的是为不同类型的JDBC操作提高模板方法,每个模板方法都能控制整个过程,并允许覆盖过程中的特定任务。通过这种方式,可以在尽可能保留灵活性的情况下,将数据库存取的工作量降到最低。

XML配置JDBCTemplate

配置C3P0数据源:C3P0是一个开源的JDBC连接池,他实现了数据源和JNDI绑定,支持JDBC3和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

配置步骤:

  1. 导入c3p0的jar包,导入jdbc驱动包。
  2. 配置jdbc-properties文件。
  3. 配置application-jdbc。
  4. 配置bean相关属性。

以上4部分的源码:

<!-- 自动扫描 -->
<context:component-scan base-package="com.jredu.jdbc"></context:component-scan>
<!-- 配置C3P0数据源 -->
<!-- 导入资源文件 -->
<context:property-placeholder location="classpath:jdbc.properties"/>
<bean
id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
p:user="${jdbc.user}"
p:password="${jdbc.pwd}"
p:driverClass="${jdbc.driverClassName}"
p:jdbcUrl="${jdbc.url}"
p:initialPoolSize="${jdbc.initPoolSize}"
p:maxPoolSize="${jdbc.maxPoolSize}"
/>

最后再配置JDBC Template。

<!-- 配置JDBC Template -->
<bean
id="jdbcTemplate"
class="org.springframework.jdbc.core.JdbcTemplate"
p:dataSource-ref="dataSource"
/>

简化JDBC模板查询

每次使用都创建一个JDBCTemplate的新实例,这种做法效率很低下。

JDBCTemplate类被设计成为线程安全的。所以可以再IOC容器中声明它的单个实例,并将这个实例注入到所有的DAO实例中。

JDBCTemplate也用了Java1.5的特定(自动装箱,泛型,可变长度等)来简化开发。

Spring JDBC框架还提供了一个JdbcaoSupport来简化。


事务管理

事务简介

事务管理是企业级应用程序开发中必不可少的技术,用来确保数据的完整性和一致性。

事务就是一系列的动作,它们被当做一个单独的工作单元,这些动作要么全部完成,要么全部不起作用。

事务的四个关键属性(ACID):

  1. 原子性(atomicity):事务是一个原子操作,有一系列动作组成。事务的原子性确保动作要么全部完成要么完全不起作用。
  2. 一致性(consistency):一旦所有事务动作完成,事务就被提交,数据和资源就处于一种满足业务规则的一致性状态中。
  3. 隔离性(isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
  4. 持久性(durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,通常情况下,事务的结果被写到持久化存储器中。

Spring中的事务管理器

Spring从不同的事务管理API中抽象了一整套的事务机制,开发人员不必了解底层的事务,就可以利用这些事务机制。有了这些事务机制,事务管理代码就能独立于特定的事务技术了。

Spring的核心事务管理是Platform TransactionManager 它为事务管理封装了一组独立于技术的方法。无论使用Spring的哪种事务管理策略(编程式或声明式),事务管理是必须的。

Spring中的事务管理器的不同实现

DataSourceTransactionManager

在应用程序中只需要处理一个数据源,而且通过JDBC存取。

JtaTransactionManager

在JavaEE 应用服务器上用JTA(JavaTransaction API)进行事务管理。

HibernateTransactionManager

用Hibernate框架存取数据库。

用事务通知声明式地管理事务

事务管理是一种横切关注点。

为了在Spring 2.x中启用声明式事务管理,可以通过tx Schema中定义的<tx:advice>元素声明事务通知,为此必须事先将这个Schema定义添加到<beans>根元素中去。

声明事务管理器: 执行者

声明事务通知:通知,消息传递着,传递消息

配置事务切面:切面

当事务通知触发切面的规则之后,事务通知得到消息,告诉我们事务管理器去处理。

事务传播属性,Spring支持的事务传播行为

当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的事务中运行。

事务的传播行为可以由传播属性指定,Spring定义了7种类传播行为。

Spring支持的事务传播行为:

REQUIRED传播行为

REQUIRED_NEW传播行为

在Spring事务通知中配置传播属性

在Spring当中,可以通过tx:method来配置传播属性。

<!-- 事务的通知 -->
<tx:advice>
id="booktxAdvice" transaction-manager="transactionManager"
>
<tx:attributes>
<tx:method name="purchase*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>

并发事务所导致的问题

当同一个应用程序或者不同应用程序中的多个事务在同一个数据集上并发执行时,可能会出现许多意外的问题。

并发事务所导致的问题可以分为下面三种类型:

  • 脏读:对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交的字段,之后,若T2回滚,T1读取的内容就是临时且无效的。
  • 不可重复读:对于两个事务T1,T2,T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取同一个字段,值就不同了。
  • 幻读:对于两个事务T1,T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行,之后,如果T1再次读取同一个表,就会多出几行。

事务的隔离级别

从理论上来说,事务应该彼此完全隔离,以避免并发事务所导致的问题。然而,那样会对性能产生极大的影响,因为事务必须按顺序运行。

在实际开发中,为了提升性能,事务会以较低的隔离级别运行。

事务的隔离级别可以通过隔离事务属性指定。

Spring支持的事务隔离级别:

设置隔离事务属性

在Spring事务通知中,可以在<tx:method>元素中指定隔离级别。

<tx:advice  id="  "  transaction-manager="  ">
<tx:attributes>
<tx:method name="purchase"
propagation="REQUIRES_NEW"
isolation="READ_CONMMITED"
/>
</tx:attributes>
</tx:advice>

设置回滚事务属性

默认情况下只有未检查一次(RUntimeException和Error类型的异常)会导致事务回滚,而受检查异常不会。

Spring事务通知中,可以在<tx:method>元素中指定回滚规则,如果有不止一种异常,用逗号分隔。

  • rollbackFor:遇到时必须进行回滚
  • noRollbackFor:一组异常类,遇到时必须不回滚。

超时和只读属性

由于事务可以在行和表上获得锁,因此长事务会 占用资源,并对整体性能产生影响。

如果一个事务只读取数据但不做修改,数据库引擎可以对这个事务进行优化。

超时事务属性:事务在强制回滚之前可以保持多久,这样可以防止长期运行的事务占用资源。

只读事务属性:表示这个事务只读取数据但不更新数据,这样可以帮助数据库引擎优化事务。

常用配置实例

事务管理器:管理事务,事务通知来通知他

事务的通知:将aop传递的信息进行加工,调用相关方法。

通过aop告诉事务的通知。

Spring框架——JDBC与事务管理的更多相关文章

  1. 12 Spring框架 SpringDAO的事务管理

    上一节我们说过Spring对DAO的两个支持分为两个知识点,一个是jdbc模板,另一个是事务管理. 事务是数据库中的概念,但是在一般情况下我们需要将事务提到业务层次,这样能够使得业务具有事务的特性,来 ...

  2. Spring 框架系列之事务管理

    1.事务回顾 (1).什么是事务: 事务是逻辑上的一组操作,组成这组操作的各个逻辑单元,要么一起成功,要么一起失败. (2).事务特性(ACID) 原子性 :强调事务的不可分割 一致性 :事务的执行的 ...

  3. 4-9 基于Spring JDBC的事务管理(续)

    10. 基于Spring JDBC的事务管理(续) 当需要方法是事务性的,可以使用@Transactional注解,此注解可以添加在: 接口 会使得此接口的实现类的所有实现方法都是事务性的 接口中的抽 ...

  4. 全面分析 Spring 的编程式事务管理及声明式事务管理

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  5. 全面分析 Spring 的编程式事务管理及声明式事务管理--转

    开始之前 关于本教程 本教程将深入讲解 Spring 简单而强大的事务管理功能,包括编程式事务和声明式事务.通过对本教程的学习,您将能够理解 Spring 事务管理的本质,并灵活运用之. 先决条件 本 ...

  6. 跟着刚哥学习Spring框架--JDBC(六)

    Spring的JDBC框架 Spring JDBC提供了一套JDBC抽象框架,用于简化JDBC开发. Spring主要提供JDBC模板方式.关系数据库对象化方式.SimpleJdbc方式.事务管理来简 ...

  7. spring----AOP注解以及spring的JDBC和事务

    技术分析之:Spring框架的AOP技术(注解方式) 1. 步骤一:创建JavaWEB项目,引入具体的开发的jar包 * 先引入Spring框架开发的基本开发包 * 再引入Spring框架的AOP的开 ...

  8. Spring整合hibernate4:事务管理

    Spring整合hibernate4:事务管理 Spring和Hibernate整合后,通过Hibernate API进行数据库操作时发现每次都要opensession,close,beginTran ...

  9. Spring企业级程序设计 • 【第4章 Spring持久化层和事务管理】

    全部章节   >>>> 本章目录 4.1 配置数据源资源 4.1.1 JdbcTemplate介绍 4.1.2通过ComboPooledDataSource创建数据源 4.1. ...

随机推荐

  1. mysql提权神器

    java -jar udf.jar 127.0.0.1 root 123456 [32/64]

  2. 自定义ClassLoader的使用

    1 import java.io.ByteArrayOutputStream; 2 import java.io.File; 3 import java.io.FileInputStream; 4 i ...

  3. Sentry(v20.12.1) K8S 云原生架构探索,玩转前/后端监控与事件日志大数据分析,高性能+高可用+可扩展+可伸缩集群部署

    Sentry 算是目前开源界集错误监控,日志打点上报,事件数据实时分析最好用的软件了,没有之一.将它部署到 Kubernetes,再搭配它本身自带的利用 Clickhouse (大数据实时分析引擎)构 ...

  4. hadoop目录结构

    Hadoop目录结构 重要目录结构: bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本 etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件 lib目录:存放H ...

  5. ASP.NET 上传文件到共享文件夹

    创建共享文件夹参考资料:https://www.cnblogs.com/dansediao/p/5712657.html 上传文件代码 web.config <!--上传文件配置,UploadP ...

  6. [日常填坑系列]CAP食用指南-版本引用问题

    一.前言 最近,由于好久没升级底层框架,一直用着netcore2.2版本,导致有些包没能更新到最新的版本,例如:CAP. 然而,在最近升级到CAP:3.1.2版本的时候,发现有点小坑,只能退回到CAP ...

  7. Vue 组件内滚动条 滚到到底部

    因为在vue中,某个组件内 使用scrollTop赋值 滚动条没有变化 使用scrollTo 也不行(window.scorllTo 或者dom.scrollTo) 所以可以考虑使用投机取巧的办法: ...

  8. 牺牲速度来节省内存,Redis是觉得自己太快了吗

    前言 正常情况下我们选择使用 Redis 就是为了提升查询速度,然而让人意外的是,Redis 当中却有一种比较有意思的数据结构,这种数据结构通过牺牲部分读写速度来达到节省内存的目的,这就是 zipli ...

  9. 【Linux】zabbix4.0服务器搭建,agent搭建,及邮件使用方法

    zabbix默认的 服务端监听端口为10051,而被监控端即Zabbix--agents代理程序监控10050端口. 更新yum源: yum clean all yum makecache 需要配置网 ...

  10. 详解MySQL执行事务的语法和流程

    摘要:MySQL 提供了多种存储引擎来支持事务. MySQL 提供了多种存储引擎来支持事务.支持事务的存储引擎有 InnoDB 和 BDB,其中,InnoDB 存储引擎事务主要通过 UNDO 日志和 ...