The sample build.xml
, oraracconf.py
and oraracconf.py.properties
listed in this appendix provide an example of how to configure an existing WebLogic Portal domain to point to an Oracle RAC database. For more information, see Using WebLogic Portal with Oracle RAC.
from java.lang import Exception
from jarray import array
from com.bea.plateng.domain.script.jython import WLSTException
import re
class SkipConfError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return repr(self.msg)
class OracleRAC:
instance = None
def __init__(self):
try:
self.sid = oracle_rac_sid
except NameError, ne:
raise SkipConfError, "Oracle RAC disabled, skipping. "
print "Re-configuring data sources to target Oracle RAC: " + self.sid
self.initClusterSize()
self.vips=[]
self.ports=[]
self.sids=[]
for i in range(self.size):
index = i + 1
self.vips.append( eval("oracle_rac_vip_" + str(index)) )
self.ports.append( eval("oracle_rac_port_" + str(index)) )
self.sids.append( eval("oracle_rac_sid_" + str(index)) )
self.initDriverURL()
self.xa_driver = oracle_xa_driver
self.nonxa_driver = oracle_nonxa_driver
OracleRAC.instance = self
def initClusterSize(self):
self.size = 0
while true:
try:
eval('oracle_rac_vip_' + str(self.size+1))
self.size += 1
except NameError:
return
def initDriverURL(self):
self.driver_url = 'jdbc:oracle:thin:@(DESCRIPTION =(ADDRESS_LIST ='
for i in range(self.getSize()):
self.driver_url += '(ADDRESS = (PROTOCOL = TCP)(HOST = ' + self.vips[i] + ')(PORT = ' + self.ports[i] + '))'
self.driver_url += '(FAILOVER=on)(LOAD_BALANCE=load_balancing_var))(CONNECT_DATA =(SERVER = DEDICATED)(SERVICE_NAME = ' + self.sid + ')))'
def getSize(self):
if self.size < 0:
self.initClusterSize()
return self.size
def getDriverDSURL(self, loadbal):
return self.driver_url.replace('load_balancing_var',loadbal)
def getMultiDSURL(self, node):
index = node - 1
return 'jdbc:oracle:thin:@'+ self.vips[index] +':'+ self.ports[index] +':'+ self.sids[index]
class DataSource:
def __init__(self, dsName, user, passwd):
self.dsName = dsName
self.user = user
self.passwd = passwd
cd('/JDBCSystemResource/' + dsName + '/JdbcResource/' + dsName + '/JDBCDataSourceParams/NO_NAME_0')
jarray_jndi_names=get('JNDINames')
self.jndi_names=[]
for jname in jarray_jndi_names:
self.jndi_names.append(jname)
def deleteDataSource(self, dsName):
try:
WLDomain.instance.all_datasources.index(dsName)
cd('/')
print "Deleting datasource: " + dsName
delete(dsName,'JDBCSystemResource')
print dsName + " deleted!"
except ValueError:
print dsName + " does not exist!"
def createPhysicalDataSource(self, dsName, jndiName, xaProtocol, url, xa_driver, user, passwd):
print 'Creating Physical DataSource ' + dsName
self.deleteDataSource(dsName)
cd('/')
sysRes = create(dsName, "JDBCSystemResource")
cd('/JDBCSystemResource/' + dsName + '/JdbcResource/' + dsName)
dataSourceParams=create('dataSourceParams','JDBCDataSourceParams')
dataSourceParams.setGlobalTransactionsProtocol(xaProtocol)
cd('JDBCDataSourceParams/NO_NAME_0')
print "Setting JNDI Names: "
print jndiName
set('JNDIName',jndiName)
cd('/JDBCSystemResource/' + dsName + '/JdbcResource/' + dsName)
connPoolParams=create('connPoolParams','JDBCConnectionPoolParams')
connPoolParams.setMaxCapacity(20)
connPoolParams.setInitialCapacity(5)
connPoolParams.setCapacityIncrement(1)
connPoolParams.setTestConnectionsOnReserve(true)
connPoolParams.setTestTableName('SQL SELECT 1 FROM DUAL')
cd('/JDBCSystemResource/' + dsName + '/JdbcResource/' + dsName)
driverParams=create('driverParams','JDBCDriverParams')
driverParams.setUrl(url)
if xa_driver == "true":
driverParams.setDriverName(OracleRAC.instance.xa_driver)
else:
driverParams.setDriverName(OracleRAC.instance.nonxa_driver)
driverParams.setPasswordEncrypted(passwd)
cd('JDBCDriverParams/NO_NAME_0')
create(dsName,'Properties')
cd('Properties/NO_NAME_0')
create('user', 'Property')
cd('Property/user')
cmo.setValue(user)
if xaProtocol != "None":
cd('/JDBCSystemResource/' + dsName + '/JdbcResource/' + dsName)
XAParams=create('XAParams','JDBCXAParams')
XAParams.setKeepXaConnTillTxComplete(true)
XAParams.setXaRetryDurationSeconds(300)
XAParams.setXaTransactionTimeout(120)
XAParams.setXaSetTransactionTimeout(true)
XAParams.setXaEndOnlyOnce(true)
assign('JDBCSystemResource',dsName,'Target',WLDomain.instance.targetServer)
print dsName + ' successfully created.'
class MultiDataSource(DataSource):
def __init__(self, dsName, user, passwd):
DataSource.__init__(self, dsName, user, passwd)
self.xa_protocol = eval(dsName.replace('-','_') + '_xa_protocol')
self.xa_driver = eval(dsName.replace('-','_') + '_xa_driver')
self.mp_algorithm = eval(dsName.replace('-','_') + '_mp_algorithm')
def configure(self):
print 'Creating Multi DataSource ' + self.dsName
self.deleteDataSource(self.dsName)
ds_list = ''
for i in range(OracleRAC.instance.size):
index = i + 1
physical_ds_name = self.dsName + '-' + str(index)
self.createPhysicalDataSource(physical_ds_name, physical_ds_name, self.xa_protocol, OracleRAC.instance.getMultiDSURL(index), self.xa_driver, self.user, self.passwd)
if i > 0:
ds_list += ','
ds_list += physical_ds_name
cd('/')
sysRes = create(self.dsName, "JDBCSystemResource")
cd('/JDBCSystemResource/' + self.dsName + '/JdbcResource/' + self.dsName)
dataSourceParams=create('dataSourceParams','JDBCDataSourceParams')
dataSourceParams.setAlgorithmType(self.mp_algorithm)
dataSourceParams.setDataSourceList(ds_list)
cd('JDBCDataSourceParams/NO_NAME_0')
print "Setting JNDI Names: "
print self.jndi_names
set('JNDINames',self.jndi_names)
set('GlobalTransactionsProtocol',self.xa_protocol)
assign('JDBCSystemResource',self.dsName,'Target',WLDomain.instance.targetServer)
print 'Multi DataSource '+ self.dsName + ' successfully created.'
class PhysicalDataSource(DataSource):
def __init__(self, dsName, user, passwd):
DataSource.__init__(self, dsName, user, passwd)
self.loadbalance = eval(dsName.replace('-','_') + '_loadbalance')
def configure(self):
print "Re-configuring existing datasource: " + self.dsName
self.createPhysicalDataSource(self.dsName, self.jndi_names, 'None', OracleRAC.instance.getDriverDSURL(self.loadbalance), 'false', self.user, self.passwd)
print self.dsName + ' successfully re-configured.'
class WLDomain:
instance = None
def __init__(self):
try:
self.db_user = database_user
self.db_passwd = database_passwd
except NameError, ne:
print "No databse user/password specified. Will not configure portalDataSource, etc."
try:
self.gs_user = groupspace_user
self.gs_passwd = groupspace_passwd
except NameError, ne:
print "No groupspace cmrepo user/password specified. Will not configure appGroupSpaceDataSource"
try:
readDomain(domain_dir)
server=ls('Server').splitlines()
self.targetServer = re.split('\s+', server[0])[1]
except IndexError, ie:
raise SkipConfError, "No valid domain found at: " + domain_dir + ". Skipping RAC configuration. "
except NameError, ne:
print "Required parameter domain_dir not specified! "
sys.exit(-1)
self.all_datasources = ls('/JDBCSystemResource').splitlines()
for i in range(len(self.all_datasources)):
self.all_datasources[i]= re.split('\s+', self.all_datasources[i])[1]
WLDomain.instance = self
def configure(self):
for dsName in self.all_datasources:
print "Processing datasource: " + dsName + " ..."
try:
is_mp=eval(dsName.replace('-','_') + '_is_mp')
except NameError:
print "Skipping unknown datasource: " + dsName
continue
try:
if dsName == 'appsGroupSpaceDataSource':
user = self.gs_user
passwd = self.gs_passwd
else:
user = self.db_user
passwd = self.db_passwd
except AttributeError, ae:
print "Skipping un-used datasource: " + dsName
continue
if is_mp=="true":
MultiDataSource(dsName, user, passwd).configure()
else:
PhysicalDataSource(dsName, user, passwd).configure()
updateDomain()
print "Successfully re-configured domain for Oracle RAC! "
for i in range(1,len(sys.argv)):
exec sys.argv[i]
try:
OracleRAC()
WLDomain().configure()
except SkipConfError, sce:
print sce
<?xml version="1.0"?>
<project name="WLP_AND_RAC" default="configServer">
<target name="configServer">
<property name="domain_dir" value="."/>
<wlst debug="false"
failOnError="false"
fileName="./oraracconf.py"
properties="./oraracconf.py.properties"
arguments="domain_dir='${domain_dir}'">
</wlst>
</target>
</project>
database_user=WEBLOGIC_8
database_passwd=WEBLOGIC_8
groupspace_user=WEBLOGIC_9
groupspace_passwd=WEBLOGIC_9
oracle_rac_sid=DBSRAC10
oracle_xa_driver=oracle.jdbc.xa.client.OracleXADataSource
oracle_nonxa_driver=oracle.jdbc.OracleDriver
oracle_rac_vip_1=rnhp380-c11-23-vip
oracle_rac_port_1=1521
oracle_rac_sid_1=DBSRAC101
oracle_rac_vip_2=rnhp380-c11-25-vip
oracle_rac_port_2=1521
oracle_rac_sid_2=DBSRAC102
p13nDataSource_is_mp=true
p13nDataSource_xa_protocol=None
p13nDataSource_xa_driver=false
p13nDataSource_mp_algorithm=Load-Balancing
appsGroupSpaceDataSource_is_mp=true
appsGroupSpaceDataSource_xa_protocol=None
appsGroupSpaceDataSource_xa_driver=false
appsGroupSpaceDataSource_mp_algorithm=Load-Balancing
portalDataSourceNeverXA_is_mp=true
portalDataSourceNeverXA_xa_protocol=OnePhaseCommit
portalDataSourceNeverXA_xa_driver=false
portalDataSourceNeverXA_mp_algorithm=Failover
portalDataSourceAlwaysXA_is_mp=true
portalDataSourceAlwaysXA_xa_protocol=TwoPhaseCommit
portalDataSourceAlwaysXA_xa_driver=true
portalDataSourceAlwaysXA_mp_algorithm=Load-Balancing
portalDataSource_is_mp=true
portalDataSource_xa_protocol=OnePhaseCommit
portalDataSource_xa_driver=false
portalDataSource_mp_algorithm=Load-Balancing