`
lijj_72
  • 浏览: 22458 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

航海日志(2) ----from Oracle to DB2

阅读更多

航海日志(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配置的数据源。最后发现是DB2JDBC驱动存在bug,原因是多线程运行的线程安全问题,StatementResultSet共享线程引起的问题,正常情况下如果使用Statement执行完一个查询,又去执行另一个查询时这时候第一个查询的结果集就会被关闭,也就是说,所有的Statement的查询对应的结果集是一个,如果调用Connectioncommit()方法也会关闭结果集。可保持性就是指当ResultSet的结果被提交时,是被关闭还是不被关闭。JDBC2.01.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> </o:p>

<o:p> </o:p>

点击DB2 Universal JDBC Driver Provider->数据源 ,如下图所示:

<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"></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> </o:p>

在下面的数据源的定制属性中选择“resultSetHoldability”参数,如下图所示:

<o:p> </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> </o:p>

修改属性后保存,并重启Websphere应用服务器,则大功告成!

努力,在于我热爱我的事业,与中国的软件一起走向成熟,走向世界。
   
联系作者:lijj_72@hotmail.com
分享到:
评论

相关推荐

    oracle和db2的区别

    ### Oracle与DB2的主要区别 本文旨在探讨Oracle与DB2这两种主流关系型数据库管理系统(RDBMS)之间的关键差异。Oracle由甲骨文公司开发,而DB2则由IBM推出。两者均广泛应用于企业级环境,提供了强大的数据管理能力。...

    oracle与db2对比

    Oracle 和 DB2 是两种广泛应用的关系型数据库管理系统,...使用 `&lt;sql apply-to="oracle"&gt;&lt;/sql&gt;` 和 `&lt;sql apply-to="db2"&gt;&lt;/sql&gt;` 标签可以帮助区分针对不同数据库的特定代码段,确保代码能够在目标平台上正确运行。

    DB2 to Oracle 迁移培训

    ### DB2 to Oracle 迁移培训知识点概览 #### 一、DB2 for Oracle Professionals Workshop Coursebook 概述 **DB2 for Oracle Professionals Workshop Coursebook** 是一份由 IBM 提供的专业培训材料,旨在帮助 ...

    DB2常用函数与Oracle比较

    ### DB2常用函数与Oracle比较 本文档旨在深入解析DB2和Oracle数据库中常用函数的异同之处,以便于从一种数据库系统迁移至另一种系统的人员能够快速掌握并适应新的环境。我们将从类型转换函数、时间日期相关的函数...

    jdbc驱动(Oracle-sqlserver-db2-mysql-h2-sqlite)

    标题中的"jdbc驱动(Oracle-sqlserver-db2-mysql-h2-sqlite)"指的是针对不同数据库系统的一系列JDBC驱动程序。以下是对这些数据库系统及其对应的JDBC驱动的详细解释: 1. **Oracle**:Oracle数据库是全球领先的商业...

    oracle与db2区别

    Oracle数据库和IBM的DB2是两个全球领先的商业关系型数据库管理系统(RDBMS),它们在很多方面都有各自的特点和优势。对于数据库管理员来说,理解两者之间的差异至关重要,以便选择最适合特定业务需求的解决方案。...

    oracle-database-server-12cR2-preinstall

    Oracle Database Server 12cR2 Preinstall 是一个专为在x86_64架构的Linux系统上安装Oracle数据库12c Release 2 (12.2)而设计的预配置软件包。这个预安装包的主要目的是简化Oracle数据库服务器的安装流程,预先配置...

    DB2和ORACLE 应用开发差异比较

    - Oracle使用`TO_DATE()`函数将字符串转换为日期,DB2则可能需要自定义转换函数。 - 在Oracle中创建日期示例表`date_demo`,插入和查询数据时,日期值以`DD-MON-YYYY`格式存储。而在DB2中,日期通常以`YYYY-MM-DD`...

    compat-oracle-rhel4-1.0-5.i386.rpm

    compat-oracle-rhel4-1.0-5.i386.rpm

    DB2与ORACLE常用语句对照

    - 删除数据:`DELETE FROM`在两者中也是相同的,但Oracle的`TRUNCATE TABLE`用于快速删除所有行并回收空间,而DB2则用`DELETE FROM ... WHERE 1=0`模拟此行为。 3. 数据查询语言(DQL): - `SELECT`语句基本兼容,...

    oracle-rdbms-server-11gR2-preinstall-1.0-4.el7.x86_64.rpm

    oracle-rdbms-server-11gR2-preinstall-1.0-4.el7.x86_64.rpm

    oracle-DB2.rar_oracle

    当我们涉及到"oracle-DB2数据类型对照"这个主题时,我们需要探讨的是这两个系统在数据存储和类型定义方面的异同。 首先,让我们深入了解Oracle的数据类型。Oracle提供了一套全面的数据类型,用于存储各种不同类型的...

    [IBM] - Oracle to DB2 Udb Conversion Guide.chm

    IBM的Oracle to DB2 Udb Conversion Guide ,英文的,希望对大家有帮助

    oracle-instantclient11.2 rpm包

    oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-basiclite-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-devel-11.2.0.4.0-1.x86_64.rpm oracle-instantclient11.2-jdbc-...

    oracle转DB2 对照

    ### Oracle转DB2对照知识点详解 #### 1. Oracle SQL PL 和 DB2 inline SQL PL (内嵌) 比较 ##### 1.1 创建存储过程 - **Oracle**: 支持 `CREATE OR REPLACE` 语法,允许在已有存储过程的基础上进行替换。 ```sql ...

    SQL_Server,Oracle,DB2数据库SQL语句比较

    根据提供的文件信息,本文将对SQL Server、Oracle与DB2三种主流关系型数据库管理系统中的SQL语句进行详细的对比分析。这不仅有助于理解不同数据库系统之间的差异,也为开发人员提供了跨平台迁移时所需的必要知识。 ...

    oracle-database-server-12cR2-preinstall-1.0-3.el7.x86_64.rpm

    oracle-database-server-12cR2-preinstall-1.0-3.el7.x86_64.rpm

    ORACLE转DB2对照全解

    ### ORACLE转DB2对照全解 #### 一、Oracle SQL PL与DB2 inline SQL PL对比 本章节主要介绍Oracle SQL PL与DB2 inline SQL PL之间的对比,包括但不限于存储过程、触发器、用户定义函数(UDF)、条件语句及流程控制...

    tableau10.0-oracle-driver-x64.msi

    tableau10.0-oracle-driver-x64.msi,tableau开发oracle必须包

    DB2和oracle对比

    标题中的“DB2和Oracle对比”意味着我们将探讨这两款企业级数据库管理系统——Oracle数据库和IBM的DB2——在性能、功能、成本、易用性、安全性以及市场占有率等方面的差异。 Oracle数据库是由Oracle公司开发的一款...

Global site tag (gtag.js) - Google Analytics