




下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、ThreadLocal 很容易让人望文生义,想当然地认为是一个“本地线程ThreadLocal 很容易让人望文生义,想当然地认为是一个“本地线程”。其实,ThreadLocalJava的新发明,很多语言(IBM IBM XL FORTRAN)在语法层面Java 开发者中得到很好的普及。ThreadLocal的接ThreadLocal4 voidset(Object public Object publicvoidJDK5.0 protected 1get()set(Object)1次。ThreadLocalnullJDK5.0 中,ThreadLocal 已经支持泛型,该类的类名已经变为 Th
2、readLocalAPIAPI方法分别是voidset(Tvalue)、 T get()T initialValue()。2.1Service2.1Service方法中调用多方可以看到有一个Service方法,在该Service方法中调用多 Service 方法中的的该Service 方法结束后,提交事务;Service2.2可以看到有一个Service方法,在该Service方法中调用多 Service 方法中的的该Service 方法结束后,提交事务;Service2.2传统的做Service层代码publicvoidserviceMethod() Connection conn=null
3、;Connection123每层的代码每层的代码private Connection conn=null; 1(Connectionconn)public void doSomething() ementpstmt=null; catch(Exceptionlog.error(e,”Execeptionoccurredcatch(Exceptione) catch(Exceptioncatch(Exceptione) catch(Exception如果我一个Service方法有调用一如果我一个Service方法有调用一则,如果有一多关了一个conn,那就会导致其它的connnull 笔者曾经遇
4、见过2个项目出现outofmemory或者是connectionpoolhasbeenleakage,中多关或者在service 层中漏关,或者是每个conntionconn=getConnection()connectio(关个P 关!)。当然,如果你说你在写法上绝对promise 绝对注意这样2.3Spring中的做SpringSpringServicepublicvoidserviceMethod() /aop 自动加入connection,并且catch(Exception/aop /aop自动加/aop catch(Exception这这 的写方法,service方法,不需要关心在哪
5、边commit哪rollback何时connection,spring式事务会负责,这种风 Service层的方开启事务(如果讲究点的还会设一个 在该Service 层中的所有使用该service 方法中开启的事务(即connection); 层中如果发生错误就抛回Service 层 Serviceexceptioncatchrollbacktrycommitfinally块中connection。这。就举个更实际的例子再次来说明 3个用户 同一个 serviceservice3个 方法为一个完整事务,那么整个web 容器内只因该有3 connection,并且每个connection 之间的
6、状态,彼此“ ”。下面一起来看 如何用代码实现类似于Spring的这种做法首先,根的ThreadLocal的概念 2.4ThreadLocalpublicclassConnectionManagerprivate sicThreadLocaltl=newThreadLocal(); private sic Connection conn = null;public sic void Begrans)throwsException if (tl.get() = null | (Connection) tl.get().isClosed() conn=SingletonDBConnection.g
7、etInstance().getConnection(); conn = new ConnectionSpy(conn);if rans)public sicConnectiongetConnection()throwsException return (Connection) tl.get();2.5利用ThreadLocal2.5利用ThreadLocal改造ServiceService 层(注意红色标粗-好粗 yeah,的地方packagepublicclassStudentServiceImplimplementsStudentService publicvoidaddStudent(
8、Studentstd)throwsExceptionpublic sicvoidclose()throwsSQLException try (Connection)catch(Exceptione)(Connection)tl.get().close(); public sicvoidcommit()throwsSQLException try (Connection)catch(Exceptione)try(Connection)catch(Exceptione)public sicvoidrollback()throwsSQLException try (Connection)catch(
9、Exceptione)try(Connection)catch(Exceptione) SpringService方法就诞生了?2.6使用ThreadLocal分离Service先来看表结T_Student= new Student = new ClassRoomtry catch(Exceptione)trycatch(Exceptionde)thrownewfinallytrycatch(Exceptione)需求很简单,T_ClassRoom表里已经有值了,在 T_Student表的数据时同时要给这个学生分配一个班级并且需求很简单,T_ClassRoom表里已经有值了,在 T_Stude
10、nt表的数据时同时要给这个学生分配一个班级并且 T_Student_ClassRoom表,这就是一个事务,这两步中有任何一步看来工程的结构吧 T_ClassRoom2.6.1ConnectionManagerpackagemportpublicclassConnectionManagerprivates privatepublicicThreadLocal2.6.1ConnectionManagerpackagemportpublicclassConnectionManagerprivates privatepublicicThreadLocaltl=newicConnectionconn=i
11、cvoidrans)throwsExceptionif(tl.get()=null|(Connection)tl.get().isClosed()conn =ifrans)2.6.2DBConnection2.6.2DBConnectionpublic sicConnectiongetConnection()throwsException return (Connection) tl.get();public sicvoidclose()throwsSQLException try (Connection)catch(Exceptione)(Connection)tl.get().close(
12、); public sicvoidcommit()throwsSQLException try (Connection)catch(Exceptione)try(Connection)catch(Exceptione)public sicvoidrollback()throwsSQLException try (Connection)catch(Exceptione)try(Connection)catch(Exceptione)packagepublicclassDBConnectionprivates privates privates privates privates privatep
13、ackagepublicclassDBConnectionprivates privates privates privates privates privateprivateicDBConnectioninstance=icStringame=icStringconnectionUrl=null; ic String userName = null;ic String password = null; icConnectionconn=null;icPropertiesjdbcProp=privateDBConnection()private sicPropertiesgetConfigFr
14、omPropertiesFile()throwsException Properties prop = null;prop=JdbcProperties.getPropObjFromFile(); return prop;privateicvoidinitJdbcParameters(Propertiesprop)ame=connectionUrl=prop.getProperty(Constants.CONNECTION_URL); userName = prop.getProperty(Constants.DB_USER_NAME);password=privateicvoidcreate
15、Connection()throwsExceptionconn=DriverManager.getConnection(connectionUrl,userName,public sicConnectiongetConnection()throwsException return conn;public synchronized sicDBConnectiongetInstance()throwsException if (instance = null) jdbcProp=getConfigFromPropertiesFile(); instance = new DBConnection()
16、;2.6.3JdbcPropertiespackage sky.2.6.3JdbcPropertiespackage sky.mport java.io.File;mport mportjava.io.FileNotFoundException; mport java.io.IOException;mportjava.io.InputStream; mport .URL; mport java.util.*;publicclassJdbcPropertiesprivate sicLoglogger=LogFactory.getLog(JdbcProperties.class); public
17、sic Properties getPropObjFromFile() Properties objProp = new Properties(); ClassLoaderclassLoader=Thread.currentThread()URLurl=classLoader.getResource(Constants.JDBC_PROPERTIES_FILE); if (url = null) classLoader=url=Filefile=newFile(url.getFile(); InputStream inStream = null; try inStream=newFileInp
18、utStream(file); catch(FileNotFoundExceptione) objProp = null; catch (IOException e) return instance;2.6.6StudentServiceImplpackage sky.mport java.util.ArrayList; mport java.util.List;mport mport sky.mport sky.6StudentServiceImplpackage sky.mport java.util.ArrayList; mport java.util.List;mport mport
19、sky.mport sky.2.6.5StudentService接package sky.mport java.util.List; mport java.util.Vector; mport sky.tudentServicepublicvoidaddStudent(Studentstd)throws2.6.4Resource目录下的finallytry if(inStream!=null)inStream = null;catch(Exceptione)return2.6.7接2.6.7接package sky.mportjava.util.HashMap; mport java.uti
20、l.List;mport sky.mport sky.mport sky.mport sky.publicclassStudentServiceImplimplementsStudentServicepublic void addStudent(Student std) throws Exception = new Student= new ClassRoomtry catch(Exceptione) try catch(Exceptionde)thrownewfinallytry catch(Exceptione)2.6.8Impl2.6.8Implpackagemportjava.sql.
21、*; mport mport sky. mport sky.publicclassImplimplementspublicvoidaddStudentClassRoom(StringroomId,StringsNo)throwsException Connection conn = null;ementpstmt=null; try conn=ConnectionManager.getConnection(); pstmt = connpstmt.setString(1,roomId); pstmt.setString(2, sNo); catch(Exceptione)thrownewExc
22、eption(addStudentClassRoom:+e.getMessage(),finallytry if(pstmt!=null)pstmt = null;catch(Exceptione)erfacepublicvoidaddStudentClassRoom(StringroomId,StringsNo)throws2.6.10Implpackage.mportmportmportsky. mportmport ;mport java.util.List; mportjava.util.ArrayList; mport java.util.Vector;mportmport publ
23、icclassImplimplementsoglogger2.6.10Implpackage.mportmportmportsky. mportmport ;mport java.util.List; mportjava.util.ArrayList; mport java.util.Vector;mportmport publicclassImplimplementsoglogger=publicvoidaddStudent(Studentstd)throwsException.2.6.9接package sky.mport java.util.*;mport sky.publicvoida
24、ddStudent(Studentstd)throws.Connection conn = null; ementpstmt=null; try conn =pstmt = conn.prepareSConnection conn = null; ementpstmt=null; try conn =pstmt = conn.prepareSpstmt.setString(1, std.getsNo(); pstmt.setString(2, std.getsName(); pstmt.setString(3, std.getsAge();pstmt.setString(4,pstmt.set
25、Date(5,catch(Exceptione)thrownewException(addStudent:+e.getMessage(),finallytry if(pstmt!=null)pstmt = null;catch(Exceptione)publicvoiddelStudent(StringsNo)throwsException Connection conn = null;ementpstmt=null; try conn =pstmt = conn.prepareSpstmt.setString(1, sNo); catch(Exceptione)thrownewExcepti
26、on(delStudent:+e.getMessage(),2.6.12SqlpackagepublicclassSql publicicStringADD_STUDENT_CLASSROOM=o2.6.13ClassRoompackage2.6.12SqlpackagepublicclassSql publicicStringADD_STUDENT_CLASSROOM=o2.6.13ClassRoompackagemport publicclassClassRoomimplementsSerializableprivateStringroomId=.2.6.11Sqlpackage sky.
27、public class StudentSqlpublic final sic String ADD_STUDENT = insertot_student(sno,sname,sage, finallytry if(pstmt!=null)pstmt = null;catch(Exceptione)2.6.14Studentpackagemport 2.6.14Studentpackagemport publicclassStudentimplementsSerializablepublicStringgetsNo() return sNo;publicvoidsetsNo(StringsNo
28、) o = sNo;publicStringgetsName()privateStringroomName=publicStringgetRoomId() return roomId;publicvoidsetRoomId(StringroomId) this.roomId = roomId;publicStringgetRoomName() return roomName;publicvoidsetRoomName(StringroomName) this.roomName = roomName;returnpublicvoidsetsName(StringsName)amereturnpu
29、blicvoidsetsName(StringsName)ame=publicStringgetsAge() return sAge;publicvoidsetsAge(StringsAge) this.sAge = sAge;publicStringgetGender() return gender;publicvoidsetGender(Stringgender) this.gender = gender;private String sNo = ; privateStringsName=; private String sAge = ; privateStringgender=; pri
30、vate String sbirth = ;privateStringclassRoomId=privateStringclassRoomName=publicStringgetClassRoomId() return classRoomId;2.6.15StudentCRUD类(运行主类package2.6.15StudentCRUD类(运行主类packagemport mport mport publicclassStudentCRUDpublicvoidaddStudent()throwsExceptiontdService=newStudentServiceImpl(); Studen
31、t std = new Student();publicvoidsetClassRoomId(StringclassRoomId) this.classRoomId = classRoomId;publicStringgetClassRoomName() return classRoomName;publicvoidsetClassRoomName(StringclassRoomName) this.classRoomName = classRoomName;publicStringgetSbirth() return sbirth;publicvoidsetSbirth(Stringsbir
32、th) this.sbirth = sbirth;Hibernate在事务操作中也支持ThreadLocal 这边指的是不用Spring,Hibernate3与的区ServiceHibernate在事务操作中也支持ThreadLocal 这边指的是不用Spring,Hibernate3与的区Service。publicicvoidmain(Stringargs)StudentCRUDtestStudentCRUD=newStudentCRUD(); try catch(Exceptione)三、Hibernatefinally这时如果用的是caseServicehb 1.doSomething
33、(); hbfinally这时如果用的是caseServicehb 1.doSomething(); hb 2.doSomething(); hb publicvoidtestUser()throwsExceptioniontran=Factoryfactory= = new Usertry factory = HibernateUtil.getInstance().getSes= factory.openSestran = sesTUser testUser = new TUser();catch(Exceptione) thrownewfinallycatch(Excepton自己用Thr
34、eadLocal 模式写一个SesManagement 类,来这个ses自己用ThreadLocal 模式写一个SesManagement 类,来这个ses把在Service方法中打开的,传到每方法中,使每方法使用同一Service方法中去关闭它(很烂的做法)下来看看Hibernate自身提供的3.1.2要使用这个getCurrentSes,你的hibernate的设置必须如下(红色加粗部分显示-就喜欢粗J):?xml =1.0encoding=UTF-!DOCTYPEhibernate-configuration-/Hibernate/HibernateConfigurationDTD propertypropertyproperty propertyproperty/TUser.hbm.xmlpublicvoidtestUser()throwsExceptioniontran=publicvoidaddUser(TUseruser)throwsExceptionFactorypublicvoidaddUser(TUseruser)throwsExceptionFactoryfactory= factory.getCurrentSes3.1.3
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年证券从业资格证考试复习准备与知识整合试题及答案
- 规范体电子警察系统技术投标文件
- 行政管理师考试发展方向展望及试题及答案
- 2025年银行从业资格考试真题研究试题及答案
- 广东、上海科学推理系统课讲义-物理部分
- 2025年证券从业资格证考生须知试题及答案
- 寻找灵感2025年证券从业考试试题及答案
- 2025年证券从业资格证知识框架试题及答案
- 技能 课题 申报书
- 证券从业资格证的预测试题及答案
- 食品小摊贩备案卡(样式)及说明
- 针刀操作安全区带
- THBFIA 0004-2020 红枣制品标准
- GB/T 6072.1-2000往复式内燃机性能第1部分:标准基准状况,功率、燃料消耗和机油消耗的标定及试验方法
- 苏教版科学(2017)六年级下册教学计划及教学进度表
- 测量小灯泡的功率实验报告单
- 图书馆建筑设计规范讲解课件
- 四川省教师资格认定体检表
- 培养中班幼儿正确使用筷子的研究的结题报告
- 湘教版七年级上册等高线地形图
- 车间改造合同范文
评论
0/150
提交评论