S详细讲解SH中Spring事务流程.docx

上传人:b****9 文档编号:25560497 上传时间:2023-06-09 格式:DOCX 页数:13 大小:19.73KB
下载 相关 举报
S详细讲解SH中Spring事务流程.docx_第1页
第1页 / 共13页
S详细讲解SH中Spring事务流程.docx_第2页
第2页 / 共13页
S详细讲解SH中Spring事务流程.docx_第3页
第3页 / 共13页
S详细讲解SH中Spring事务流程.docx_第4页
第4页 / 共13页
S详细讲解SH中Spring事务流程.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

S详细讲解SH中Spring事务流程.docx

《S详细讲解SH中Spring事务流程.docx》由会员分享,可在线阅读,更多相关《S详细讲解SH中Spring事务流程.docx(13页珍藏版)》请在冰豆网上搜索。

S详细讲解SH中Spring事务流程.docx

S详细讲解SH中Spring事务流程

给你详细讲一下SSH框架的事物管理,希望对你有帮助。

Struts+hibernate+spring整合开发web应用是相当流行的,只需要简单的配置就能轻松的对数据库进行crud操作,下面就hibernate+spring的配置做一下剖析,一边与大家一起分享经验:

1、准备工作:

可以利用hibernatetools生成相关映射文件已经po对象、dao对象,dao也可以自己手动编写,无非就是实现crud,如果通过继承hibernate提供的HibernateDaoSupport,则可以更轻松的实现

关键就在于配置文件,下面看一个样例app.xml:

xmlversion="1.0"encoding="utf-8"?

>

xmlns:

xsi=".w3.org/2001/XMLSchema-instance"

xsi:

schemaLocation=".springframework.org/schema/beans.springframework.org/schema/beans/spring-beans.xsd">

--配置数据源-->

--指定连接数据库的驱动-->

--指定连接数据库的URL-->

mysql:

//localhost/auction"/>

--指定连接数据库的用户名-->

--指定连接数据库的密码-->

--指定连接数据库连接池的最XX接数-->

--指定连接数据库连接池的最小连接数-->

--指定连接数据库连接池的初始化连接数-->

--指定连接数据库连接池的连接的最大空闲时间-->

 

--配置数据库会话工厂-->

/ouya/User.hbm.xml

org.hibernate.dialect.MySQLDialect

true

true

 

--配置事务管理器-->

—-配置Spring事务管理器代理-->

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

--Hibernate模板-->

--服务层对象-->

--spring代理用户服务对象-->

--如果上面的服务层对象实现了接口,则此处必须设置proxyTargetClass为true,否则会报classcast异常-->

---->

--用户数据访问对象DATAACCESSOBJECT-->

可以看到配置文件的步骤:

1、配置数据源

2、配置会话工厂(依赖注入上面的数据源,还要注入hbm映射文件[注意正确的位置]、hibernate属性文件)

3、配置事务管理器(依赖注入上面的会话工厂)

4、Spring中声明事务管理器(根据需要又可分为几种,但都要依赖注入上面的事务管理器,此外还需要配置transationAttributes)

后面的一些普通的bean配置就不用说了

上面的例子中使用的声明事务管理器是:

TransactionProxyFactoryBean,这样的话我们就需要在后面配置目标bean,比如上面的例子中我们的原服务对象是id为us的UserService(没有实现接口),所以我们为他配置了id为userService的代理对象(目标bean),程序中使用时只能通过使用代理对象才能实现数据库操作功能(代理对象的父类是上面声明的事务管理器,一边我们使用的时候开启事务),如果直接使用服务对象就无法开启事务

程序中调用:

UserServiceus=(UserService)app.getBean("userService");

注:

userService就是上面配置的代理对象的id,而不是原服务对象的id

 

但是如果我们想通过原服务对象的id来使用对象,则我们需要使用代理事务管理器BeanNameAutoProxyCreator(根据beanname自动代理),上面的配置文件需要做改动,做两件事(当然先要删除原来配置的TransactionProxyFactoryBean,不然就混乱了,可能会报错的):

1、增加一个事务拦截器

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

PROPAGATION_REQUIRED,readOnly

2、定义自动代理事务管理器

--定义BeanNameAutoProxyCreator-->

--如果服务层对象是接口实现类,则需要设置proxyTargetClass属性为true-->

--

--指定对满足哪些beanname的bean自动生成业务代理-->

