Monday Feb 28, 2011

Transparent JDBC Connection Pool Reconfiguration in GlassFish 3.1

Transparent jdbc-connection-pool re-configuration

Transparent jdbc-connection-pool re-configuration


A feature using which redeployment of jdbc-connection-pool due to attribute or property change can be handled transparent to applications that use the pool. Whenever a set of properties / attributes (eg: host-name, port-number etc.,) of jdbc-connection-pool are changed, the connection-pool is destroyed and re-created based on the new values. Any application that is using the connection-pool need to be re-deployed (or application disable and enable must happen) due to pool re-configuration. Using this feature, existing applications can roll-over to new connection pool transparently. It is also possible that there can be in-flight transactions that is using the connections when the pool is re-configured. This feature will make sure that the new requests are queued till re-configuration is complete, however will allow requests that have already acquired atleast one connection from the pool and is part of a transaction. Thus, in-flight transactions' connection requests will be honoured and the transaction can complete.  

A new property named 'dynamic-reconfiguration-wait-timeout-in-seconds' will help to allow in-flight requests to complete.

  • asadmin> set server.resources.jdbc-connection-pool.<POOL_NAME>.property.dynamic-reconfiguration-wait-timeout-in-seconds=30
All new requests will wait for the pool reconfiguration to complete and connections will be acquired using re-configured pool configuration.
All in-use connections, in-flight transactions that span even after 'wait-timeout' is elapsed will have to be re-tried.Applications can define "application" scoped and "module" scoped resources in the archive.

NOTE : Not all attribute changes to jdbc-connection-pool requires application redeploy, eg., steady-pool-size, max-pool-size etc.,



Application Scoped Resources in GlassFish

Application Scoped Resources in GlassFish

Application Scoped Resources


Often, all applications require various type of resources for its usage. These resources can be of JDBC, JMS, Connector, JavaMail, Custom, JNDI etc., User can create resources using appropriate CLI (Command Line Interface) or using GUI. GlassFish supports both of them. There is also support to define resources in an xml file that conforms to "glassfish-resources.dtd" and using "add-resources resources-xml-file" command, all the resources
defined in the resources xml file can be created. Almost all of these options involve multiple step ie., create the resources first and then let the application
use these resources. These resources are usually shared across applications. These resources must also be undeployed when application(s) no longer need them.

Application Scoped Resources helps to bundle the resource definitions along with the application and as part of deployment of the application, these
resources are created and made available to the application. Similarly, these resources will be automatically destroyed when the application is undeployed.
Also, by scoping these resources within the application, these resources are available only for the application and hence can be free from resource-starvation due to other application's usage of these resources.
Java EE 6 also introduces application component environment namespaces which includes the following scopes.
  • java:comp : per component namespace
  • java:module : namespace shared by all components in a module (eg: ejb's in a ejb-jar.xml)
  • java:app : namespace shared by all components, modules in an application (eg: application-client, web component, ejb component in an application, .ear)
  • java:global : global namespace for all applications in the server
Applications can define "application" scoped and "module" scoped resources in the archive.
  • resource's "name"/"jndi-name" attribute prefixed with value "java:module/" will make the resource available all the ejb components defined in its ejb-jar.xml (All EJBs in an ejb-jar.xml)
  • resource's "name"/"jndi-name" attribute prefixed with value "java:app/" will make the resource available across all components/modules in the application (EJBs, Servlet, Application Client in the application)


Sample archive layout that bundles glassfish-resources.xml:


ear
      -> META-INF
                              -> application.xml
                              -> glassfish-resources.xml [Application scoped resources]
      -> web-module
                  -> WEB-INF
                                        -> web.xml
                                        -> glassfish-web.xml
                                        -> glassfish-resources.xml [Module scoped resources]
     -> ejb-module 
                 -> META-INF
                                         -> ejb-jar.xml
                                         -> glassfish-ejb-jar.xml
                                         -> glassfish-resources.xml [Module scoped resources]


Demo application :

The sample application provided demonstrates the usage of jdbc-resources across the application,  on various scopes. The sample has following components
  • web component [Servlet.java]
  • ejb component(s) [HelloStatefulEJB.java and HelloEJB.java]
  • application client [Client.java]
There are three "glassfish-resources.xml" (s) in the application, one at the "ear" level, one each at "web-module" and "ejb-module" level  respectively. (Similar to the "sample archive layout" shown above)
  • application-level glassfish-resources.xml defines a jdbc-connection-pool and jdbc-resource by name "java:app/app-scoped-pool" and "java:app/app-scoped-resource" respectively.
  • glassfish-resources.xml in WEB-INF directory of web-module defines a jdbc-connection-pool and jdbc-resource by name "java:module/web-module-scoped-pool" and "java:module/web-module-scoped-resource" respectively.
  • glassfish-resources.xml in META-INF directory of ejb-module defines a jdbc-connection-pool and jdbc-resource by name "java:module/ejb-module-scoped-pool" and "java:module/ejb-module-scoped-resource" respectively.
When executed for a particular resource name, the sample application will do lookup of the specified resource in Application Client, EJB(s), Servlet and based on the availability
of the resource in the component's scope it will either use the provided resource or the default jdbc-resource (jdbc/__default) when the resource specified is not available
in the component's scope.

Following are the jdbc resources defined (or exported) by the application.


  1. java:app/app-scoped-resource
  2. java:module/ejb-module-scoped-resource
  3. java:module/web-module-scoped-resource



Steps to execute:

  1. Ensure that JDK 1.6 is installed and the environment variable JAVA_HOME is set
    1. Ensure that the environment variable PATH has JAVA_HOME/bin added to it.
  2. Ensure that ANT is installed and the environment variable ANT_HOME is set
    1. Ensure that the environment variable PATH has ANT_HOME/bin added to it.
  3. Download GlassFish 3.1
  4. Install GlassFish 3.1
  5. Start GlassFish (asadmin start-domain domain1)
  6. Start Derby database (asadmin start-database)
  7. Download the sample
  8. Extracted location of sample is referred as "SAMPLE_HOME"
  9. goto SAMPLE_HOME
  10. set environment variable GF_HOME to GlassFish's installation location.
  11. "ant all" will compile, assemble, deploy, run the application and then undeploy the application.


Sample Output :

Existing build.xml is configured to demostrate the availability of the following resources across Application Client, Servlet, EJB(s)

  • java:global/env/Servlet_Resource
  • java:app/env/HelloStatefulEJB_Resource
  • java:module/env/HelloEJB_Resource
  • java:comp/env/Appclient_Resource


Sample output for
"java:app/app-scoped-resource" will look like :


     [exec] Mode : appclient
     [exec] Resource name : java:app/app-scoped-resource
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec] REQUESTED RESOURCE                   : java:app/app-scoped-resource
     [exec] ACTUAL RESOURCE USED                 : java:app/app-scoped-resource
     [exec] RESULT                               : RESOURCE ACCESSIBLE
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec]
     [exec] Mode : servlet
     [exec] Resource name : java:app/app-scoped-resource
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec] REQUESTED RESOURCE                   : java:app/app-scoped-resource
     [exec] ACTUAL RESOURCE USED                 : java:app/app-scoped-resource
     [exec] RESULT                               : RESOURCE ACCESSIBLE
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec]
     [exec] Mode : stateful_ejb
     [exec] Resource name : java:app/app-scoped-resource
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec] REQUESTED RESOURCE                   : java:app/app-scoped-resource
     [exec] ACTUAL RESOURCE USED                 : java:app/app-scoped-resource
     [exec] RESULT                               : RESOURCE ACCESSIBLE
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec]
     [exec] Mode : stateless_ejb
     [exec] Resource name : java:app/app-scoped-resource
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec] REQUESTED RESOURCE                   : java:app/app-scoped-resource
     [exec] ACTUAL RESOURCE USED                 : java:app/app-scoped-resource
     [exec] RESULT                               : RESOURCE ACCESSIBLE
     [exec] ----------------------------------------------------------------------------------------------------------


