BSS-QC-数据库连接和事务管理专题_第1页
BSS-QC-数据库连接和事务管理专题_第2页
BSS-QC-数据库连接和事务管理专题_第3页
BSS-QC-数据库连接和事务管理专题_第4页
BSS-QC-数据库连接和事务管理专题_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、BSS系统中数据库连接的安全使用和事务问题汇总V1.0.1修改日期原因修改人2007-099-30根据zhaoxxin的意见见,修改了HHibernnate的ssessioon连接管理理刘世伟2007-111-8根据调优组当前前的工作,补补充了一些内内容刘世伟几个名词解释:数据库连接池:众所周知,建建立数据库连接是是一个昂贵的的操作,每次次都得花费约约0.05ss1s的时时间,消耗一定的内存资源(OOraclee 9i的一一个空闲连接接约需255MB内存,非非空闲连接约约需几十MB左右右内存),而且一旦旦到达临界点点,系统会陷陷入资源管理理的恶性循环环:越来越慢。数据库连接接池的基本思思想就是

2、为数数据库连接建建立一个“缓缓冲池”。预预先在缓冲池池中放入一定定数量的连接接备用,减少使使用时才创建、销毁的消耗。当需要建立立数据库连接接时,只需从从“缓冲池”中中取出一个,使使用完毕之后后再放回去。使使用连接池后后,数据库服服务器减少了了它并不擅长长的连接管理理工作,通过过池连接的快速复用,可可以为客户端端提供更大的的并发量,内内存消耗也在在可控范围内内波动。我们们可以通过设设定连接池最最大连接数来来防止系统无无尽的与数据据库连接,控控制数据库的的压力。我们也可以通过连连接池的管理理机制监控数据库连接的的数量使用用情况,为系系统开发测测试及性能调调优提供依据据。真实连接:客户户端程序直接和

3、数据库建立立的Connnectioon,使用完毕需需要及时、安全的关闭闭,否则会导导致数据库内内存资源泄漏漏、服务器宕机代理连接:客户户端程序从连接池池获取的Coonnecttion,它实际上是封装了真实实连接,提供供和真实连接接相同的功能能,使用完毕毕也需要及时、安全的关闭闭,否则连接接池中的连接接得不到释放放,会导致连连接池中可用用的空闲连接接越来越少。当然,由于于存在连接池池的控制,数数据库不会因因此而宕机。一、BSS数据据库连接管理理现状:BSS系统中对对数据库连接的的管理,是统统一通过数据据源(DattaSourrce)管理理的,存在连接池和和单连接两种种方式的数据源源(详情参考考m

4、odellxxx.jjar中的xxxxDattabasee.xml文文件)连接池数据源,命名方式为为“xxxDaataSouurce”,BSS采用了apachhe的开源池池mmons.ddbcp.BBasicDDataSoource,应用程序获取取的是apaache连接接池的代理连接(cconnecctionPProxy),非真实连接。单连接数据源,命名方式为为“xxxDaataSouurceNooPool”,BSS采用用了Spriing框架的的org.sspringgframeework.jdbc.datassourcee.DrivverMannagerDDataSoource,程程序获取的

5、是是真实的数据据库连接。二、BSS系统统中对数据源源的使用Hibernaate的SeessionnFactoory,使用的是连连接池数据源源,在配置文文件中一般命命名为“xxxSesssionFFactorry”,而且Hibeernatee本身包含一一个简单的连连接池hibbernatte.connnectiion,但性能和功能不如aapachee的。Spring的的JdbcTTemplaate,根据其使用用数据源是否否为连接池,命命名方式也不不同,配置文文件中对使用用连接池数据据源的命名为为“xxxJDDBC”,使用单连连接数据源的的命名为“xxxJDDBCNoPPool”三、应用程序中中对

6、连接的使使用BSS程序中使使用Hibeernatee的sesssion和JJdbcTeemplatte提供的通通用方法一般般是够用的,但但某些场景下下如执行orracle特特性的SQLL语句或存储储过程,需要要获取真实数据库连连接,现在主主要使用以下下几种方式:Hibernaate中,通通过getSSessioon().cconnecction(),此时获取的是是连接是根据据其数据源决决定的,如果果通过连接池池中获取,则则是代理连接接,否则是真真实数据库连连接,但注意,无论如如何都不能用connn.cloose()语语句显示关闭闭的;这时候的cconn其实实是被sesssion管管理了,Hii

7、bernaate会在SSessioon的事务提提交或回滚的的时候,自动动把连接放回池池中,如果我我们主动关了了,会抛异常常。JdbcTemmplatee中,通过jjdbc.ggetDattaSourrce().getCoonnecttion(),此时获取的连接是是根据其数据据源决定的,如如果jdbcc.getDDataSoource()返回的是是连接池数据据源,则连接接是连接池的的连接代理(重重载了真实连连接的cloose方法),需要从代理连接中再次获取真实连接,见下面的a段落;如果返回的是单连接的数据源,则返回的是真实连接。这2种连接都需要显式的close关闭,前者表示把连接还回连接池继续使