--下面是所有需要自动创建事务代理的bean-->

us

--此处可增加其他需要自动创建事务代理的bean-->

--下面定义BeanNameAutoProxyCreator所需的事务拦截器-->

--此处可增加其他新的Interceptor-->

transactionInterceptor

然后我们在程序中调用时应如下:

UserServiceus=(UserService)app.getBean("us");

注:

注意与上面使用TransactionProxyFactoryBean时的调用区别,此处我们用getbean时直接取原服务层对象的id,不需要去配置目标bea,这也正是

BeanNameAutoProxyCreator(根据bean名称自动代理)的含义所在

 

附录:

1、关于hibernate的属性详解:

--以下配置都是使用jdbc.properties属性文件中的配置,而之所以可以这样写,就是因为有属性占位符配置的原因-->

--连接池维持的最小的连接个数-->

--连接池维持的最大的连接个数-->

--最大空闲时间,当某个连接在这个时间内没活动后将从池中移除,前提是池中至少多于最少的连接数:

minPoolSize-->

--为加强准备语句的执行性能,此参数指定被缓存的PreparedStatement的个数-->

 

Hibernate会话厂SessionFactory

Session就是用于每次与数据库会话的,因此需要:

数据库的配置参数,这些参数就是上面的数据源指定的!

因此我们只需引用即可:

ref="dataSource";

实体映射配置hibernate.cfg.xml配置

结果缓存配置(这里使用的是开源的ehcache)

 

--HibernateSessionFactory-->

--引用前面定义的数据源-->

--所有实体映射文件列表,所有的hbm.xml文件-->

org/springframework/samples/jpetstore/domain/Account.hbm.xml

org/springframework/samples/jpetstore/domain/Banner.hbm.xml

org/springframework/samples/jpetstore/domain/Category.hbm.xml

org/springframework/samples/jpetstore/domain/Inventory.hbm.xml

org/springframework/samples/jpetstore/domain/Item.hbm.xml

org/springframework/samples/jpetstore/domain/LineItem.hbm.xml

org/springframework/samples/jpetstore/domain/Order.hbm.xml

org/springframework/samples/jpetstore/domain/Product.hbm.xml

org/springframework/samples/jpetstore/domain/Supplier.hbm.xml

--传统上的hibernate.cfg.xml文件的参数放在这里-->

--指定数据库方言-->

${hibernate.dialect}

--是否在日志中输出所有Hibernate与数据库交互的SQL语句-->

true

--是否在日志中输出的SQL语句格式化成易读形式-->

true

--是否显示统计形式,一般在测试阶段使用-->

true

--对于级联查询,一次性获取的级联深度,todo需进一步研究-->

2

--

FetchSize是设定JDBC的Statement读取数据的时候每次从数据库中取出的记录条数,一般设置为30、50、100。

Oracle数据库的JDBC驱动默认的FetchSize=15,设置FetchSize设置为:

30、50,性能会有明显提升,如果继续增大,

超出100,性能提升不明显,反而会消耗内存。

-->

100

--

不必等到累计到50个SQL之后才执行.只要事务mit后,不管缓存中有多少条sql语句都要执行.

hibernate.jdbc.batch_size参数只是设定一次最多可以提交多少sql语句的上限,提高sql语句的执行效率

-->

50

--

(1)create在每次SesstionFactory构建时(一般是应用重启时,或者伴随着应用服务器重启时),先将之前数据库中的所有数据全

部清空,后紧跟着根据所有的hbm.xml映射文件重新创建新的数据库表

 

(2)create-drop除了create的所有含义之外,在每次应用的退出前,将进行一次数据空清空。

因此这个配置将有两次清空操作,

一次是退出,一次是启动时。

 

(3)update

如果在开发阶段理发了实体对象的映射文件(hbm.xml)的定义后,此配置将后台的数据库表进行更新(如增加表的列)

 

(4)validate

用于校验现有的表与现有的配置是否一致。

-->

update

--见下面的解释-->

update

--结果缓存配置:

-将ehcache.xml置于classpath中-如果不设置“查询缓存”,

那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、

Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置

hibernate.cache.use_query_cachetrue才行-在Hbm文件中添加-

如果需要“查询缓存”,还需要在使用Query或Criteria()时设置其setCacheable(true);属性-->

true

org.hibernate.cache.EhCacheProvider

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 外语学习 > 英语学习

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1