In this example below we show how to use UCP with an Oracle Database from a JRuby client BUT just a single instance database rather then RAC back end.
Note: We are using the HR schema for this demo
1. Download ucp.jar and ojdbc6.jar from the links below.
ojdbc6.jar (11.2.0.2)
ucp.jar (11.2.0.1)
2. Create a pool class as follows in a JRuby script called "ucppool.rb" in a directory called "lib". Client would then create an instance of this pool class and use it to retrieve / return connections from it.
require 'java' require 'C:/jdev/jdcbdrivers/11.2/ojdbc6.jar' require 'C:/jdev/jdcbdrivers/11.2/ucp/ucp.jar' import 'oracle.ucp.jdbc.PoolDataSource' import 'oracle.ucp.jdbc.PoolDataSourceFactory' API_VERSION = 1.0 class MyOracleUcpPool #pool data source object @pds def initialize(user, passwd, url, minsize=0, maxsize=10, initialsize=2) @user = user @passwd = passwd @url = url @minsize = minsize @maxsize = maxsize @initialsize = initialsize #create pool for use here @pds = PoolDataSourceFactory.getPoolDataSource() @pds.setUser(user) @pds.setPassword(passwd) @pds.setURL(url) @pds.setConnectionFactoryClassName("oracle.jdbc.pool.OracleDataSource") @pds.setConnectionPoolName("ruby-ucppool") @pds.setInitialPoolSize(initialsize) @pds.setMinPoolSize(minsize) @pds.setMaxPoolSize(maxsize) end #add getters and setters for all attrributes attr_reader :user, :passwd, :url, :minsize, :maxsize, :initialsize def getConnection() return @pds.getConnection() end def returnConnection(conn) conn.close() end def displayPoolDetails() return "\n** UCP Pool Details **\n" + "NumberOfAvailableConnections: ", @pds.getAvailableConnectionsCount(), "\n" + "BorrowedConnectionsCount: ", @pds.getBorrowedConnectionsCount(), " \n"; end def to_s "MyOracleUcpPool [user=#{@user}, passwd=#{@passwd}, " + "url=#{@url}, minsize=#{@minsize}, maxsize=#{@maxsize}, " + "initialsize=#{@initialsize}]" end alias_method :to_string, :to_s end
- Edit the 2 lines below to indicate the PATH to the 2 JAR files downloaded at step #1
require 'C:/jdev/jdcbdrivers/11.2/ojdbc6.jar'
require 'C:/jdev/jdcbdrivers/11.2/ucp/ucp.jar'
3. In your current directory create a test client to verify the UCP called "testucp.rb" as follows to test your UCP Pool.
require 'lib/ucppool' print "Run at ", Time.now , "\n" conn = nil ucppool = nil begin ucppool = MyOracleUcpPool.new("hr", "hr", "jdbc:oracle:thin:@beast.au.oracle.com:1524/linux11gr2", 0, 5, 2) print ucppool , "\n" #get connection from pool conn = ucppool.getConnection() #print pool details print ucppool.displayPoolDetails() puts #execute query stmt = conn.createStatement() rset = stmt.executeQuery("select * from departments") while rset.next() print "DepartmentId=", rset.getInt(1), ", DepartmentName=" + rset.getString(2), "\n" end rset.close() stmt.close() #return connection ucppool.returnConnection(conn) print "\nConnection returned to pool\n" #print pool details print ucppool.displayPoolDetails() rescue print "\n** Error occured **\n" print "Failed executing UCP Pool demo from JRuby ", $!, "\n" if (!conn.nil?) if (!ucppool.nil?) ucppool.returnConnection(conn) print "\nConnection returned to pool\n" end end end print "\nEnded at ", Time.now , "\n"
4. Your file system would look as follows
C:\jdev\scripting\demos\jruby\jdbc\ucp>dir Volume in drive C is OS Volume Serial Number is 7C37-0C64 Directory of C:\jdev\scripting\demos\jruby\jdbc\ucp 06/01/2011 10:21 PM <DIR> . 06/01/2011 10:21 PM <DIR> .. 06/01/2011 10:30 PM <DIR> lib 07/01/2011 08:47 AM 1,112 testucp.rb 1 File(s) 1,112 bytes 3 Dir(s) 248,428,380,160 bytes free
5. Edit the following line of code to ensure you provide the correct connect details for your database.
ucppool = MyOracleUcpPool.new("hr", "hr", "jdbc:oracle:thin:@beast.au.oracle.com:1524/linux11gr2", 0, 5, 2)
6. Run the test client using jruby testucp.rb. In this example we do the following.
- create a UCP Pool
- obtain a JDBC Connection from the Pool
- Query a table
- Return the JDBC connection to the pool
OUTPUT
Run at Fri Jan 07 09:25:16 +1100 2011
MyOracleUcpPool [user=hr, passwd=hr, url=jdbc:oracle:thin:@beast.au.oracle.com:1524/linux11gr2, minsize=0, maxsize=5, initialsize=2]
** UCP Pool Details **
NumberOfAvailableConnections: 1
BorrowedConnectionsCount: 1
DepartmentId=10, DepartmentName=Administration
DepartmentId=20, DepartmentName=Marketing
DepartmentId=30, DepartmentName=Purchasing
DepartmentId=40, DepartmentName=Human Resources
DepartmentId=50, DepartmentName=Shipping
DepartmentId=60, DepartmentName=IT
DepartmentId=70, DepartmentName=Public Relations
DepartmentId=80, DepartmentName=Sales
DepartmentId=90, DepartmentName=Executive
DepartmentId=100, DepartmentName=Finance
DepartmentId=110, DepartmentName=Accounting
DepartmentId=120, DepartmentName=Treasury
DepartmentId=130, DepartmentName=Corporate Tax
DepartmentId=140, DepartmentName=Control And Credit
DepartmentId=150, DepartmentName=Shareholder Services
DepartmentId=160, DepartmentName=Benefits
DepartmentId=170, DepartmentName=Manufacturing
DepartmentId=180, DepartmentName=Construction
DepartmentId=190, DepartmentName=Contracting
DepartmentId=200, DepartmentName=Operations
DepartmentId=210, DepartmentName=IT Support
DepartmentId=220, DepartmentName=NOC
DepartmentId=230, DepartmentName=IT Helpdesk
DepartmentId=240, DepartmentName=Government Sales
DepartmentId=250, DepartmentName=Retail Sales
DepartmentId=260, DepartmentName=Recruiting
DepartmentId=270, DepartmentName=Payroll
Connection returned to pool
** UCP Pool Details **
NumberOfAvailableConnections: 2
BorrowedConnectionsCount: 0
Ended at Fri Jan 07 09:25:16 +1100 2011
More Information
Oracle Universal Connection Pool for JDBC Developer's Guide
11g Release 2 (11.2)
http://download.oracle.com/docs/cd/E11882_01/java.112/e12265/toc.htm
1 comment:
That's pretty useful. Thanks for posting.
Post a Comment