集成WebLogic 和Oracle RAC(中)
4.WebLogic
集群和Oracle
RAC的集成方案
我们结合事务处理以及集群要求需求给出下面的应用场景及其配置方案供选择:
应用需求以及场景
配置方案
负载均衡
失败转移
全局事务(XA)
WebLogic JMS Store
Y
Y
Y
N
MultiPool+XA配置方案
Y
Y
N
N
MultiPool无XA配置方案
N
Y
N
Y
JDBC Connect-time Failover 没XA配置方案
N
Y
Y
N
JDBC Connect-time Faliover+XA配置方案
请注意不管是适用哪种方式,都需要使用Oracle 10g JDBC Thin Driver。
4.1 Oracle 10g
RAC与WebLogic 8.1.5使用方案1(MultiPool+XA)
从WebLogic Server 上配置MultiPool连接到多个Oracle RAC节点时,首先在一个WebLogic Server的实例上为一个Oracle RAC 节点配置一个JDBC连接池,如果有2个Oracle
RAC节点则配置2个连接池,如下图所示
然后再添加MultiPool,配置MultiPool时选择负载均衡或者高可靠性的算法,并且为该MultiPool添加上步创建的连接池。该过程可以通过WebLogic管理控制台进行配置当然也可以适用weblogic.Admin 命令行,或者使用WebLogic Scripting
Tool(WLST),或者JMX程序来配置。
在这种配置下使用数据库连接的过程是这样的,程序首先在JNDI树上查找MultiPool的数据源(Data source)然后给数据源(Data source)发个需要数据库连接的请求,于是数据源(Data source)与MultiPool通信,MultiPool根据创建MultiPool时选择的算法(负载均衡还是高可靠性)决定在MultiPool的列表里的哪个连接池将被使用。
当使用MultiPool+XA事务时,MultiPool绑定了当前的XA事务到其中的一个也是唯一的一个Oracle RAC的实例上,如果一个RAC的实例失败,失败转移回发生在MultiPool级别,如果当前操作所在的Oracle RAC实例失败时,当前事务还在PREPARE阶段之前,当前操作会继续重试直到重试超时,而如果当前事务已经处于PREPARE阶段之后时,即当前的操作包括事务将被MultiPool中的其他连接池接管。
设置MultiPool+XA配置方式的规则:
1.MultiPool里所有的连接池必须都是同类的,即连接池都必须是XA的连接池。
2.
MultiPool里所有的连接池里的所有的XA相关的属性必须被设置成一样包括如下的属性:
–
XARetryDurationSeconds
–
SupportsLocalTransaction
–
KeepXAConnTillTxComplete
–
NeedTxCtxOnClose
–
XAEndOnlyOnce
–
NewXAConnForCommit
–
RollbackLocalTxUponConnClose
–
RecoverOnlyOnce
–
KeepLogicalConnOpenOnRelease
3. MultiPool里每一个连接池必须设置下面的属性:
1.Oracle JDBC Thin driver 10g.
例子:
DriverName="oracle.jdbc.xa.client.OracleXADataSource"
URL="jdbc:oracle:thin:@db_server1:1521:SNRAC1"
2.KeepXAConnTillTxComplete="true"
–强制绑定当前的数据库连接直到上边的XA事务完成,这个属性必须设置为True
3.XARetryDurationSeconds="300"
4.CountOfTestFailuresTillFlush="1"
5. TestConnectionsOnReserve="true"
6. TestTableName="name_of_small_table"
关于WebLogic 的集群配置超脱本文的范畴,在本文里不进行详细的讨论,请参考BEA在线文档
下面是一个config.xml里面的JDBC以及MultiPool的配置的例子,供参考
Name="oracleRACPool_1"
DriverName="oracle.jdbc.OracleDriver"
InitialCapacity="5"
MaxCapacity="100"
Password="{3DES}I5fj3vh4+nI="
Properties="user=SCOTT"
RefreshMinutes="5"
TestConnectionsOnReserve="true"
TestTableName="dual"
Targets="myWebLogicCluster"
URL="jdbc:oracle:thin:@dbhost1:1521:dbservice"