S詳細(xì)講解SH中Spring事務(wù)流程_第1頁
S詳細(xì)講解SH中Spring事務(wù)流程_第2頁
S詳細(xì)講解SH中Spring事務(wù)流程_第3頁
S詳細(xì)講解SH中Spring事務(wù)流程_第4頁
S詳細(xì)講解SH中Spring事務(wù)流程_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、給你詳細(xì)講一下S S H框架的事物治理,希望對(duì)你有幫助.Struts+hibernate+spring整合開發(fā)web應(yīng)用是相當(dāng)流行的,只需要簡單的配置 就能輕松的對(duì)數(shù)據(jù)庫進(jìn)行crud操作,下面就hibernate + spring的配置做一下剖 析,一邊與大家一起分享經(jīng)驗(yàn):1、準(zhǔn)備工作:可以利用hibernate tools生成相關(guān)映射文件已經(jīng) po對(duì)象、dao對(duì)象,dao也可 以自己手動(dòng)編寫,無非就是實(shí)現(xiàn) crud ,如果通過繼承hibernate提供的HibernateDaoSupport,那么可以更輕松的實(shí)現(xiàn)關(guān)鍵就在于配置文件,下面看一個(gè)樣例app.xml :<?xml versi

2、on="1.0" encoding="utf-8"?><beans xmlns=" "xmlns:xsi=" "xsi:schemaLocation=" "><!配置數(shù)據(jù)源-><!-指定連接數(shù)據(jù)庫的驅(qū)動(dòng)-><!-指定連接數(shù)據(jù)庫的URL-><!-指定連接數(shù)據(jù)庫的用戶名-><property name="user" value="root"/><!-指定連接數(shù)據(jù)庫的密碼->

3、;<property name="password" value="root"/><!-指定連接數(shù)據(jù)庫連接池的最大連接數(shù) -><property name="maxPoolSize" value="20/><!-指定連接數(shù)據(jù)庫連接池的最小連接數(shù) -><property name="minPoolSize" value="1"/><!-指定連接數(shù)據(jù)庫連接池的初始化連接數(shù) -><property name=&qu

4、ot;initialPoolSize" value="1"/><!-指定連接數(shù)據(jù)庫連接池的連接的最大空閑時(shí)間 -><property name="maxIdleTime" value="20"/></bean><!-配置數(shù)據(jù)庫會(huì)話工廠-><property name="dataSource" ref="dataSource"/><property name="mappingResources"&

5、gt;<list></list></property><property name="hibernateProperties"><props><prop key="hibernate.show_sql">true</prop></props></property></bean>v!-配置事務(wù)治理器<property name="sessionFactory"><reflocal="sess

6、ionFactory'7></property></bean>v!-配置Spring事務(wù)治理器代理-><property name="transactionManager"><ref local="transactionManager'7></property><property name="transactionAttributes"><props><prop key="save*">PROPAGAT

7、ION_REQUIRED</prop><prop key="insert*">PROPAGATION_REQUIRED</prop><prop key="del*">PROPAGATION_REQUIRED</prop><prop key="add*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop><p

8、ropkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey="remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop>

9、<prop key="list*">PROPAGATION_REQUIRED,readOnly</prop><propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><prop key="get*">PROPAGATION_REQUIRED,readOnly</prop></props></property></bean><!- Hibernate 模板一A<prop

10、erty name="sessionFactory"><ref local="sessionFactory" /></property></bean>v!一效勞層對(duì)象><property name="userDao"><ref local="userDao'7></property></bean><!- spring代理用戶效勞對(duì)象-><bean id="userService" pa

11、rent="transactionProxyFactory"><!-如果上面的效勞層對(duì)象實(shí)現(xiàn)了接口,那么此處必須設(shè)置proxyTargetClass為true ,否那么會(huì)報(bào)classcast異常-><!-<property name="proxyTargetClass" value="true/>-><property name="target" ref="us"/></bean><!-用戶數(shù)據(jù)訪問對(duì)象 DATA ACCESS OBJ

12、ECT -><property name="hibernateTemplate" ref="hibernateTemplate"/> </bean></beans>可以看到配置文件的步驟:1、 配置數(shù)據(jù)源2、 配置會(huì)話工廠依賴注入上面的數(shù)據(jù)源,還要注入hbm映射文件注意正確的位置卜hibernate屬性文件3、 配置事務(wù)治理器依賴注入上面的會(huì)話工廠4、 Spring中聲明事務(wù)治理器根據(jù)需要又可分為幾種,但都要依賴注入上面 的事務(wù)治理器,此外還需要配置 transationAttributes 后面的一些普通的be