In the above sample, "RESULT" indicate that the jdbc-resource "java:app/app-scoped-resource" is available across all components (EJB(s), Servlet, Application Client)

Similarly, sample output for the resource of name "java:module/ejb-module-scoped-resource" will look like :


     [exec] Mode : appclient
     [exec] Resource name : java:module/ejb-module-scoped-resource
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec] REQUESTED RESOURCE                   : java:module/ejb-module-scoped-resource
     [exec] ACTUAL RESOURCE USED                 : jdbc/__default
     [exec] RESULT                               : RESOURCE NOT ACCESSIBLE
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec]
     [exec]
     [exec] Mode : servlet
     [exec] Resource name : java:module/ejb-module-scoped-resource
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec] REQUESTED RESOURCE                   : java:module/ejb-module-scoped-resource
     [exec] ACTUAL RESOURCE USED                 : jdbc/__default
     [exec] RESULT                               : RESOURCE NOT ACCESSIBLE
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec]
     [exec]
     [exec] Mode : stateful_ejb
     [exec] Resource name : java:module/ejb-module-scoped-resource
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec] REQUESTED RESOURCE                   : java:module/ejb-module-scoped-resource
     [exec] ACTUAL RESOURCE USED                 : java:module/ejb-module-scoped-resource
     [exec] RESULT                               : RESOURCE ACCESSIBLE
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec]
     [exec]
     [exec] Mode : stateless_ejb
     [exec] Resource name : java:module/ejb-module-scoped-resource
     [exec] ----------------------------------------------------------------------------------------------------------
     [exec] REQUESTED RESOURCE                   : java:module/ejb-module-scoped-resource
     [exec] ACTUAL RESOURCE USED                 : java:module/ejb-module-scoped-resource
     [exec] RESULT                               : RESOURCE ACCESSIBLE
     [exec] ----------------------------------------------------------------------------------------------------------


In the above sample, "RESULT" indicate that the datasource "java:module/ejb-module-scoped-resource" is available only for the EJB components in the ejb-jar.xml ie., HelloEJB and HelloStatefulEJB.

To list the resources defined in application/module scope :

$GF_HOME/bin/asadmin list-applications --resources --subcomponents

app-scoped-resources-demoApp  <ear, appclient, ejb, web>
  java:app/app-scoped-resource    <JdbcResource>
  java:app/app-scoped-pool    <JdbcConnectionPool>
  app-scoped-resources-demo-client.jar  <AppClientModule>
  app-scoped-resources-demo-ejb.jar     <EJBModule>       
    java:module/ejb-module-scoped-resource    <JdbcResource>
    java:module/ejb-module-scoped-pool    <JdbcConnectionPool>
  app-scoped-resources-demo-web.war     <WebModule>       
    java:module/web-module-scoped-resource    <JdbcResource>
    java:module/web-module-scoped-pool    <JdbcConnectionPool>
Command list-applications executed successfully.

For more information about application-scoped-resources including the domain.xml configuration representation, using dotted-names-get/set command to re-configure the resources, monitoring information,
flush-connection-pool and ping-connection-pool commands, please refer the demo.





References :



About

jagadish

Search

Categories
Archives
« February 2011
SunMonTueWedThuFriSat
  
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
     
       
Today