设为首页 收藏本站
查看: 787|回复: 0

[经验分享] 航海日志(2) ----from Oracle to DB2

[复制链接]

尚未签到

发表于 2016-7-28 11:19:55 | 显示全部楼层 |阅读模式
航海日志(2) ----from Oracle to DB2

---DB2锁表及 ResultSet Closed
<o:p> </o:p>
                                李俊杰

概述

我们原有的系统是架构在Oracle数据库服务器之上的,现在要迁移到DB2数据库服务器上,Websphere作为应用服务器。在原有的系统中后来集成了工作流系统,该工作流系统的持久层是使用Hibernate,这就造成工作流使用工作流系统的数据库连接,而业务系统使用Type4的数据库连接。在迁移过程中发现锁表现象,修改Hibernate的配置文件后,在本地的jboss服务器上没问题(程序员在本地使用的是jboss服务器),但在websphere服务器上调用工作流时出现“result set closed”的错误。下面我将详细介绍其原因及解决方案。

DB2数据库锁表

锁表问题现象及原因分析

数据库操作几次即出现锁表现象,无法继续操作,分析log得出锁表信息“LOCK_ESCALATION”和“LOCK TIMEOUT”等字眼,就可以肯定是锁表了。我们又分析了我们的系统,发现业务系统使用的是Type4数据源连接数据库,而hibernate.cfg.xml文件中定义的是JDBC连接,所以出现了锁表现象。
<property name="connection.driver_class">com.ibm.db2.jcc.DB2Driver</property>
  <property name="connection.url">jdbc:db2://<st1:chsdate isrocdate="False" month="12" islunardate="False" day="30" w:st="on" year="1899">10.10.19</st1:chsdate>.169:50000/sinochem</property>
  <property name="connection.username">db2admin</property>
  <property name="connection.password">db2admin</property>
而业务系统使用的数据库连接的定义是在oracle-ds.xml这样的:
<?xml version="1.0" encoding="UTF-8"?>
<datasources>
  <local-tx-datasource>
    <jndi-name> jdbc/cpf/type4</jndi-name>
    <connection-url>jdbc:db2://<st1:chsdate isrocdate="False" month="12" islunardate="False" day="30" w:st="on" year="1899">10.10.19</st1:chsdate>.169:50000/sinochem</connection-url>
    <driver-class>com.ibm.db2.jcc.DB2Driver</driver-class>
    <user-name>db2admin</user-name>
    <password>db2admin</password>
    <min-pool-size>3</min-pool-size>
    <max-pool-size>6</max-pool-size>
    <idle-timeout-minutes>5</idle-timeout-minutes>
  </local-tx-datasource>
</datasources>
应用服务器在启动的过程中,通过servlet把该文件的内容读入内存,并使用了JDBC的连接。

锁表解决方法

<property name="connection.datasource">java:comp/env/jdbc/cpf/type4</property><o:p></o:p>
其中“jdbc/cpf/type<st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="4" numbertype="1" negative="False" unitname="”" w:st="on">4”</st1:chmetcnv>为数据源名称,这样业务系统和工作流系统采用统一的数据源,则解决了锁表问题。这样的解决方法在jboss上面是没有问题的,因为jboss上使用的是本地的配置文件oracle-ds.xml创建的数据源。<o:p></o:p>

Websphere问题(result set closed)原因分析

当我们的系统部署到Websphere上,并配置JNDI为“jdbc/cpf/type<st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="4" numbertype="1" negative="False" unitname="”" w:st="on">4</st1:chmetcnv>的数据源,在调用工作流(工作流后台是Hibernate)时出现“com.ibm.db2.jcc.b.SqlException: Invalid operation: result set closed
”,根据网上的资料说是ResultSet嵌套调用,但我们分析代码,并没有出现ResultSet嵌套调用的可能性,又采用了其他方式证明了Hibernate是调用的Websphere配置的数据源。最后发现是DB2的JDBC驱动存在bug,原因是多线程运行的线程安全问题,Statement与ResultSet共享线程引起的问题,正常情况下如果使用Statement执行完一个查询,又去执行另一个查询时这时候第一个查询的结果集就会被关闭,也就是说,所有的Statement的查询对应的结果集是一个,如果调用Connection的commit()方法也会关闭结果集。可保持性就是指当ResultSet的结果被提交时,是被关闭还是不被关闭。JDBC2.0和1.0提供的都是提交后ResultSet就会被关闭。 <o:p></o:p>
resultSetHoldability表示在结果集提交后结果集是否打开,取值有两个:
ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库。
ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭。
在websphere的数据源连接池的配置过程中缺省是第2中方式,这就是造成错误的原因。
<o:p> </o:p>

