Of course, using rails, the application was using ActiveRecord for it's DB/ORB interactions, and in researching, the steps needed to get this setup were:
- Create the JDBC connection pool
- Create the resource with a JNDI name
- Update the database.yml
- Configure ActiveRecord for disconnects
$domain/lib/ext/
- using the JDBC version 4 driver).In looking at the jdbc templates included with Glassfish (glassfish/lib/install/templates/resources/jdbc), I attempted to use the template for my driver (postgresql_type4_datasource.xml). This was causing issues using the 'url' property, so ended up using asadmin to create, using serverName and databaseName as properties.
Starting up the asadmin interactive utility:
I created separate pools/resources for dev/test/production - which will be commented accordingly for now in the domain.xml file.
asadmin> create-jdbc-connection-pool
--datasourceclassname org.postgresql.ds.PGConnectionPoolDataSource
--restype javax.sql.ConnectionPoolDataSource
--property user=XXX:password=XXX:serverName=localhost:databaseName=extension_dev extensionDevPool
Command create-jdbc-connection-pool executed successfully.
asadmin> create-jdbc-resource --connectionpoolid extensionDevPool jndiExtensionDev
Command create-jdbc-resource executed successfully.
asadmin> list-jdbc-connection-pools
__TimerPool
DerbyPool
extensionDevPool
Command list-jdbc-connection-pools executed successfully.
asadmin> list-jdbc-resources
jdbc/__TimerPool
jdbc/__default
jndiExtensionDev
Command list-jdbc-resources executed successfully.
asadmin> ping-connection-pool extensionDevPool
Command ping-connection-pool executed successfully.
Next came setting up the database.yml file to use jndi instead of the regular ActiveRecord drivers. There are some excellent resources on the web for getting this done, but had to do some digging to get this correct.
One of the issues in setting this up correctly was, that especially during development and testing, we are using the jruby console (
jruby -S script/console
) to create and activate objects and events, which in turn looks at the database.yml file to get its connection.This was hurting me because once set to use jndi, none of these settings were setup correctly and I would continue to get connection issues as well as the jms missing class issues.
So, to fix, in the database.yml file, we not only test for the
RAILS_ENV
to be java (or the JRUBY_VERSION
to be set), but we needed to test to see if we were in a servlet context (ala Glassfish) as well as to use jndi based connections or regular connections.So, our database.yml file ended up looking like:
defaults: &defaults
<% jdbc = defined?(JRUBY_VERSION) ? 'jdbc' : '' %>
<% if defined?($servlet_context) %>
adapter: jdbc
driver: org.postgresql.Driver
<% else %>
adapter: <%= jdbc %>postgresql
<% end %>
username: xxx
password: xxx
host: localhost
development:
<% if defined?($servlet_context) %>
jndi: jndiExtensionDev
<% end %>
database: extension_dev
<<: *defaults
test:
<% if defined?($servlet_context) %>
jndi: jndiExtensionTest
<% end %>
database: extension_test
<<: *defaults
production:
<% if defined?($servlet_context) %>
jndi: jndiExtensionProd
<% end %>
database: extension_prod
<<: *defaults
This enabled us to access the db in our app as well as run the console and connect correctly.
We now need to configure ActiveRecord to disconnect after every query - which was not needed before since we are now using JDBC to manage the connection persistence. (See resources below for links to some of the sites that were used to research all of this).
# config/initializers/close_connections.rbSome of the excellent resources I used:
if defined?($servlet_context)
require 'action_controller/dispatcher'
ActionController::Dispatcher.after_dispatch do
ActiveRecord::Base.clear_active_connections!
end
end
No comments:
Post a Comment