이번에 웹로직으로 웹프로젝트를 하면서, JDBC 정보를 프로그램에 녹여볼 생각을 했습니다.
예전에 Oracle WAS의 경우 Oracle WAS Deployment Descriptor중 data-sources.xml을 활용하여 애플리케이션 배포에 JDBC정보를 넣어 배포를 했었는데, 웹로직은 약간 달랐습니다.( 그리고 웹로직의 버저닝을 사용하니 뭔가 좀 더 달라지는 듯 했습니다. )
그래서, 애플리케이션 소스에는 넣지 못하더라도, 배포 가능한 소스로 해보고자 방법을 찾던 중 WLST를 사용하는 방법의 예제를 찾았습니다.
그래서 그 방법으로 하기로 하고 아래와 같은 스크립트로 한번에 DataSource를 생성하였습니다.
import sys from java.lang import System # function definition BEGIN # defining addJDBC function def addJDBC(obj, servers): print("") print("*** Creating JDBC ") # Create the Connection Pool. The system resource will have # generated name of 'PoolName'+"-jdbc" myResourceName = obj["PoolName"] print("Here is the Resource Name: " + myResourceName) jdbcSystemResource = create(myResourceName,"JDBCSystemResource") myFile = jdbcSystemResource.getDescriptorFileName() print ("HERE IS THE JDBC FILE NAME: " + myFile) jdbcResource = jdbcSystemResource.getJDBCResource() jdbcResource.setName(obj["PoolName"]) # Create the DataSource Params dpBean = jdbcResource.getJDBCDataSourceParams() myName=obj["JNDIName"] dpBean.setJNDINames([myName]) # Create the Driver Params drBean = jdbcResource.getJDBCDriverParams() drBean.setPassword(obj["Password"]) drBean.setUrl(obj["URLName"]) drBean.setDriverName(obj["DriverName"]) propBean = drBean.getProperties() driverProps = Properties() driverProps.setProperty("user",obj["UserName"]) e = driverProps.propertyNames() while e.hasMoreElements() : propName = e.nextElement() myBean = propBean.createProperty(propName) myBean.setValue(driverProps.getProperty(propName)) print myBean # Create the ConnectionPool Params ppBean = jdbcResource.getJDBCConnectionPoolParams() ppBean.setInitialCapacity(int(obj["InitialCapacity"])) ppBean.setMaxCapacity(int(obj["MaxCapacity"])) ppBean.setCapacityIncrement(int(obj["CapacityIncrement"])) if not obj["ShrinkPeriodMinutes"] == None: ppBean.setShrinkFrequencySeconds(int(obj["ShrinkPeriodMinutes"])) if not obj["TestTableName"] == None: ppBean.setTestConnectionsOnReserve(1) ppBean.setTestTableName(obj["TestTableName"]) if not obj["LoginDelaySeconds"] == None: ppBean.setLoginDelaySeconds(int(obj["LoginDelaySeconds"])) # Adding KeepXaConnTillTxComplete to help with in-doubt transactions. xaParams = jdbcResource.getJDBCXAParams() xaParams.setKeepXaConnTillTxComplete(1) # Add Target for servername in servers: jdbcSystemResource.addTarget(getMBean("/Servers/" + servername)) # function definition END print "@@@ Starting the script ..." url = 't3://localhost:7001' usr = 'weblogic' password = 'welcome' servernames = ['AdminServer', 'SSO1', 'SSO2'] connect(usr,password, url) for servername in servernames: servermb=getMBean("Servers/" + servername) if servermb is None: print '@@@ No server MBean found' exit() edit() startEdit() DB1 = { 'PoolName' : 'DataSource for DGKIM', 'JNDIName' : 'jdbc/dgkim', 'Password' : 'password', 'URLName' : 'jdbc:oracle:thin:@db.dgkim.net:1521:DGKIM', 'DriverName' : 'oracle.jdbc.OracleDriver', 'UserName' : 'dgkim', 'InitialCapacity' : '20', 'MaxCapacity' : '100', 'CapacityIncrement' : '10', 'ShrinkPeriodMinutes' : None, 'TestTableName' : 'DUAL', 'LoginDelaySeconds' : None } addJDBC(DB1, servernames) save() activate(block="true") exit()
저는 프로젝트 특성상 하나의 DB가 아닌 여러개의 DB를 사용하게 됩니다. 위 예제에서는 DB1이란 것을 사용했지만, 실제로는 8개의 DB에 접속하는 프로그램을 작성했습니다.
그래서 위 코드를 만들고, 개발 서버냐 운용 서버냐에 따라 url과 servernames를 수정하여 한번에 데이터 소스를 작성해서 편리했습니다.