BSSQC数据库连接和事务管理专题.docx

上传人:lao****ou 文档编号:653195 上传时间:2024-03-19 格式:DOCX 页数:9 大小:57.79KB
下载 相关 举报
BSSQC数据库连接和事务管理专题.docx_第1页
第1页 / 共9页
BSSQC数据库连接和事务管理专题.docx_第2页
第2页 / 共9页
BSSQC数据库连接和事务管理专题.docx_第3页
第3页 / 共9页
BSSQC数据库连接和事务管理专题.docx_第4页
第4页 / 共9页
BSSQC数据库连接和事务管理专题.docx_第5页
第5页 / 共9页
亲,该文档总共9页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《BSSQC数据库连接和事务管理专题.docx》由会员分享,可在线阅读,更多相关《BSSQC数据库连接和事务管理专题.docx(9页珍藏版)》请在第一文库网上搜索。

1、BSSQC数据库连接和事务管理专题VI.0.1修改日期原因修改人2007-09-30根据ZhaOXin的意见,修改了Hibernate的session连接管理刘世伟2007-11-8根据调优组当前的工作,补充了一些内容刘世伟几个名词解释:1、 数据库连接池:众所周知,建立数据库连接是一个昂贵的操作,每次都得花费约0.05s1s的时间,消耗一定的内存资源(OraCIe91的一个空闲连接约需25MB内存,非空闲连接约需几十MB左右内存),而且一旦到达临界点,系统会陷入资源管理的恶性循环:越来越慢。数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接备用,减少使

2、用时才创建、销毁的消耗。当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。使用连接池后,数据库服务器减少了它并不擅长的连接管理工作,通过池连接的快速复用,能够为客户端提供更大的并发量,内存消耗也在可控范围内波动。我们能够通过设定连接池最大连接数来防止系统无尽的与数据库连接,操纵数据库的压力。我们也能够通过连接池的管理机制监控数据库连接的数量、使用情况,为系统开发、测试及性能调优提供根据。2、 真实连接:客户端程序直接与数据库建立的COnneCtion,使用完毕需要及时、安全的关闭,否则会导致数据库内存资源泄漏、服务器宕机3、 代理连接:客户端程序从连接池获取的COnne

3、Ction,它实际上是封装了真实连接,提供与真实连接相同的功能,使用完毕也需要及时、安全的关闭,否则连接池中的连接得不到释放,会导致连接池中可用的空闲连接越来越少。当然,由于存在连接池的操纵,数据库不可能因此而宕机。以下方法茨取的都是代理连接:以下方法获取的部是我卖的连接;交Si请求一C1ientHibcmatc.gc1ScwioM):2.JdbCTCnIPImegC1DaUSn():,连接池Connee1ionPoO卜应用程序SSP、Serv1et.EJB、JavaApP等)在取连接池连接Hibemate.geSesion(.conncction();2.JdbCTemP1ate.geDat

4、aSourcce1ega怆0:口实连协客户端通过连接池使用数据库连接,创建和关闭连接其实对从连接池中获取和归还已经创建好的数据库连接。特殊情况下,客户端也需要通过连接池,使用宾实的数据库连接.,归还连接池连输-连接池配艮的参数:MaxActives最大连接数Max1de1:最大空闲连接数Min1dch鼓小空闲连接数InitiaISizc:初始化连接数MaxWait:最大等待时间Va1idationQuery:i询前殴证连接testOnBorrow获取前测试连接由连接池管理(创建、更新、关闭)数据库的真实连接,一般提供初始化、池管理、池销毁、获取、关闭连接功能一、BSS数据库连接管理现状:BSS

5、系统中对数据库连接的管理,是统一通过数据源(DataSource)管理的,存在连接池与单连接两种方式的数据源(详情参考mode1xxx.jar中的xxxDatabase.xm1文件)1、单连接数据源,命名方式为xxxDataSourceNoPoo1”,BSS使用了Spring框架的org.springframework,jdbc.datasource.DriverManagerDataSource,程序获取的是真实的数据库连接。二、BSS系统中对数据源的使用1、Hibernate的SeSSionFaCtOry,使用的是连接池数据源,在配置文件中通常命名为uXxxSessionFactory,而

6、且Hibernate本身包含一个简单的连接池hibernate,connection,但性能与功能不如apache的。2、SPring的JdbCTemP1ate,根据其使用数据源是否为连接池,命名方式也不一致,配置文件中对使用连接池数据源的命名为“xxxJDBC”,使用单连接数据源的命名为uxxxJDBCNoPoo,三、应用程序中对连接的使用BSS程序中使用Hibernate的session与JdbcTemp1ate提供的通用方法通常是够用的,但某些场景下如执行orac1e特性的SQ1语句或者存储过程,需要获取真实数据库连接,现在要紧使用下列几种方式:1、Hibernate中,通过getSes

7、sion().connection。,如今获取的是连接是根据其数据源决定的,假如通过连接池中获取,则是代理连接,否则是真实数据库连接,但注意,不管如何都不能用conn.C1oSe()语句显示关闭的;这时候的conn事实上是被session管理了,Hibernate会在Session的事务提交或者回滚的时候,自动把连接放回池中,假如我们主动关了,会抛特殊。2、 JdbcTemp1ate中,通过jdbc.getDataSource().getConnection(),如今获取的连接是根据其数据源决定的,假如jdbc.getDataSource()返回的是连接池数据源,则连接是连接池的连接代理(重载

8、了真实连接的CIOSe方法),需要从代理连接中再次获取真实连接,见下面的a段落;假如返回的是单连接的数据源,则返回的是真实连接。这2种连接都需要显式的c1ose关闭,前者表示把连接还回连接池继续使用,后者表示真正关闭连接,释放数据库内存。a)对JdbCTemPIate中返回代理连接的情况,由因此连接代理,对Orac1e的B1ob与C1ob大数据对象,在C1OB.CreateTemporary(conn,true,C1OB.DURATION_SESSION)的时候,会抛CIaSSCaStEXCePtiorb如今需要获取真实的物理连接,方法如下:i. 设置DataSource中连接池的access