13、an配置就不用說了上面的例子中使用的聲明事務(wù)治理器是:TransactionProxyFactoryBean,這樣的 話我們就需要在后面配置目標(biāo) bean ,比方上面的例子中我們的原效勞對(duì)象是id為us的UserService 沒有實(shí)現(xiàn)接口,所以我們?yōu)樗渲昧?id為userService 的代理對(duì)象目標(biāo)bean,程序中使用時(shí)只能通過使用代理對(duì)象才能實(shí)現(xiàn)數(shù)據(jù) 庫操作功能代理對(duì)象的父類是上面聲明的事務(wù)治理器,一邊我們使用的時(shí)候開啟事務(wù),如果直接使用效勞對(duì)象就無法開啟事務(wù)程序中調(diào)用: UserService us = UserService app.getBean"userService

14、"注:userService就是上面配置的代理對(duì)象的id,而不是原效勞對(duì)象的id 但是如果我們想通過原效勞對(duì)象的id來使用對(duì)象,那么我們需要使用代理事務(wù)管 理器BeanNameAutoProxyCreator 根據(jù)beanname自動(dòng)代理,上面的配置 文件需要做改動(dòng),做兩件事當(dāng)然先要?jiǎng)h除原來配置的 TransactionProxyFactoryBean ,不然就混亂了,可能會(huì)報(bào)錯(cuò)的: 1、 增加一個(gè)事務(wù)攔截器<property name="transactionManager"><ref local="transactionManage

15、r"/></property><property name="transactionAttributes"><props><prop key="save*">PROPAGATION_REQUIRED</prop><prop key="insert*">PROPAGATION_REQUIRED</prop><prop key="del*">PROPAGATION_REQUIRED</prop>&

16、lt;prop key="add*">PROPAGATION_REQUIRED</prop><prop key="update*">PROPAGATION_REQUIRED</prop><propkey="find*">PROPAGATION_REQUIRED,readOnly</prop><propkey="search*">PROPAGATION_REQUIRED,readOnly</prop><propkey=&q

17、uot;remove*">PROPAGATION_REQUIRED,readOnly</prop><propkey="query*">PROPAGATION_REQUIRED,readOnly</prop><prop key="list*">PROPAGATION_REQUIRED,readOnly</prop><propkey="count*">PROPAGATION_REQUIRED,readOnly</prop><prop

18、key="get*">PROPAGATION_REQUIRED,readOnly</prop> </props></property></bean>2、定義自動(dòng)代理事務(wù)治理器<!-定義 BeanNameAutoProxyCreator-><!-如果效勞層對(duì)象是接口實(shí)現(xiàn)類,那么需要設(shè)置proxyTargetClass屬性為true-><!-<property name="proxyTargetClass" value="true"-><

19、!-指定對(duì)滿足哪些bean name的bean自動(dòng)生成業(yè)務(wù)代理-><property name="beanNames"><!-下面是所有需要自動(dòng)創(chuàng)立事務(wù)代理的bean-><list><value>us</value></list><!-此處可增加其他需要自動(dòng)創(chuàng)立事務(wù)代理的bean-></property><!- 下面定義BeanNameAutoProxyCreator 所需的事務(wù)攔截器-><property name="interceptorNa

20、mes"><list><!-此處可增加其他新的Interceptor -><value>transactionInterceptor</value></list></property></bean>然后我們在程序中調(diào)用時(shí)應(yīng)如下:UserService us = (UserService) app.getBean("us");注:注意與上面使用TransactionProxyFactoryBean 時(shí)的調(diào)用區(qū)別,此處我們用 getbean時(shí)直接取原效勞層對(duì)象的id,不需要去配置

21、目標(biāo)bea,這也正是 BeanNameAutoProxyCreator(根據(jù)bean名稱自動(dòng)代理)的含義所在附錄:1、關(guān)于hibernate的屬性詳解:<!-以下配置都是使用perties屬性文件中的配置,而之所以可以這樣 寫,就是由于有 屬性占位符配置的原因-><property name="driverClass" value="$jdbc.driverClassName"/><property name="jdbcUrl" value="$jdbc.url"/&g

