作者:Rahul Srivastava, Rudy Leung, Anjan Kundu
本文介绍了联合使用WebLogic Server和Oracle真正应用集群(Oracle Real Application Clusters,RAC)时的最佳实践,包括不同使用情况和故障情况的分析以及可能的恢复解决方案建议。另外,本文还对Oracle的Transparent Application Failover(透明应用程序故障切换,TAF)进行了评估,该产品的功能类似于WebLogic Server MultiPools。
声明
本文给出的结论是以初步的研究为依据的,根据进一步的研究和测试,这些结论都有可能发生改变。
1. 简介
如今,WebLogic Server正越来越多地被用于部署企业级应用系统,同时在可靠性、可用性、可伸缩性和性能(RASP)方面也有着严格的要求。很多客户都希望将WebLogic Server与其他供应商的高可用性(HA)解决方案一起使用,并得到BEA的指导。
本文提供了将WebLogic Server和Oracle真正应用集群(RAC)联合使用这种通用的HA部署方案方面的信息,包括不同使用情况和故障情况下这种配置的行为分析。基于该分析,本文针对使用这种配置的应用程序提出了一些建议和最佳实践。
透明应用程序故障切换(TAF)是Oracle的一种产品,其功能类似于WebLogic Server MultiPools。本文对TAF进行了评估,并将其功能与WebLogic Server JDBC MultiPools进行了比较,包括使用WebLogic Server和RAC的应用程序的可用性在内。
2. 范围
本文重点是部署在RAC环境中的WebLogic服务器上的应用程序对于事务处理和非事务处理数据库的访问和使用,仅涉及WebLogic Server的JDBC和JTA子系统(的相关部分),不讨论WebLogic Server其他部分及RAC环境中应用程序的行为等问题。
除了明确指出的以外,本文适用于WebLogic Server的所有版本。但是,根据所用WebLogic Server的确切版本,您可能会遇到不同的情况。软件补丁和增强功能已被添加到了WebLogic Server的所有版本和服务包中。
还需注意,针对本文所进行的测试是在HP-UX上进行的。对于不同的操作系统,安装会有很大差别。
3. 读者
本文的目标读者是应用程序设计师和架构师,是以假定读者以前比较了解相关的技术,如XA、SQL、JDBC、WebLogic Server MultiPools、RAC和TAF为基础撰写的。这些技术的信息资源链接,参见下面的参考文献部分。
某些与本文有关的较为深奥的概念在下一部分中作了简要说明。
4. 背景
4.1 TCP/IP中的故障处理
TCP/IP是运行于不同物理机器上的进程之间事实上的通信协议。如果在两个进程间创建连接或在读取和写入数据的运行时,TCP/IP协议层遇到错误,根据错误的本质,显示的情况也会大不相同:在某些情况下,故障瞬间即会出现;而在另外一些情况下,直到操作系统报告超时时才能知道出现了故障,且这种故障可能会持续很长时间,以至于让人无法接受。
例如,假设机器M1(客户端)上的进程P1需要用TCP/IP 套接字从机器M2(服务器)上的进程P2检索数据。在创建连接时,如果P2未在M2上运行,则P1的连接创建请求会立即失败。这是因为M2上操作系统的TCP/IP层会检测到P1指定的IP地址(主机和端口)上没有进程在监听进入的连接请求这一事实。但是,如果M2对于M1是不可访问的(无论是机器连接还是网络连接不可用),M1上操作系统的TCP/IP层都会持续不断地进行连接M2的尝试,直至操作系统级超时为止。这种超时可能会长达9分钟,而且是特定的操作系统才会出现。因此,在这种情况下,客户端可能会挂起一段时间,长度为这种超时的配置值。
在客户端和服务器交换数据的运行时也可能出现这种情况。
在JDBC客户端尝试连接到当前不可用的数据库计算机时通常都会遇到这种情况。
4.2 Oracle RAC中的事务处理(以下内容来自Oracle技术支持服务部)
一旦某一XA事务在某一特定RAC节点启动,则该事务的所有工作都必须在同一节点完成,只有一个例外。
XAResource.start被调用之后,如果XAResource.rollback、XAResource.commit、TMSUSPEND、TMRESUME或TMJOIN也被调用,则这些方法的调用节点必须与XAResource.start的调用节点相同。这是XA内部的一种限制,因为在事务准备好之前,该事务的所有信息都在内存中,包括XID在内。RAC中的其他节点无权访问这些信息,甚至也不能确定该事务是否存在。不同的RAC节点尝试调用任何一个方法时都将返回异常。
这一限制有一种例外,就是如果某个事务存在疑问,该事务记录会被插入尚未处理的事务表中。其他的RAC节点便可以了解到该事务的情况,也可以从任意节点调用XAResource.recover。
5. 测试结果摘要
为研究和验证部署在RAC和TAF环境中WebLogic服务器上的应用程序的行为而进行了测试。这一部分内容给出了测试结果摘要。测试细节参见见附录A。
总的来说,这些技术的执行情况与大多数使用方案文档中所描述的一致,能够恢复大多数的故障。同时也发现了一些不足之处,如下所述。此外还提供了一些规避方法(如果可能)。
5.1 Oracle TAF的限制
Oracle TAF为用户会话之间的数据库连接提供了故障切换功能。不过,在某一用户会话期间考虑处理故障切换是有一些限制的。
如果用户会话未能切换到RAC备用节点,则该故障切换对于应用程序是不透明的。下面几项不能进行故障切换,必须由应用程序重新初始化:
- 使用中的存储过程
- 应用程序向会话状态的转变
- 正在处理的“写”事务(正在进行数据库更新的本地事务)
- 全局事务
此外,Oracle Thin驱动程序也不支持Oracle TAF。若想与应用程序一起使用TAF,必须使用Oracle OCI驱动程序。
5.2 WebLogic Server MultiPools的限制
WebLogic Server MultiPools为部署在WebLogic Server上的应用程序所使用的数据库连接提供厂商中立的负载均衡和故障切换功能。如果在被某一应用程序使用的过程中数据库连接失败,这种故障对于该应用程序是不透明的, WebLogic Server MultiPools的限制与Oracle TAF类似。用户必须在应用程序内部处理即时出现的故障。WebLogic Server会处理后续连接请求的故障切换。
另外,WebLogic Server MultiPools无法配置成使用支持XA的连接池。设置这种限制是出于以下原因:
- 在与“负载均衡”算法类型一起运行的情况下,应用程序每次请求连接时,都可能会从不同连接池获得连接。包括MultiPool内部的单个连接池在内的所有连接池都是作为不同的XA资源注册到WebLogic服务器事务管理器(WebLogic Server Transaction Manager)的。
应用程序首次获得连接并与RAC节点通信时,XID就会被创建并注册到该RAC节点。当应用程序发出从属于同一事务请求的后续连接请求时,返回该应用程序的连接可能指向对注册到第一个RAC节点的XID一无所知的其他RAC节点。这在运行时会导致XAER_NOTA或XAER_RMERR错误。
- 在与“高可用性”算法类型一起运行的情况下,会出现这样一些故障:数据库服务器会无限期地被准备好的全局事务锁住。此时需要管理员的干预来手动打开这些锁。
5.3 驱动程序级负载均衡的限制
Oracle Thin和OCI驱动程序提供了这样一个特性:新连接请求会在由传递到该驱动的一组地址所确定的不同数据库服务器之间进行负载均衡处理。
如果与全局事务一起使用,这一特性可能会引发一些问题。在将负载均衡算法类型用于WebLogic Server MultiPools时,这些问题在概念上与5.2中所述的问题类似。该问题可通过为相应的JDBC连接池设置“KeepXAConnTillTXComplete”属性来加以解决。
5.4 其他驱动程序级限制
测试的JDBC驱动程序都没有执行JDBC规范所指定的超时特性。这些超时特性包括“javax.sql.DataSource”接口的“setLoginTimeout()”方法和“java.sql.Statement”接口的“setQueryTimeout()”方法。
如测试描述中所述,这会导致应用程序线程挂起相当长的时间,迟迟不出现操作系统级的超时报告。
6. 建议
基于附录A中详细记述的测试,BEA就本文所述技术的使用提出以下建议。
如前面第1页的声明所述,根据进一步的研究和测试,本文给出的结论和建议都有可能发生改变。
6.1 Oracle TAF
Oracle TAF非常适合于某些特定的使用情况——数据仓库类型的应用程序,这些应用程序通常都长时间地运行数据库密集的只读查询。基于WebLogic服务器构建的具有类似数据库使用特性的应用程序可以通过使用TAF而获益。
不过,正如前面的5.1所述,应用程序设计人员需要清楚,使用TAF时用户会话状态不能透明地进行故障切换。更重要的是,如果该应用程序正在使用全局事务或在本地事务内部进行数据库更新,TAF不会提供任何附加价值。
如前所述,要使用TAF,必须使用Oracle Type 2 OCI驱动程序。这加重了安装和维护WebLogic Server所在的计算机上的Oracle客户端库的管理负担。这可能是也可能不是要考虑的因素,取决于IT基础架构对该应用程序的支持的可用性如何。此外,在某些使用情况下(在一台物理计算机上配置了多个WebLogic服务器域,每个域又配置了多个连接池),在计算机上管理单一的“tnsnames.ora”文件(使用OCI驱动程序时)比管理每个域、每个连接池的“URL”字符串(使用Thin驱动程序时)会更方便。
6.2 WebLogic Server MultiPools
WebLogic Server MultiPools针对跨多个数据库的负载均衡应用程序的装入提供了一种数据库中立、与驱动程序无关的机制,针对数据库故障提供了有限的故障切换。它们提供多种使用模式以满足不同的应用需求,非常适用于不使用全局事务的应用程序。
但是,鉴于前面5.2中所述的原因,目前的WebLogic Server MultiPools不应与全局事务放在一起使用。WebLogic服务器会进行相应的检查,并明确地禁止带有XA连接池的MultiPool配置。
6.3 仅使用本地事务的应用程序
不使用全局事务的应用程序应该将Oracle TAF和WebLogic Server MultiPools用于其RAC环境。
前面的内容详细阐述了它们的优缺点;您应选用更能满足需要的技术。
6.4 使用全局事务的应用程序
如果您的应用程序使用全局事务,应考虑使用JDBC驱动程序的“负载均衡”和“连接时间故障切换”特性。
驱动程序级负载均衡可以提供更好的性能,因为应用程序负载将分配到多个RAC实例。请注意,如5.3中所述,如果应用程序正在在使用驱动程序级负载均衡,则必须为相应的JDBC连接池启用“KeepXAConnTillTXComplete”属性。
如果正在使用全局事务,就应考虑使用连接时间故障切换特性,而不应使用Oracle TAF。连接时间故障切换特性提供了Oracle TAF的一个极有价值的子集和WebLogic Server MultiPools的功能——如果当前RAC主节点不可用,则可连接到RAC备用节点。不过请注意,连接时间故障切换不像TAF那样为连接到RAC备用节点提供预先创建连接的能力。这意味着使用连接时间故障切换时的RAC备用节点的故障切换速度不会像使用TAF时那么快。
7. 参考文献
WebLogic Server MultiPools——http://e-docs.bea.com/wls/docs81/jdbc/programming.html#multipools
WebLogic Server Transaction Service - http://e-docs.bea.com/wls/docs81/jta/trxsvc.html
Oracle Metalink Note 69906.1 - "Overview of TAF"
Oracle Metalink Note 97926.1 - "Limitations with Connect time failover and TAF"
Oracle Metalink Note 203466.1 - "Overview of RAC"
"Oracle9i RAC" by Mike Ault and Madhu Tumma, Published by Rampant Techpress, 2003.
8. 附录A
本节内容详细记述了为研究和分析本文所论述的不同技术的行为而进行的测试。
8.1 测试情况和结果
8.1.1 方法
为进行分析,确定3个故障点(可能发生故障的资源):
- 数据库计算机或网络连接故障
- 数据库监听程序故障
- 数据库进程故障
每个资源可能有2种类型的故障:
上述故障可能出现在应用程序生命周期的2个不同阶段:
分析中没有考虑下述故障的影响:
这些故障的处理只针对特定的应用程序。
“恢复”定义为“正常”运行或功能的恢复。这适用于上述资源以及应用程序和WebLogic Server。
8.1.2 启动时故障测试
启动时故障是指WebLogic Server尝试与数据库建立连接时出现的故障。这可以在启动WebLogic Server时出现,也可以在部署和运行应用程序时(为处理临时增加的需求而创建额外的数据库连接时)出现。
这些测试目的是为了弄清在各种类型的数据库崩溃期间,JDBC客户端应用程序能否在启动时通过Oracle Thin驱动程序、Oracle OCI驱动程序和针对Oracle的WebLogic JDriver透明地建立连接。
8.1.2.1 数据库计算机的崩溃
用关掉数据库实例托管计算机的电源来模拟这种情况。
Oracle OCI驱动程序
- 非XA——JDBC客户端在TCP/IP级挂起了10分钟,之后建立起与Oracle RAC中第二个节点的连接。
- XA——JDBC客户端在TCP/IP级挂起了10分钟,之后没有建立起与Oracle RAC中第二个节点的连接。当在tnsnames.ora的输入中指定“enable=broken”时,客户端仅挂起了3分钟,但仍无法连接到第二个节点。
Oracle Thin驱动程序
- 非XA——JDBC客户端在TCP/IP级挂起了10分钟,之后建立起与Oracle RAC中第二个节点的连接。
- XA——JDBC客户端在TCP/IP级挂起了10分钟,之后没有建立起与第二个节点的连接。
WebLogic JDriver
- 非XA——JDBC客户端在TCP/IP级挂起了10分钟,之后建立起与Oracle RAC中第二个节点的连接。
- XA——JDBC客户端在TCP/IP级挂起了10分钟,之后WebLogic Server遇到了一个事务处理超时的SQL错误;没有建立起与第二个节点的连接。
8.1.2.2 数据库服务器停机
用关闭数据库实例(“即时停机”)来模拟这种情况。
各种情况(XA和非XA,所有驱动程序)下所观察到的结果都是一样的:JDBC客户端没有检测到延迟,透明地建立起与第二个RAC节点的连接。
8.1.2.3 TNS监听程序关闭
用关闭TNS监听程序来模拟这种情况。
各种情况(XA和非XA,所有驱动程序)下所观察到的结果都是一样的:JDBC客户端可以成功使用现有的数据库连接。透明地建立起与第二个RAC节点的新连接。
8.1.2.4 数据库服务器崩溃
用强行结束所有数据库实例进程来模拟这种情况。
各种情况(XA和非XA,所有驱动程序)下所观察到的结果都是一样的:JDBC客户端没有检测到延迟,透明地建立起与第二个RAC节点的连接。
8.2 全局事务测试情况和结果
8.2.1 方法
测试目的仍是考查不同故障情况下在处理全局事务时WebLogic Server和Oracle的行为。
为了进行分析,确定了2个故障点:
- 数据库服务器故障
- WebLogic Server实例故障
这些故障可能会在事务处理过程中的下面两个点上出现:
8.2.2 事务准备好之前的数据库故障
通过执行下列测试来模拟这种情况:
- 客户端1启动一个全局事务,并将事务超时设为120秒。
- 客户端1在数据库表中插入一条记录,然后休眠30秒。
- 关掉数据库服务器实例(RAC节点1)。
- 客户端2尝试在数据库表中插入一条记录,主键与另一个全局事务内部的主键相同。
- 客户端1尝试提交唤醒后启动的事务。
在所有JDBC驱动程序情况下得到的观察结果都是一样的:
- RAC节点1崩溃后,Oracle RAC重新控制了表锁。但在此之前,等待时间没有达到指定的事务超时120秒。
- 客户端2的事务被路由到第二个RAC节点。
- 客户端2的事务提交成功。
- 客户端1在提交时出现了异常:尝试提交不存在的事务。
8.2.3 事务准备好之前的WebLogic Server故障
通过执行下列测试来模拟这种情况:
- 客户端1启动一个全局事务,并将事务超时设为120秒。
- 客户端1在数据库表中插入一条记录,然后休眠30秒。
- 关掉客户端1所连接到的WebLogic服务器实例。
- 客户端2连接到备用的WebLogic服务器实例,尝试在数据库表中插入一条记录,主键与另一个全局事务内部的主键相同。
- 客户端1尝试提交唤醒后启动的事务。
在所有JDBC驱动程序情况下得到的观察结果都是一样的:
- RAC节点1崩溃后,Oracle RAC重新控制了表锁。但在此之前,等待时间没有达到指定的事务超时120秒。
- 客户端2的事务提交成功。
- 客户端1在提交时出现了异常。
8.2.4 事务准备好后的数据库服务器故障
通过执行下列测试来模拟这种情况:
- 客户端1启动一个全局事务,并将事务超时设为120秒。
- 客户端1在数据库表中插入一条记录并提交该事务。(在准备好之后和提交事务之前WebLogic服务器事务管理器被自动设为休眠状态)。
- 该事务准备好之后关掉数据库服务器实例(RAC节点1)。
- 客户端2尝试在数据库表中插入一条记录,主键与另一个全局事务内部的主键相同。
在所有JDBC驱动程序情况下得到的观察结果都是一样的:
- 客户端2在提交ORA-01591时出现了异常——“lock held by in-doubt distributed transaction” 。
- WebLogic服务器事务管理器经RAC节点2成功地提交了客户端1的事务。
8.2.5 事务准备好后的WebLogic Server故障
通过执行下列测试来模拟这种情况:
- 客户端1启动一个全局事务,并将事务超时设为120秒。
- 客户端1在数据库表中插入一条记录并提交该事务。
- 该事务准备好之后关掉WebLogic Server实例。(在准备好之后和提交事务之前WebLogic服务器事务管理器被自动设为休眠状态)。
- 客户端2连接到备用的WebLogicServer实例,尝试在数据库表中插入一条记录,主键与另一个全局事务内部的主键相同。
在所有JDBC驱动程序情况下得到的观察结果都是一样的:
- 客户端2在提交ORA-02049时出现了异常——“timeout: distributed transaction waiting for lock”。
- 被关掉的WebLogic Server实例重启时客户端1的事务被提交。
8.3 测试环境
硬件:
名称:rp5470 (L-class)
CPU:4路系统
速度:875MHz
内存:16GB
硬盘:2个73GB硬盘驱动器
软件:
HP-UX 11i
ServiceGuard OPS Edition 11.14
Oracle 9i RAC Version 9.2.0.2
WebLogic Server 8.1.0.0
网络:1Gb
网络图:

8.3.1 软硬件配置
8.3.1.1 总体说明
Oracle9i RAC只能用于64位环境中。要确定是否拥有64位配置,请输入如下命令:
bin/getconf KERNEL_BITS
64
ServiceGuard OPS Edition 11.13和11.14支持Oracle9i 9.0.2 RAC
-l bundle | grep ServiceGuard
B5161FA A.11.14 ServiceGuard OPS Edition Bundle
- 建议Oracle9i RAC集群中的所有节点都应具有相似的内存配置、处理器架构和处理能力。
- 每个集群支持的RAC实例总数为127个。
- 完全支持HP Hyperfabric产品。
- 只有2节点配置才支持用HP-UX MirrorDisk/UX和SLVM进行软件镜像。
- 请注意,A.11.14.01版只是一个Itanium版,并且从这一版开始,ServiceGuard针对RAC的扩展 (SGeRAC;以前为ServiceGuard OPS Edition)的产品结构已经改变。SGeRAC目前是MC/ServiceGuard产品的一个附加产品,这意味着它只能安装在现有的MC/SG之上。这种新的结构将随MC/SG的下一个版本——A.11.15一起提供,以支持PA-RISC。
8.3.1.2 系统要求
各系统都必须具有
- 最小256 MB的RAM
- 最小400MB的交换空间
- 最小3GB的可用磁盘空间
- 最小512 MB的可用空间(/tmp下)。这是Oracle通用安装程序所要求的。
RAC集群必须具有
- 2个或2个以上的节点
- 节点间的冗余高速互联(如Hyperfabric、Hyperfabric交换机)
- 冗余网络组件(主LAN和备用LAN)
- 冗余磁盘存储器或RAID0/1配置,用于支持磁盘镜像
- 专用心跳线LAN(心跳线流量也在主LAN和备用LAN上传送)
- 冗余电源
8.3.1.3 补丁
March 2003 HP-UX补丁包
PHKL_25506
PHSS_26946 HP aC++ -AA运行时库(aCC A.03.37)
PHSS_28436 ld(1)和链接工具补丁集
PHNE_27745 HyperFabric B.11.11.0[0-2]补丁集
PHSS_27725 MC/SG 11.14
8.3.1.4 内核参数
内核参数 设定值 目的
KSI_ALLOC_MAX (NPROC * 8) 设定可分配的队列信号的系统宽限。
MAXDSIZ 1073741824 bytes 给出32位系统数据段大小的最大值。设置过低可能会使进程耗尽内存。
MAXDSIZ_64 2147483648 bytes 给出64位系统数据段大小的最大值。设置过低可能会使进程耗尽内存。
MAXSSIZ 134217728 bytes 设定32位系统堆栈段大小的最大值,单位字节。
MAXSSIZ_64BIT 1073741824 设定64位系统堆栈段大小的最大值,单位字节。
MAXSWAPCHUNKS (可用内存)/2 设定交换块数量的最大值,其中SWCHUNK是交换块的大小(1 KB的块)。SWCHUNK默认值为2048。
MAXUPRC (NPROC - 5) 设定用户进程数量的最大值。
MSGMAP (MSGTQL + 2) 设定消息映射项数量的最大值。
MSGMNI NPROC 设定消息队列标识符的数量。
MSGSEG (NPROC * 4) 设定可用的消息段数。
MSGTQL NPROC 设定消息头数。
NCALLOUT (NKTHREAD + 1) 设定挂起的超时线程的最大数量。
NCSIZE ((8 * NPROC + 2048) + VX_NCSIZE) 设定索引节所需的目录名查找高速缓存(DNLC)空间。VX_NCSIZE的默认值为1024。
NFILE (15 * NPROC + 2048) 设定打开文件的最大数量。
NFLOCKS NPROC 设定系统上可用文件锁的最大数量。
NINODE (8 * NPROC + 2048) 设定打开索引节的最大数量。
NKTHREAD (((NPROC * 7) / 4) + 16) 设定系统支持的内核线程的最大数量。
NPROC 4096 设定的最大进程数。
SEMMAP (SEMMNI + 2) 设定信号量映射表项的最大数量。
SEMMNI (SEMMNS / 2) 设定整个系统信号量集的最大数量。
SEMMNS (NPROC * 2) * 2 设定系统信号量的数量。SEMMNS的默认值为128,在大多数情况下,此默认值对于Oracle9i软件来说过低。
SEMMNU (NPROC - 4) 设定信号量undo结构的数量。
SEMVMX 32768 设定信号量的最大值。
SHMMAX 可用的物理内存 设定一个共享内存段的最大允许尺寸。SHMMAX设定值应足够大,以便在一个共享内存段中装下整个SGA。设置过低的结果是创建多个共享内存段,这样会降低性能。
SHMMNI 512 设定整个系统中共享内存段的最大数量。
SHMSEG 32 设定一个进程可访问的共享内存段的最大数量。
VPS_CEILING 64 设定由系统选择的页面的最大尺寸,以KB为单位。
如果以前已经将内核参数调至或高于上述值,可继续使用较高的值。内核参数的修改必须在系统重启后才能生效。
8.3.2 LVM设置
在VA7410上创建2个LUN。这2个LUN的磁盘设备文件为/dev/rdsk/c4t0d0和/dev/rdsk/c6t0d0。
在第一个节点创建物理卷、卷组和原始逻辑卷,然后将它们导出到第二个节点。
-f /dev/rdsk/c4t0d0
-f /dev/rdsk/c6t0d0
/dev/vg_rac
/dev/vg_rac/group c 64 0x020000
/dev/vg_rac /dev/dsk/c4t0d0 /dev/dsk/c6t0d0
-L 400 -n wlsdb_system /dev/vg_rac # 系统表空间
-L 120 -n wlsdb_user /dev/vg_rac # 用户表空间
-L 100 -n wlsdb_temp /dev/vg_rac # 临时表空间
-L 500 -n wlsdb_1_undo /dev/vg_rac # 每个实例一个撤消表空间
-L 500 -n wlsdb_2_undo /dev/vg_rac
-L 20 -n wlsdb_oemrepo /dev/vg_rac # OEM存储库
-L 72 -n wlsdb_indx /dev/vg_rac # 索引表空间
-L 12 -n wlsdb_tools /dev/vg_rac # 工具表空间
-L 92 -n wlsdb_dr /dev/vg_rac # DRYSYS表
-L 112 -n wlsdb_control1 /dev/vg_rac # 第一个控制文件
-L 112 -n wlsdb_control2 /dev/vg_rac # 第二个控制文件
-L 120 -n wlsdb_11_redo /dev/vg_rac # 每一实例2个ONLINE重做日志文件
-L 120 -n wlsdb_12_redo /dev/vg_rac
-L 120 -n wlsdb_21_redo /dev/vg_rac
-L 120 -n wlsdb_22_redo /dev/vg_rac
-L 8 -n wlsdb_spfile /dev/vg_rac # 用于存储spfile.ora
-L 100 -n wlsdb_srvmconf /dev/vg_rac # 用于存储RAC配置信息
-L 160 -n wlsdb_examples /dev/vg_rac # 用于示例模式
777 /dev/vg_rac
660 /dev/vg_rac/r*
oracle:dba /dev/vg_rac/r*
-a n /dev/vg_rac
-v -p -s -m /store/mapfile /dev/vg_rac
/store/mapfile oracle2:/store/mapfile
在作为根用户的第二个节点(oracle2):
/dev/vg_rac
/dev/vg_rac/group c 64 0x020000
-v -s -m /store/mapfile /dev/vg_rac
777 /dev/vg_rac
660 /dev/vg_rac/r*
oracle:dba /dev/vg_rac/r*
8.3.3 ServiceGuard集群设置
所有节点的根用户和oracle帐户都需要实现远程复制(rcp)。下面几行包含在这两个节点的根用户和oracle用户主目录下的.rhosts文件中。
oracle1 root
oracle1 oracle
oracle2 root
oracle2 oracle
在第一个节点创建一个集群配置模板
-n oracle1 -n oracle2 -v -C /etc/cmcluster/rac.asc
编辑集群配置文件rac.asc。针对该集群对此文件进行必要的修改。例如,更改集群名称、确定节点、确定心跳线ip地址、调整心跳间隔等。
检查集群配置
-v -C /etc/cmcluster/rac.asc
-a y /dev/vg_rac
创建二进制配置文件并将此集群配置发送到集群中的所有节点
-v -C /etc/cmcluster/rac.asc
-a n /dev/vg_rac
启动集群
-v # or cmrunnode -v on each node
将所有RAC卷组和集群锁卷组都设为可共享和集群可感知的
-S y -c y /dev/vg_rac
在集群的所有节点上以共享模式激活卷组
-a s /dev/vg_rac
检查集群状态
-v
CLUSTER STATUS
rac_cluster up
NODE STATUS STATE
oracle1 up running
oracle2 up running
要终止集群,须停用所有节点的卷组
-a n /dev/vg_rac
从集群中的任意节点终止集群
-v
8.3.4 RAC设置
使用Oracle通用安装程序安装Oracle真正应用集群。帮助信息参见“Real Application Clusters Setup and Configuration”文档,网址为:http://download-west.oracle.com/docs/cd/B10501_01/rac.920/a96600.pdf。
在Cluster Node Selection提示屏幕中选择两个节点。这使安装程序能够在这两个节点上安装Oracle软件。在Shared Configuration File Name提示处指定原始分区,用于写入RAC配置信息。
/dev/vg_rac/rwlsdb_srvmconf
在数据库创建过程中,对DBCA_RAW_CONFIG变量进行设置,使DBCA能够确定原始设备卷名:
DBCA_RAW_CONFIG=dbca.txt
创建文件dbca.txt,其内容为:
system=/dev/vg_rac/rwlsdb_system
spfile=/dev/vg_rac/rwlsdb_spfile
users=/dev/vg_rac/rwlsdb_user
temp=/dev/vg_rac/rwlsdb_temp
undotbs1=/dev/vg_rac/rwlsdb_1_undo
undotbs2=/dev/vg_rac/rwlsdb_2_undo
example=/dev/vg_rac/rwlsdb_examples
indx=/dev/vg_rac/rwlsdb_indx
tools=/dev/vg_rac/rwlsdb_tools
drsys=/dev/vg_rac/rwlsdb_dr
control1=/dev/vg_rac/rwlsdb_control1
control2=/dev/vg_rac/rwlsdb_control2
redo1_1=/dev/vg_rac/rwlsdb_11_redo
redo1_2=/dev/vg_rac/rwlsdb_12_redo
redo2_1=/dev/vg_rac/rwlsdb_21_redo
redo2_2=/dev/vg_rac/rwlsdb_22_redo
在安装过程将第一个节点/var/opt/oracle下的所有文件复制到第二个节点之后,安装程序应该已经执行完这一步。
在所有节点以oracle用户身份启动Oracle
start
"/ as sysdba"
SQL> startup
LSNRCTL> start
终止所有节点Oracle的运行
stop
"/ as sysdba"
SQL> shutdown
LSNRCTL> stop
8.3.5 HP集群互联技术
8.3.5.1 HyperFabric
HyperFabric是一种高速集群互联解决方案,既支持IP之上行业标准的TCP/UDP协议,又支持HP专有的Hyper消息传递协议(Hyper Messaging Protocol,HMP)。HyperFabric无需调用MC/ServiceGaurd即可提供多网卡(NIC)间连接流量的透明负载均衡和从一个网卡到另一个网卡的透明故障切换,因而扩展了TCP/UDP的可伸缩性和可靠性。HyperFabric NIC中集成了一个网络处理器,用于实现HP的Hyper消息传递协议,与千兆以太网相比,它使在HyperFabric之上进行标准TCP/UDP基准测试的等待时间更短,主CPU的使用率更低。HP HyperFabric的首次发布是在1998年,当时在铜缆上的链路速率为2.56 Gbps。2001年,HP又发布了HyperFabric 2,它在光纤上的链路速率达到了4.0 Gbps,同时兼容HyperFabric的铜缆接口。这两种HyperFabric产品都支持多达64个节点的集群。
8.3.5.2 HyperFabric交换机
HP专有的HyperFabric交换机的最新产品为HyperFabric 2,它是一组新的硬件组件,带有光纤连接器,可实现低等待时间、高带宽的系统互联,这使HP可以提供最快的集群互连。借助光纤接口,HyperFabric 2可在更远的距离(达200米)内提供更快的速度——全双工模式下高达4Gbps。HyperFabric 2还提供了优异的可伸缩性,在点对点连接时最多可支持16台主机,通过光纤交换机连接时最多可支持64台主机。它向下兼容HyperFabric的以前版本,可用于IA-64、PA-RISC服务器上。
8.3.5.3 Hyper消息传递协议(HMP)
通过与Oracle合作,HP设计了一种专为满足企业级并行数据库应用程序需要而量身定制的集群互连产品——Hyper消息传递协议,它大大扩展了TCP/UDP所提供的功能集,为远程直接内存访问(RDMA)和传统的消息语义提供了一个真实可靠的数据报模型。加上OS的旁路功能和HyperFabric为协议卸载提供的硬件支持,以及借助针对业务关键的并行应用程序(如Oracle 9i RAC)而优化的接口和功能集,HMP可实现高带宽、低等待时间和极低的CPU使用率。
8.3.5.4 在HyperFabricII上使用HMP
要想在HyperfabricII上使用HMP,只需重新链接Oracle,方法如下:
/rdbms/lib
-f ins_rdbms.mk ipc_hms rac_on ioracle
注意:ipc_hms在env_rdbms.mk中
要想切换回UDP,可以:
-f ins_rdbms.mk ipc_udp rac_on ioracle
要想禁用RAC功能、单一实例,可以:
/rdbms/lib
-f ins_rdbms.mk ipc_none rac_off ioracle
8.3.6 测试配置
8.3.6.1 JDBC连接池与数据源
WebLogic服务器域
|____examplesWebApp
|
|____ JDBC Connection Pools
|____oracleOciPool (non XA)
|____oracleOciXaPool
|____oracleOciXaPool2
|____oracleJDriverPool (non XA)
|____oracleJDriverXaPool
|____oracleJDriverXaPool2
|____oracleThinDriver (non XA)
|____oracleThinXaPool
|____oracleThinXaPool2
|____Data Source
|____OracleOciDS
|____OracleOciXaDS
|____OracleOciXaDS2
|____JDriverDS
|____JDriverXaDS
|____JDriverXaDS2
|____ThinDS
|____ThinXaDS
|____ThinXaDS2e
8.3.6.2 JDBC Connection Pool Attributes
- TestReservedConnections=true
- ConnectionCreationRetryFrequencySecond=10
- AllowShrinking=true
- ShrinkFrequency=300
- InitialCapacity=0
- MaximumCapacity=15
- LoginTimeout=10
8.3.6.3 WebLogic Server configuration file ("config.xml")
<?xml version="1.0" encoding="UTF-8"?>
<Domain ConfigurationVersion="8.1.0.0" Name="testAppDomain">
<Cluster MulticastAddress="237.0.0.1" Name="testAppCluster"/>
<Server COMEnabled="true" ConsoleInputEnabled="false"
JDBCLoggingEnabled="true" JavaCompiler="javac"
ListenAddress="192.170.43.185" ListenPort="7001" Name="admin"
ServerVersion="8.1.0.0" SocketReaderTimeoutMaxMillis="10"
StdoutSeverityLevel="64">
<SSL Enabled="true" IdentityAndTrustLocations="KeyStores"
ListenPort="7002" Name="admin"/>
</Server>
<Server ExpectedToRun="false" GracefulShutdownTimeout="10"
IIOPEnabled="false" IgnoreSessionsDuringShutdown="true"
ListenAddress="192.170.43.185" ListenPort="8001"
Name="testApp1"
NativeIOEnabled="true" ServerVersion="8.1.0.0"
StdoutSeverityLevel="64">
<SSL Enabled="false" IdentityAndTrustLocations="KeyStores"
ListenPort="8002" Name="testApp1"/>
<ExecuteQueue Name="weblogic.kernel.Defau??????开????1储?lt"
ThreadCount="15"/>
</Server>
<Application Deployed="true" Name="mainWebApp"
Path="./applications"
StagingMode="nostage" TwoPhase="true">
<WebAppComponent Name="mainWebApp" Targets="admin"
URI="mainWebApp"/>
</Application>
<Application Deployed="true" Name="examplesWebApp"
Path="./applications" StagingMode="nostage" TwoPhase="true">
<WebAppComponent Name="examplesWebApp" Targets="testApp1,testApp2"
URI="examplesWebApp"/>
</Application>
<StartupClass ClassName="examples.cluster.rmi.HelloClusterImpl"
FailureIsFatal="false" Name="hello_cluster" Targets=""/>
<StartupClass Arguments="port=7001"
ClassName="examples.startup.StartBrowser" FailureIsFatal="false"
Name="StartBrowser"
Notes="On Windows, this class automatically starts a browser
after the server has finished booting." Targets="admin"/>
<StartupClass ClassName="examples.rmi.hello.HelloImpl"
FailureIsFatal="false" Name="hello" Targets=""/>
<StartupClass ClassName="examples.rmi.multihello.HelloImpl"
FailureIsFatal="false" Name="multihello" Targets=""/>
<StartupClass
Arguments="connectionFactory=weblogic.examples.
jms.TopicConnectionFactory,
topic=weblogic.examples.jms.exampleTopic"
ClassName="examples.jms.startup.ServerReceive"
FailureIsFatal="false" Name="serverReceive" Targets=""/>
<StartupClass
Arguments="connectionFactory=weblogic.examples.jms.
TopicConnectionFactory,
topic=weblogic.examples.jms.exampleTopic"
ClassName="examples.jms.startup.ServerReceive"
FailureIsFatal="false" Name="serverReceive" Targets=""/>
<StartupClass
Arguments="connectionFactory=weblogic.examples.jms.
TopicConnectionFactory,
topic=weblogic.examples.jms.exampleTopic"
ClassName="examples.jms.startup.PoolReceive"
FailureIsFatal="false" Name="poolReceive" Targets=""/>
<JMSConnectionFactory
JNDIName="weblogic.examples.jms.QueueConnectionFactory"
Name="exampleQueue" Targets="admin"/>
<JMSConnectionFactory
JNDIName="weblogic.examples.jms.TopicConnectionFactory"
Name="exampleTopic" Targets="admin"/>
<JMSConnectionFactory JNDIName="jms.connection.traderFactory"
Name="exampleTrader" Targets="admin"/>
<JMSJDBCStore ConnectionPool="demoPool" Name="exampleJDBCStore"
PrefixName="examples"/>
<JMSServer Name="examplesJMSServer" Store="exampleJDBCStore"
Targets="admin">
<JMSQueue JNDIName="weblogic.examples.jms.
exampleQueue"
Name="exampleQueue"/>
<JMSQueue JNDIName="weblogic.examples.jms.
exampleQueueReceive"
Name="exampleQueueReceive"/>
<JMSQueue JNDIName="weblogic.examples.jms.exampleQueueSend"
Name="exampleQueueSend"/>
<JMSTopic JNDIName="weblogic.examples.jms.exampleTopic"
Name="exampleTopic"/>
<JMSTopic JNDIName="quotes" Name="quotes"/>
</JMSServer>
<JDBCConnectionPool CapacityIncrement="2"
DriverName="oracle.jdbc.driver.OracleDriver" InitialCapacity="4"
LoginDelaySeconds="1" MaxCapacity="10" Name="oraclePool"
Password="{3DES}c9e/PcUTmmM=" Properties="user=system"
RefreshMinutes="10" ShrinkPeriodMinutes="15"
ShrinkingEnabled="true" Targets=""
TestConnectionsOnRelease="false" TestConnectionsOnReserve="true"
TestTableName="dual" URL="jdbc:oracle:thin::1521:wlsdb"/>
<JDBCConnectionPool CapacityIncrement="1"
DriverName="com.pointbase.xa.xaDataSource" InitialCapacity="2"
MaxCapacity="10" Name="demoXAPool"
Password="{3DES}BTSwb7yY0L3/m4H2TAE71w=="
Properties="user=examples;DatabaseName=jdbc:pointbase:server:
//localhost/demo"
RefreshMinutes="0" ShrinkPeriodMinutes="15"
ShrinkingEnabled="true" Targets="admin"
TestConnectionsOnRelease="false"
TestConnectionsOnReserve="fa??????开????1储?lse" URL="jdbc:pointbase:server:
//localhost/demo"/>
<JDBCConnectionPool CapacityIncrement="1"
DriverName="com.pointbase.jdbc.jdbcUniversalDriver"
InitialCapacity="1" MaxCapacity="10" Name="demoPool"
Password="{3DES}BTSwb7yY0L3/m4H2TAE71w=="
Properties="user=examples" RefreshMinutes="0"
ShrinkPeriodMinutes="15" ShrinkingEnabled="true" Targets="admin"
TestConnectionsOnRelease="false"
TestConnectionsOnReserve="false" URL="jdbc:pointbase:server:
//localhost/demo"/>
<JDBCTxDataSource JNDIName="examples-dataSource-oracleXAPool"
Name="examples-dataSource-oracleXAPool" PoolName="oraclePool"
Targets=""/>
<JDBCTxDataSource JNDIName="examples-dataSource-demoPool"
Name="examples-dataSource-demoPool" PoolName="demoPool"
Targets="admin"/>
<JDBCTxDataSource JNDIName="examples-dataSource-demoXAPool"
Name="examples-dataSource-demoXAPool" PoolName="demoXAPool"
Targets="admin"/>
<JTA AbandonTimeoutSeconds="86400"
BeforeCompletionIterationLimit="100" ForgetHeuristics="false"
MaxTransactions="10000" MaxUniqueNameStatistics="1000"
Name="testAppDomain" TimeoutSeconds="100"/>
<Security Name="testAppDomain"
PasswordPolicy="wl_default_password_policy"
Realm="wl_default_realm" RealmSetup="true"/>
<EmbeddedLDAP
Credential="{3DES}muAUte29mCeiFWZzZXj
XMw0DbdfmM2b12YtRdQtOkP8="
Name="testAppDomain"/>
<SecurityConfiguration
Credential="{3DES}a7qr/8Y+vZ8y5tEapqbuSMSZh8wTnWSPOORruLTD5SIuu6kd
NUQVtOrhIDS3DcrTOSSzpcb43/IiJtL9eW6TXbCddEG0GeZX"
Name="testAppDomain" RealmBootStrapVersion="1"/>
<Realm FileRealm="wl_default_file_realm" Name="wl_default_realm"/>
<FileRealm Name="wl_default_file_realm"/>
<PasswordPolicy Name="wl_default_password_policy"/>
<Application Name="_appsdir_ejb20_basic_containerManaged_ear"
Path="/bea/user_projects/testAppDomain/applicatio??????开????1储?ns
/ejb20_basic_containerManaged.ear"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<EJBComponent Name="ejb20_basic_containerManaged.jar"
Targets="admin" URI="ejb20_basic_containerManaged.jar"/>
</Application>
<Application Name="_appsdir_jta_ejb_jmsjdbc_jar"
Path="/bea/user_projects/testAppDomain/applications"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<EJBComponent Name="jta_ejb_jmsjdbc" Targets="admin"
URI="jta_ejb_jmsjdbc.jar"/>
</Application>
<Application Name="_appsdir_ejb20_basic_statelessSession_ear"
Path="/bea/user_projects/testAppDomain/applications
/ejb20_basic_statelessSession.ear"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<EJBComponent Name="ejb20_basic_statelessSession.jar"
Targets="admin" URI="ejb20_basic_statelessSession.jar"/>
</Application>
<Application Name="_appsdir_jms_messageformat_jar"
Path="/bea/user_projects/testAppDomain/applications"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<EJBComponent Name="jms_messageformat" Targets="admin"
URI="jms_messageformat.jar"/>
</Application>
<Application Name="_appsdir_ejb20_basic_statefulSession_ear"
Path="/bea/user_projects/testAppDomain/applications
/ejb20_basic_statefulSession.ear"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<EJBComponent Name="ejb20_basic_statefulSession.jar"
Targets="admin" URI="ejb20_basic_statefulSession.jar"/>
</Application>
<Application Name="_appsdir_xml_xslt_content_ear"
Path="/bea/user_projects/testAppDomain/applications
/xml_xslt_content.ear"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<EJBComponent Name="xml_xslt_content.jar" Targets="admin"
URI="xml_xslt_content.jar"/>
</Application>
<Application Name="_appsd??????开????1储?ir_ejb20_basic_beanManaged_ear"
Path="/bea/user_projects/testAppDomain/applications
/ejb20_basic_beanManaged.ear"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<EJBComponent Name="ejb20_basic_beanManaged.jar"
Targets="admin"
URI="ejb20_basic_beanManaged.jar"/>
</Application>
<Application Name="_appsdir_jdbc_oracle_ext_ear"
Path="/bea/user_projects/testAppDomain/applications
/jdbc_oracle_ext.ear"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<EJBComponent Name="jdbc_oracle_ext.jar" Targets="admin"
URI="jdbc_oracle_ext.jar"/>
</Application>
<Application Name="_appsdir_webservices_trader_ear"
Path="/bea/user_projects/testAppDomain/applications
/webservices_trader.ear"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<WebServiceComponent Name="webservice" Targets="admin"
URI="trader_service.war"/>
<EJBComponent Name="trader.jar" Targets="admin"
URI="trader.jar"/>
</Application>
<Application Name="_appsdir_ejb20_message_ear"
Path="/bea/user_projects/testAppDomain/applications
/ejb20_message.ear"
StagedTargets="admin" StagingMode="stage" TwoPhase="true">
<EJBComponent Name="ejb20_message.jar" Targets="admin"
URI="ejb20_message.jar"/>
</Application>
<JDBCConnectionPool ConnectionCreationRetryFrequencySeconds="10"
DriverName="oracle.jdbc.xa.client.OracleXADataSource"
InitialCapacity="0" KeepXAConnTillTxComplete="true"
Name="oracleOciXaPool" Password="{3DES}c9e/PcUTmmM="
Properties="user=system;server=wlsdb;LoginTimeout=10"
ShrinkFrequencySeconds="300" StatementCacheSize="200"
Targets="testApp1,testApp2" TestConnectionsOnReserve="true"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:oracle:oci8:"/>
<Server ActiveDirectoryName="./testApp1/stage"
ExpectedToRun="false"
??????开????1储?GracefulShutdownTimeout="15" IIOPEnabled="false"
IgnoreSessionsDuringShutdown="true"
JNDITransportableObjectFactoryList=""
ListenAddress="192.170.43.204" ListenPort="9001" Name="testApp2"
NetworkAccessPoints="" ServerVersion="8.1.0.0"
StagingDirectoryName="" StdoutSeverityLevel="64">
<ServerDebug Name="testApp2"/>
<SSL Ciphersuites="" Enabled="false"
IdentityAndTrustLocations="KeyStores" ListenPort="9002"
Name="testApp2"/>
<KernelDebug Name="testApp2"/>
<Log Name="testApp2"/>
<ServerStart Name="testApp2"
Password="{3DES}oKWR0ZIzBvBVvgpsXevJrg=="
Username="weblogic"/>
<WebServer LogFileName="testApp2/access.log" Name="testApp2"
Targets=""/>
<COM Name="testApp2"/>
<IIOP Name="testApp2"/>
<JTAMigratableTarget ConstrainedCandidateServers=""
Name="testApp2" UserPreferredServer="testApp2"/>
<JTARecoveryService Name="testApp2"/>
</Server>
<JDBCConnectionPool ConnectionCreationRetryFrequencySeconds="10"
DriverName="weblogic.jdbc.oci.xa.XADataSource"
InitialCapacity="0" KeepXAConnTillTxComplete="true"
Name="oracleJDriverXAPool" Password="{3DES}c9e/PcUTmmM="
Properties="user=system;server=wlsdb;LoginTimeout=10"
ShrinkFrequencySeconds="300" StatementCacheSize="200"
Targets="testApp1,testApp2" TestConnectionsOnReserve="true"
TestTableName="SQL SELECT 1 FROM DUAL" URL="jdbc:weblogic:oracle"/>
<JDBCTxDataSource JNDIName="JDriverXaDS" Name="JDriverXaDS"
PoolName="oracleJDriverXAPool" Targets="testApp1,testApp2"/>
<JDBCTxDataSource JNDIName="OracleOciXaDS"
Name="OracleOciXaDS" PoolName="oracleOciXaPool"
Targets="testApp1,testApp2"/>
<JDBCConnectionPool ConnectionCreationRetryFrequencySeconds="10"
DriverName="oracle.jdbc.xa.client.OracleXADataSource"
InitialCapacity="0" KeepXAConnTill??????开????1储?TxComplete="true"
Name="oracleOciXaPool2" Password="{3DES}c9e/PcUTmmM="
Properties="user=system;server=wlsdb;LoginTimeout=10"
ShrinkFrequencySeconds="300" StatementCacheSize="200"
Targets="testApp1,testApp2" TestConnectionsOnReserve="true"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:oracle:oci8:"/>
<JDBCConnectionPool
ConnectionCreationRetryFrequencySeconds="10"
DriverName="weblogic.jdbc.oci.xa.XADataSource"
InitialCapacity="0" KeepXAConnTillTxComplete="true"
Name="oracleJDriverXAPool2" Password="{3DES}c9e/PcUTmmM="
Properties="user=system;server=wlsdb;LoginTimeout=10"
ShrinkFrequencySeconds="300" StatementCacheSize="200"
Targets="testApp1,testApp2" TestConnectionsOnReserve="true"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:weblogic:oracle"/>
<JDBCTxDataSource JNDIName="OracleOciXaDS2"
Name="OracleOciXaDS2" PoolName="oracleOciXaPool2"
Targets="testApp1,testApp2"/>
<JDBCTxDataSource JNDIName="JDriverXaDS2"
Name="JDriverXaDS2" PoolName="oracleJDriverXAPool2"
Targets="testApp1,testApp2"/>
<JDBCConnectionPool DriverName="oracle.jdbc.driver.OracleDriver"
InitialCapacity="0" Name="oracleOciPool"
Password="{3DES}c9e/PcUTmmM="
Properties="user=system;LoginTimeout=10"
Targets="testApp1,testApp2"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:oracle:oci8:"/>
<JDBCConnectionPool DriverName="weblogic.jdbc.oci.Driver"
InitialCapacity="0" Name="oracleJDriverPool"
Password="{3DES}c9e/PcUTmmM="
Properties="user=system;server=wlsdb;LoginTimeout=10"
Targets="testApp1,testApp2" TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:weblogic:oracle"/>
<JDBCDataSource JNDIName="OracleOciDS" Name="OracleOciDS"
PoolName="oracleOciPool" Targets="testApp1,testApp2"/>
<JDBCDataSource JNDIName="JDriverDS" Name="JDriverDS"
Po??????开????1储?olName="oracleJDriverPool" Targets="testApp1,testApp2"/>
<JDBCConnectionPool ConnectionCreationRetryFrequencySeconds="10"
DriverName="oracle.jdbc.xa.client.OracleXADataSource"
InitialCapacity="0" Name="oracleThinXaPool"
Password="{3DES}c9e/PcUTmmM=" Properties="user=system"
ShrinkFrequencySeconds="300" StatementCacheSize="200"
Targets="testApp1" TestConnectionsOnReserve="true"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:oracle:thin:@(description=(address_list=
(address=(host=oracle1)
(protocol=tcp)(port=1521))(address=(host=oracle2)(protocol=tcp)
(port=1521))
(load_balance=yes)(failover=yes))(connect_data=(service_name=wlsdb)))"/>
<JDBCConnectionPool ConnectionCreationRetryFrequencySeconds="10"
DriverName="oracle.jdbc.xa.client.OracleXADataSource"
InitialCapacity="0" Name="oracleThinXaPool2"
Password="{3DES}c9e/PcUTmmM=" Properties="user=system"
ShrinkFrequencySeconds="300" StatementCacheSize="200"
Targets="testApp1,testApp2" TestConnectionsOnReserve="true"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:oracle:thin:@(description=(address_list=
(address=(host=oracle1)
(protocol=tcp)(port=1521))(address=(host=oracle2)(protocol=tcp)
(port=1521))
(load_balance=yes)(failover=yes))(connect_data=(service_name=wlsdb)))"/>
<JDBCConnectionPool ConnectionCreationRetryFrequencySeconds="10"
DriverName="oracle.jdbc.driver.OracleDriver" InitialCapacity="0"
Name="oracleThinPool" Password="{3DES}c9e/PcUTmmM="
Properties="user=system" ShrinkFrequencySeconds="300"
StatementCacheSize="200" Targets="testApp1,testApp2"
TestConnectionsOnReserve="true"
TestTableName="SQL SELECT 1 FROM DUAL"
URL="jdbc:oracle:thin:@(description=(address_list=
(address=(host=oracle1)
(protocol=tcp)(port=1521))(address=(host=oracle2)(protocol=tcp)
(port=1521))
(load_balance=yes)(failover=yes))(connect_data=(service_name=wlsdb)))"/>
&??????开????1储?lt;JDBCDataSource JNDIName="ThinDS" Name="ThinDS"
PoolName="oracleThinPool" Targets="testApp1,testApp2"/>
<JDBCTxDataSource JNDIName="ThinXaDS" Name="ThinXaDS"
PoolName="oracleThinXaPool" Targets="testApp1,testApp2"/>
<JDBCTxDataSource JNDIName="ThinXaDS2" Name="ThinXaDS2"
PoolName="oracleThinXaPool2" Targets="testApp1,testApp2"/>
</Domain>
8.3.6.4 Oracle "tnsnames.ora" file
# TNSNAMES.ORA Network Configuration File:
/oracle/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.
WLSDB =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle1)(PORT = 1521))
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle2)(PORT = 1521))
(LOAD_BALANCE = on)
(FAILOVER = on)
(enable = broken)
)
(CONNECT_DATA =
(SERVICE_NAME = wlsdb)
(FAILOVER_MODE=
(TYPE=SELECT)
(METHOD=BASIC)
(RETRIES=1)
(DELAY=1))
)
)
WLSDB2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle2)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = wlsdb)
(INSTANCE_NAME = wlsdb2)
)
)
WLSDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oracle1)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = wlsdb)
(INSTANCE_NAME = wlsdb1)
)
)
|