修改步骤如下所示:

  根据上面的错误原因分析,是websphere的数据源连接池的resultSetHoldability配置参数需要修改,则在websphere控制台上资源->JDBC提供者,如下:
<v:shapetype o:spt="75" coordsize="21600,21600" filled="f" stroked="f" id="_x0000_t75" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" o:connecttype="rect" gradientshapeok="t"></v:path><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype><v:shape id="_x0000_i1025" type="#_x0000_t75" style="WIDTH: 414.75pt; HEIGHT: 207pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image001.png" o:title=""></v:imagedata></v:shape>
<o:p> http://p.blog.csdn.net/images/p_blog_csdn_net/lijj_72/1.bmp</o:p>
<o:p> </o:p>
点击DB2 Universal JDBC Driver Provider->数据源 ,如下图所示:
http://p.blog.csdn.net/images/p_blog_csdn_net/lijj_72/2.bmp
<v:shape id="_x0000_i1026" type="#_x0000_t75" style="WIDTH: 414.75pt; HEIGHT: 174.75pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image003.png" o:title=""></v:imagedata></v:shape>
选择你要修改参数的数据源,如下图所示“jdbc/cpf/type<st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="4" numbertype="1" negative="False" unitname="”" w:st="on">4”</st1:chmetcnv>
<st1:chmetcnv tcsc="0" hasspace="False" sourcevalue="4" numbertype="1" negative="False" unitname="”" w:st="on">http://p.blog.csdn.net/images/p_blog_csdn_net/lijj_72/3.bmp</st1:chmetcnv>
<v:shape id="_x0000_i1027" type="#_x0000_t75" style="WIDTH: 415.5pt; HEIGHT: 240.75pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image005.png" o:title=""></v:imagedata></v:shape>
数据源详细配置页面,上面有具体的数据源配置,点击右侧的“定制属性”,如下图所示
<v:shape id="_x0000_i1028" type="#_x0000_t75" style="WIDTH: 415.5pt; HEIGHT: 144.75pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image007.png" o:title=""></v:imagedata></v:shape>
<o:p> http://p.blog.csdn.net/images/p_blog_csdn_net/lijj_72/4.bmp</o:p>
在下面的数据源的定制属性中选择“resultSetHoldability”参数,如下图所示:
<o:p> http://p.blog.csdn.net/images/p_blog_csdn_net/lijj_72/5.bmp</o:p>
<v:shape id="_x0000_i1029" type="#_x0000_t75" style="WIDTH: 414.75pt; HEIGHT: 171.75pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image009.png" o:title=""></v:imagedata></v:shape>
如下图所示,修改“resultSetHoldability”属性的值,缺省是2,修改为1
<v:shape id="_x0000_i1030" type="#_x0000_t75" style="WIDTH: 414.75pt; HEIGHT: 202.5pt"><v:imagedata src="file:///C:\DOCUME~1\ADMINI~1\LOCALS~1\Temp\msohtml1\01\clip_image011.png" o:title=""></v:imagedata></v:shape>
<o:p> http://p.blog.csdn.net/images/p_blog_csdn_net/lijj_72/6.bmp</o:p>
修改属性后保存,并重启Websphere应用服务器,则大功告成!



努力,在于我热爱我的事业,与中国的软件一起走向成熟,走向世界。

   

联系作者:lijj_72@hotmail.com

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-250666-1-1.html 上篇帖子: oracle 直接模式direct=y导出数据 下篇帖子: oracle pl/sql函数几个要点
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表