8、用,后者表示真正关闭连接,释放数据库内存。对JdbcTeemplatte中返回代代理连接的情情况,由于是是连接代理,对Oracle的Blob和Clob大数据对象,在CLOB.createTemporary(conn, true, CLOB.DURATION_SESSION)的时候,会抛ClassCastException,此时需要获取真实的物理连接,方法如下:设置DataSSourcee中连接池的的accesssToUnnderlyyingCoonnecttionAlllowedd属性的值为ttrue,表表示允许从连接代代理中获取物物理连接;对apachee的BasiicDataaSourcc

9、e,可通过mmons.dbcp.DeleggatinggConneectionn的getDeelegatte()方法法获取真实连连接。注意,通过连接接池代理连接接而获取的真真实连接一定定不能直接关关闭,否则连连接池就没有有意义了,最好把这种种情况下的获获取物理连接接创建Cllob用方法法屏蔽掉,防止止被误关闭。代码扫描后发现现系统中普遍遍存在的问题题:1、对打开的数数据库资源cconn、pps、rs,主主动写了cllose语句句,但是没有有写在finnally语语句块里面,一一旦发生异常常,那么cllose语句句就会被旁路路,导致资源源得不到释放放。2、没有主动写写closee语句,当然然这个

10、是存在在一些争议的的,请看以下下解释: a、如如果不使用连连接池机制,关闭coonnecttion,会自动关闭闭resulltset和和stateement的的,程序中可可以不显示关关闭; b、如如果使用连接接池,所谓谓的关闭coonnecttion,其实是将连连接返回给了了连接池,连连接对象依然然存在,实实际上不是物物理关闭,因因此,必须显显示的关闭rresulttset和sstatemment,否否则连接池中中连接上的rrs和ps会会越来越多。3、单独写了cclose的的语句块,到到没什么问题题,看着不舒舒服罢了。附件是代码中问问题的位置,请请详看。建议:我们系统有使用用连接池和单单独创建

11、连接接的,所以保保险起见,rresulttset和sstatmeent(PrrepareedStattementt、CalllableSStatemment)一一定在finnally语语句里面主动动保持先后次次序closse掉,在此此贴一下示例例程序。Connecttion ccon = null;PrepaaredSttatemeent pss = nuull;ReesultSSet rss = nuull;try .catch (SSQLExcceptioon ex).finallyy tryy if(rss!=nulll) rrs.cloose(); ccatch (SQLEExcept

12、tion eex) /错误处理 trry if(pps!=nuull) ps.cllose(); catchh (SQLLExcepption ex) /错误处理理 ttry if(ccon!=nnull)/注意:Hiberrnate中中得到的coonn不能关关闭。 conn.closse(); caatch (SQLExxceptiion exx) /错错误处理 数据库事务管理理现状:BSS中采用了了Sprinng的声明式式事务管理,在配置文件中通过对象或方法的名称通配事务的加载与否。由于存在以上的的数据库连接接管理方式,所所以对数据库库的事务管理理也是存在多多种方式:Hibernaate的

13、seessionnJdbcTemmplatee通过sessiion或jddbcTemmplatee获取的Connnectiion,一般般直接执行ssql语句和和存储过程存在的问题:1、事务回滚规规则只有DAAOExceeptionn(部分),缺缺BssExxceptiion 现在BMOO中规范抛出出BssExxceptiion,一旦旦BMO方法法中出现异常常,现在的配配置是事务不不回滚的,导导致前后数据据不完整。 建议,sspringg事务配置里里面加入强制制回滚模式匹匹配: -bbss.coommon.BssExxceptiion,如下下: PROPPAGATIION_REEQUIREED,

14、-mmon.DDAOExcceptioon,-mmon.BBssExcceptioon EJJB事务回滚滚规则: 1、如如果beann抛出RunntimeEExcepttion,容容器会自动回回滚事务,并并且在外面包包装一个ReemoteEExcepttion抛出出。 2、如果bbean抛出出其他的异常常,容器不会会做任何处理理,除非强制制定义。2、事务拦截截粒度比较粗粗,定义在类类级别而不是是方法级别 事务拦拦截器的配置置在beann的名称上,该该bean下下所有的方法法都按照同一一种事务模式式 象rreadonnly的事务务隔离模式,对对只查询不修修改的方法,性性能提高比较较大,但需要要更

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

16、ebsphere的事务管理和连接池存储过程和Jaava事务的的嵌套问题:在一个bmo中中同时调用几几个dao,dao中分别别用hibeernatee、jdbc和存存储过程完成成inserrt或updatte操作,事务是是可以完整的的,不过需要要注意2点:一是存储过程里里面不能有ccommitt和rollbback二是dao调用用存储过程后后,dao中也不不要写commmit和rollbback,只只要closse就可以,由事事务控制自动动提交,除非非捕捉到bsssexceeptionn,这里要在在sprinng的事务拦拦截中配一下下bssexxceptiion、daaoExceeptionn,这样就可可以控制异常常的回滚。遗留问题:采用连接池后,如如果数据库存存储过程

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论