1. การทำธุรกรรมสปริงประกาศ
1.1 ผู้จัดการธุรกรรมของฤดูใบไม้ผลิ
ฤดูใบไม้ผลิไม่ได้จัดการธุรกรรมโดยตรง แต่มอบหมายความรับผิดชอบในการจัดการธุรกรรมเพื่อการใช้งานการทำธุรกรรมของแพลตฟอร์มเฉพาะที่จัดทำโดย JTA หรือกลไกการคงอยู่ที่สอดคล้องกัน คอนเทนเนอร์สปริงมีหน้าที่รับผิดชอบในการดำเนินงานของสิ่งต่าง ๆ คอนเทนเนอร์สปริงทำหน้าที่เป็นใบหน้าและวิธีการทำธุรกรรมเรียกว่าการประมวลผลการปรับปรุง วิธีการพร็อกซีที่สร้างขึ้นเป็นวิธีการเป้าหมาย + การปรับปรุงนั่นคือโปรแกรมเมอร์ธุรกรรมจะใช้การดำเนินการ CRUD เท่านั้นนั่นคือวิธีการเป้าหมายและวิธีการที่ประกาศควรทำงานในการทำธุรกรรม
ฤดูใบไม้ผลิมีการใช้งาน Transaction Manager ในตัวจำนวนมาก:
DataSourceTransactionManager: ตั้งอยู่ในแพ็คเกจ org.springframework.jdbc.datasource ผู้จัดการธุรกรรมแหล่งข้อมูลให้การจัดการธุรกรรม javax.sql.datasource เดียวสำหรับการจัดการธุรกรรมของ Framework
JDOTRANSActionManager: ตั้งอยู่ในแพ็คเกจ org.springframework.orm.jdo ให้การจัดการธุรกรรมของ Javax.jdo.persistenceManagerfactory สำหรับการจัดการธุรกรรมเมื่อรวมกรอบ JDO;
JPatransactionManager: ตั้งอยู่ในแพ็คเกจ org.springframework.orm.jpa ให้การสนับสนุนสำหรับการทำธุรกรรม javax.persistence.entityManagerFactory และใช้เพื่อจัดการธุรกรรมเมื่อรวมกรอบการใช้งาน JPA;
HibernatretransactionManager: ตั้งอยู่ในแพ็คเกจ org.springframework.orm.hibernate3 ให้การสนับสนุนสำหรับ org.hibernate.sessionfactory ธุรกรรมการจัดการการทำธุรกรรมเมื่อรวมกรอบ Hibernate; ผู้จัดการธุรกรรมนี้รองรับรุ่น Hibernate3+ เท่านั้นและเวอร์ชัน Spring3.0+ รองรับรุ่น Hibernate 3.2+ เท่านั้น
JTatransactionManager: ตั้งอยู่ใน org.springframework.transaction.jta แพ็คเกจการให้การสนับสนุนสำหรับการจัดการธุรกรรมแบบกระจายและมอบหมายการจัดการธุรกรรมให้กับผู้จัดการธุรกรรมเซิร์ฟเวอร์แอปพลิเคชัน Java EE;
OC4JJTATRANSACTIONMANAGER: อยู่ใน ORG.SPRINGFRAMEWORK.TransAction.jta แพ็คเกจสปริงจัดเตรียมอะแดปเตอร์ไปยัง OC4J10.1.3+ ตัวจัดการธุรกรรมเซิร์ฟเวอร์แอปพลิเคชัน อะแดปเตอร์นี้ใช้เพื่อรองรับธุรกรรมขั้นสูงที่จัดทำโดยแอปพลิเคชันเซิร์ฟเวอร์
WebSphereUowTransactionManager: อยู่ใน org.springframework.transaction.jta แพ็คเกจสปริงจัดเตรียมอะแดปเตอร์สำหรับ WebSphere 6.0+ แอปพลิเคชันเซิร์ฟเวอร์ธุรกรรมการทำธุรกรรมเซิร์ฟเวอร์ อะแดปเตอร์นี้ใช้เพื่อรองรับธุรกรรมขั้นสูงที่จัดทำโดยแอปพลิเคชันเซิร์ฟเวอร์
WebLogicJTatransactionManager: อยู่ใน org.springframework.transaction.jta แพ็คเกจสปริงจัดเตรียมอะแดปเตอร์ให้กับ WebLogic 8.1+ แอปพลิเคชันเซิร์ฟเวอร์ธุรกรรม อะแดปเตอร์นี้ใช้เพื่อรองรับธุรกรรมขั้นสูงที่จัดทำโดยแอปพลิเคชันเซิร์ฟเวอร์
ฤดูใบไม้ผลิไม่เพียง แต่ให้ผู้จัดการธุรกรรมเหล่านี้ แต่ยังมีผู้จัดการสำหรับการจัดการธุรกรรม JMS ฯลฯ สปริงให้การทำธุรกรรมที่สอดคล้องกันตามที่แสดงในรูป
ฤดูใบไม้ผลิและไฮเบอร์เนต
ภาพประกอบ:
ฤดูใบไม้ผลิทำการเตรียมการบางอย่างก่อนที่จะเรียกตัวจัดการธุรกรรมเฉพาะการตั้งค่านโยบายการอ่านและเขียนของธุรกรรมล่วงหน้าและนโยบายการทำธุรกรรมเหล่านี้เป็นสิ่งที่สาธารณะและเขียนไว้ในไฟล์การกำหนดค่าฤดูใบไม้ผลิ การประมวลผลของเนื้อหาเหล่านี้จำเป็นต้องวางไว้ในคลาสนามธรรม
2. การประมวลผลธุรกรรมในการรวมสปริงและไฮเบอร์เนต
1.2 การแนะนำไฟล์การกำหนดค่าคุณสมบัติในรูปแบบ XML
<property name = "locations"> <value> classpath: jdbc.properties </alue> </porement>
กำหนดค่าแหล่งข้อมูล DBCP
<bean id = "dataSource" destroy-method = "close"> <property name = "driverclassname" value = "$ {jdbc.driverclassName}" /> <property name = "url" value = "$ {jdbc.Url}" /> <property name = "username" value = "$ {jdbc.password}" /> </ebean>แนะนำ SessionFactory ใช้ไฟล์กำหนดค่าภายนอก hibernate
<bean id = "SessionFactory2"> <property name = "configlocation"> <value> classpath: hibernate.cfg.xml </value> </porement> </ebean>
ฉีด DAO และชั้นบริการ
<bean id = "persondao"> <property name = "sessionfactory"> <ref bean = "sessionfactory2"/> </property> </epean> <bean id = "personservice"> <property name = "persondao"> <ref bean = "persondao"/>
กำหนดค่าตัวจัดการธุรกรรมไฮเบอร์เนต
<bean id = "transactionManager"> <property name = "sessionFactory"> <ref bean = "SessionFactory2"/> </porement> </ebean>
กำหนดค่าการทำธุรกรรมที่ประกาศ
ผล:
1. บอกผู้จัดการธุรกรรมสปริงคอนเทนเนอร์
2. บอกสปริงคอนเทนเนอร์วิธีการใช้ธุรกรรมใด
<TX: คำแนะนำการทำธุรกรรม-manager = "transactionManager" id = "tx"> <tx: แอตทริบิวต์> <!-ขอบเขตชื่อของวิธีการเป้าหมายการแยกระดับการแพร่กระจายการแพร่กระจายการแพร่กระจายการแพร่กระจายการแพร่กระจายของการอ่านอย่างแท้จริงการอ่านค่าการอ่าน " </tx: แอตทริบิวต์> </tx: คำแนะนำ>
กำหนดค่าจุดเข้า
<aop: config> <aop: pointcut expression = "การดำเนินการ (*cn.qjc.hibernate.service.impl.*.*(.. ))" id = "perform"/> <span style = "space สีขาว: pre"> </span> <!
คลาสการใช้งาน DAO
* วิธีการใช้งาน 1: สืบทอด HibernatedaoSupport * @author qjc */ คลาสสาธารณะ Persondaoimpl ขยาย Hibernatedaosupport ใช้ Persondao {@Override โมฆะสาธารณะ Saveperson (บุคคลบุคคล) -ทดสอบ
-
สังเกต:
1. หากคลาส DAO สืบทอด HibernatedaoSupport คุณจะต้องฉีด SessionFactory ลงในไฟล์การกำหนดค่าสปริง
2. หากคลาส DAO ไม่ได้สืบทอด HibernatedaoSupport มันจะต้องมีแอตทริบิวต์ SessionFactory และฉีดเข้าไปในไฟล์การกำหนดค่า
<bean id = "hibernatetemplate"> <property name = "SessionFactory" ref = "SessionFactory2"> </porement> </ebean>
1.2 ในรูปแบบของคำอธิบายประกอบ
1. ใช้กลไกการสแกนอัตโนมัติของ Spring ในไฟล์การกำหนดค่า
<บริบท: Component-Scan base-package = "cn.qjc"/>>>
2. แนะนำตัวแยกวิเคราะห์คำอธิบายประกอบในไฟล์กำหนดค่า
<TX: Transaction-Driven Transaction-Manager = "TransactionManager"/>>>
3. คำอธิบายประกอบผ่าน @Transaction ที่ชั้นบริการ
หมายเหตุ: หากมีคำอธิบายประกอบเป็นการทำธุรกรรมแบบอ่านอย่างเดียวในระดับคลาสการตั้งค่าการทำธุรกรรมของ @Transaction หมายเหตุประกอบในวิธีการในชั้นเรียนนี้จะมีความสำคัญกว่าการตั้งค่าการทำธุรกรรมของระดับชั้นเรียน
1.3 คุณสมบัติการแพร่กระจายของธุรกรรมฤดูใบไม้ผลิ
จำเป็น: วิธีการทางธุรกิจจะต้องดำเนินการในการทำธุรกรรม หากวิธีการนั้นอยู่ในการทำธุรกรรมเมื่อทำงานอยู่ให้เข้าร่วมกับการทำธุรกรรมมิฉะนั้นสร้างธุรกรรมใหม่สำหรับตัวคุณเอง (ค่าเริ่มต้น)
ไม่ได้รับการสนับสนุน: คอนเทนเนอร์สปริงไม่ได้เปิดธุรกรรม หากวิธีการถูกเรียกในธุรกรรมการทำธุรกรรมจะถูกระงับ หลังจากวิธีการเสร็จสิ้นการทำธุรกรรมจะถูกกู้คืน
ต้องใช้เวลา: ไม่ว่าจะมีการทำธุรกรรมหรือไม่วิธีการทางธุรกิจจะสร้างธุรกรรมใหม่เสมอ
Mandatorky: วิธีการทางธุรกิจสามารถดำเนินการในการทำธุรกรรมที่มีอยู่เท่านั้น หากวิธีการทางธุรกิจถูกเรียกโดยไม่มีการทำธุรกรรมคอนเทนเนอร์จะมีข้อยกเว้น
นอกจากนี้ยังมีคุณสมบัติเช่นการสนับสนุนไม่เคยซ้อนกัน ฯลฯ แต่มักจะใช้ค่าเริ่มต้น
การแพร่กระจาย = "จำเป็น" การกำหนดค่านี้สามารถแก้ปัญหาการทำรังของธุรกรรมได้ ธุรกรรมทำรังคืออะไร?
ตัวอย่างเช่น:
มีการทำธุรกรรมในกรอบเวิร์กโฟลว์และวิธีการบางอย่างที่ใช้งานเลเยอร์บริการ ชั้นบริการยังมีธุรกรรมของตัวเอง เมื่อมีการดำเนินการบริการการทำธุรกรรมการทำธุรกรรมจะเกิดขึ้นนั่นคือวิธีการนั้นมีธุรกรรมและวิธีการในวิธีนี้ยังมีธุรกรรม นี่คือการทำรังธุรกรรม ฤดูใบไม้ผลิแก้ปัญหานี้ผ่านการแพร่กระจายแอตทริบิวต์การทำธุรกรรม = "จำเป็น"
1.4 OpenInsessionView
หลังจากการรวม S2SH สปริงจัดการธุรกรรม เนื่องจากใช้วิธีการประมวลผลธุรกรรมการประกาศของสปริงเซสชันจะปิดทันทีหลังจากโทรไปที่วิธีการ GetHiberNateTemplate () หากมีธุรกรรมในวิธีการที่ดำเนินการในปัจจุบันเซสชันจะถูกปิดเมื่อเรียกใช้วิธีการของสภาพแวดล้อมการทำธุรกรรม ดังนั้นข้อยกเว้นจะถูกสร้างขึ้นเมื่อค่าถูกส่งออกบนหน้า
วิธีการประมวลผลคือ: OpenSessionInview Mode (กำหนดค่าใน web.xml)
<silter> <filter-Name> HibernateFilter </filter-name> <supplass> org.springframework.orm.hibernate3.support.opensessionInviewFilter </filter-class> <! หากตั้งค่าเป็นเท็จจะไม่มีการเปิดใช้งาน OpenSessionInview-> <init-Param> <param-Name> Singlesession </param-name> <param-value> True </param-value> </itt-param> </ilter> <filter-mapping> </ตัวกรองการทำแผนที่>
จากรหัสข้างต้นเราจะเห็นว่าเมื่อส่งคำขอเซสชันได้รับการเปิดใช้งานใน OpenSessionInview และเซสชันจะต้องปิดหลังจากการตอบกลับซึ่งหมายความว่า OpenSessionInview จะต้องเป็นก่อนที่ตัวกรองของ struts2 (ใส่ตำแหน่งตัวกรอง struts2 ด้านบน)
อย่างไรก็ตามมันยังมีข้อเสียในการเปิดใช้งาน OpenSessionInview: เนื่องจากการปิดเซสชันล่าช้าและแคชระดับแรกของไฮเบอร์เนตอยู่ในเซสชั่นซึ่งจะทำให้ข้อมูลแคชจำนวนมากอยู่ในหน่วยความจำเป็นเวลานาน
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้ ฉันหวังว่ามันจะเป็นประโยชน์ต่อการเรียนรู้ของทุกคนและฉันหวังว่าทุกคนจะสนับสนุน wulin.com มากขึ้น