22、t;<property name="user" value="$jdbc.username"/><property name="password" value="$jdbc.password"/><!-連接池維持的最小的連接個(gè)數(shù)-><property name="minPoolSize" value="5"/><!-連接池維持的最大的連接個(gè)數(shù)-><property name="maxPoolSize&

23、quot; value="20/><!-最大空閑時(shí)間,當(dāng)某個(gè)連接在這個(gè)時(shí)間內(nèi)沒活動(dòng)后將從池中移除,前提是池中至少多于最少的連接數(shù):minPoolSize -><property name="maxIdleTime" value="1800/><!-為增強(qiáng)準(zhǔn)備語句的執(zhí)行性能,此參數(shù)指定被緩存的PreparedStatement的個(gè)數(shù)-><property name="maxStatements" value="50"/></bean>Hibernate

24、 會(huì)話廠 SessionFactorySession就是用于每次與數(shù)據(jù)庫會(huì)話的,因此需要:數(shù)據(jù)庫的配置參數(shù),這些參數(shù)就是上面的數(shù)據(jù)源指定的!因此我們只需引用即可: ref="dataSource";結(jié)果緩存配置這里使用的是開源的 ehcache<!- Hibernate SessionFactory -><!-引用前面定義的數(shù)據(jù)源-><property name="dataSource" ref="dataSource"/><!-所有實(shí)體映射文件列表,所有的hbm.xml文件-><

25、property name="mappingResources><list></list></property><property name="hibernateProperties"><props><!-指定數(shù)據(jù)庫方百-><prop key="hibernate.dialect">$hibernate.dialect</prop><!-是否在日志中輸出所有 Hibernate與數(shù)據(jù)庫交互的SQL語句-><prop key=&

26、quot;hibernate.show_sql>true</prop><!-是否在日志中輸出的SQL語句格式化成易讀形式-><prop key="hibernate.format_sql">true</prop><!-是否顯示統(tǒng)計(jì)形式,一般在測試階段使用-><prop key="hibernate.generate_statistics">true</prop><!-對(duì)于級(jí)聯(lián)查詢,一次性獲取的級(jí)聯(lián)深度,todo需進(jìn)一步研究-><prop key=&

27、quot;hibernate.max_fetch_depth">2</prop><!-Fetch Size是設(shè)定JDBC的Statement讀取數(shù)據(jù)的時(shí)候每次從數(shù)據(jù)庫中取出的 記錄條數(shù),一般設(shè)置為30、50、100.Oracle數(shù)據(jù)庫的JDBC驅(qū)動(dòng)默認(rèn)的Fetch Size=15 ,設(shè)置Fetch Size設(shè)置為:30、50,性能會(huì)有明顯提升,如果繼續(xù)增大,超出100,性能提升不明顯,反而會(huì)消耗內(nèi)存.-><!-不必等到累計(jì)到50個(gè)SQL之后才執(zhí)行.只要事務(wù)commit后,不管緩存中有多少 條sql語句都要執(zhí)行.-><!-(1)creat

28、e在每次SesstionFactory 構(gòu)建時(shí)(一般是應(yīng)用重啟時(shí),或者伴隨著應(yīng)用 效勞器重啟時(shí)),先將之前數(shù)據(jù)庫中的所有數(shù)據(jù)全部清空,后緊跟著根據(jù)所有的hbm.xml映射文件重新創(chuàng)立新的數(shù)據(jù)庫表(2)create-drop除了 create的所有含義之外,在每次應(yīng)用的退出前,將進(jìn)行一次數(shù)據(jù)空清空.因此這個(gè)配置將有兩次清空操作,一次是退出,一次是啟動(dòng)時(shí).(3)update如果在開發(fā)階段理發(fā)了實(shí)體對(duì)象的映射文件(hbm.xml)的定義后,此配置將后臺(tái)的數(shù)據(jù)庫表進(jìn)行更新(如增加表的列)(4)validate用于校驗(yàn)現(xiàn)有的表與現(xiàn)有的配置是否一致.-><!-見下面的解釋-><!-結(jié)果緩存配置:-將ehcache.xml置于classpath中-如果不設(shè)置查詢緩存,那么hibernate只會(huì)緩存使用10ad()方法獲得的單個(gè)持久化對(duì)象,如果想緩存使用 findal

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論