9、ToUnderIyingConnectionA11owed属性的值为true,表示同意从连接代理中获取物理连接;ii. 注意,通过连接池代理连接而获取的真实连接一定不能直接关闭,否则连接池就没有意义了,最好把这种情况下的获取物理连接+创建C1Ob用方法屏蔽掉,防止被误关闭。代码扫描后发现系统中普遍存在的问题:1、对打开的数据库资源Conn、ps、rs,主动写了CIoSe语句,但是没有写在fina11y语句块里面,一旦发生特殊,那么C1oSe语句就会被旁路,导致资源得不到释放。2、没有主动写CIoSe语句,当然这个是存在一些争议的,请看下列解释:a、假如不使用连接池机制,关闭CormeCtion

10、,会自动关闭resu1tset与statement的,程序中能够不显示关闭;b、假如使用连接池,所谓的关闭connection,事实上是将连接返回给了连接池,连接对象依然存在,实际上不是物理关闭,因此,务必显示的关闭resu1tset与statement,否则连接池中连接上的rs与PS会越来越多。3、单独写了CIOSe的语句块,到没什么问题,看着不舒服罢了。附件是代码中问题的位置,请详看。建议:我们系统有使用连接池与单独创建连接的,因此保险起见,resu1tset与Statment(PreparedStatementCa11ab1eStatement)一定在fina11y语句里面主动保持先后次

11、序c1ose掉,在此贴一下示例程序。Connectioncon=nu11;PreparedStatementps=nu11;Resu1tSetrs=nu11;try(catch(SQ1Exceptionex)fina11ytry(if(rs!=nu11)rs.c1ose();)catch(SQ1Exceptionex)/错误处理)try(if(ps!=nu11)ps.c1ose();)catch(SQ1Exceptionex)/错误处理try(if(con!=nu11)注意:Hibernate中得到的COnn不能关闭。con.c1ose();)catch(SQ1Exceptionex)/错误处

12、理)数据库事务管理现状:BSS中使用了Spring的声明式事务管理,在配置文件中通过对象或者方法的名称通配事务的加载与否。由于存在以上的数据库连接管理方式,因此对数据库的事务管理也是存在多种方式:1、 Hibernate的session2、 JdbcTemp1ate3、 通过session或者jdbcTemp1ate获取的Connection,通常直接执行sq1语句与存储过程存在的问题:2、事务拦截粒度比较粗,定义在类级别而不是方法级别事务拦截器的配置在bean的名称上,该bean下所有的方法都按照同一种事务模式象readon1y的事务隔离模式,对只查询不修改的方法,性能提高比较大,但需要更换

13、拦截器,定义在方法级别。此条只涉及性能,影响不是很大,可酌情。3、EJB与spring的事务传递问题假如BMO中spring不加载事务,被EJB包装后,发现EJB的事务不能传递给SPring,EJB事务回滚了,但是SPring管理bean的事务仍旧提交了,原因待详查,初步分析是ejb容器与SPring容器事务不能透传,按照EJB规范,CMT(容器管理的事务)内部是不能有嵌套事务的。当前为规避此种情况,建议所有的BM0,假如需要事务的,名称一律按照规范以“Manager”“DAO”结尾J调优组正在组织力量集中解决这个问题,初步思路是启用EJBBMT(Bean管理事务),使用WebSPhere的事

14、务管理与连接池存储过程与Java事务的嵌套问题:在一个bmo中同时调用几个dao,dao中分别用hibernatejdbc与存储过程完成insert或者update操作,事务是能够完整的,只是需要注意2点:一是存储过程里面不能有commit与ro11back二是dao调用存储过程后,dao中也不要写commit与ro11back,只要CIoSe就能够,由事务操纵自动提交,除非捕捉到bssexception,这里要在SPring的事务拦截中配一下bssexception、daoException,这样就能够操纵特殊的回滚。遗留问题:1、使用连接池后,假如数据库存储过程重新编译后,连接池连接的过程会存在问题。这个问题与连接池的StatenIent缓存有关系,假如关闭语句缓存,应该能解决这个问题,但是要评估性能的影响。答:已经做过试验,没有影响,第一次调用抛失效特殊,第二次就会刷新状态。但需要注意的是,存储过程的在线编译,往往会带来大量的锁,导致大量线程挂起,很可能会导致系统宕机,因此假如遇到紧急情况,需要在线编译,请提出申请,由项目组安排保护组与DBA协助,随时监控锁的情况,这样就没问题。

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

当前位置:首页 > 应用文档 > 工作总结

copyright@ 2008-2022 001doc.com网站版权所有   

经营许可证编号:宁ICP备2022001085号

本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有,必要时第一文库网拥有上传用户文档的转载和下载权。第一文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知第一文库网,我们立即给予删除!



客服