JettyPlus Transaction, Datasource and JNDI Test

Skip to the demo

Background to the demo

JettyPlus integrates a number of valuable J2EE features with the core Jetty server: UserTransactions, DataSources and JNDI lookups. This demonstration illustrates programmatic JNDI lookups of env and resource-env values specified in the web.xml descriptor, connecting to both XA and non-XA DataSources, and using UserTransactions to bracket increments to an integer value stored in the database.

The demo's web.xml file contains the following environment entries:
 


<web-app>

  <!-- Set up the resource-env-ref for the XA DataSource -->

  <resource-env-ref>
    <description>
      XA DB Connection
    </description>
    <resource-env-ref-name>
      jdbc/myDB
    </resource-env-ref-name>
    <resource-env-ref-type>
      javax.sql.DataSource
    </resource-env-ref-type>
  </resource-env-ref>
  

  <!-- Set up the resource-env-ref for the non-XA DataSource -->
  
    <resource-env-ref>
    <description>
      non-XA DB Connection
    </description>
    <resource-env-ref-name>
      jdbc/myNonXADataSource
    </resource-env-ref-name>
    <resource-env-ref-type>
      javax.sql.DataSource
    </resource-env-ref-type>
  </resource-env-ref>
  

  <!-- Set up a couple of env-entries  -->

  <env-entry>
    <env-entry-name>
       select
    </env-entry-name>
    <env-entry-value>
       select id, foo from testdata
    </env-entry-value>
    <env-entry-type>
       java.lang.String
    </env-entry-type>
  </env-entry>
  <env-entry>
    <env-entry-name>
       update
    </env-entry-name>
    <env-entry-value>
       update testdata set foo=? where id=1
    </env-entry-value>
    <env-entry-type>
       java.lang.String
    </env-entry-type>
  </env-entry>
</web-app>

Application web.xml descriptor


The relevant sections of the jetty xml configuration file are:
 


<!-- =============================================================== -->
<!-- Configure the JettyPlus Server                                  -->
<!-- =============================================================== -->

<Configure class="org.mortbay.jetty.plus.Server">


  <!-- =============================================================== -->
  <!-- Configure a Log4J log sink                                      -->
  <!-- =============================================================== -->

  <Call name="instance" class="org.mortbay.util.Log">
    <Call name="disableLog"/>
    <Call name="add">
      <Arg>
        <New class="org.mortbay.util.log4j.Log4jSink">
          <Call name="start"/>
        </New>
      </Arg>
    </Call>
  </Call>




  <!-- =============================================================== -->
  <!-- Add a transaction manager and xadatasources                      -->
  <!-- =============================================================== -->

  <Call name="addService">
    <Arg>
      <New class="org.mortbay.jetty.plus.JotmService">
        <Set name="Name">TransactionMgr</Set>
         <!-- set up a pooled DataSource -->
         <Call name="addDataSource">
             <Arg>jdbc/myDB</Arg>   
             <!-- set up the datasource -->
             <Arg>
               
               <!-- Uncomment one of the following types of XADataSource        -->
               <!-- according to your type of database:                         -->
               <!-- New class="org.enhydra.jdbc.sybase.SybaseXADataSource"      -->
               <!-- New class="org.enhydra.jdbc.informix.InformixXADataSource"  -->
               <!-- New class="org.enhydra.jdbc.oracle.OracleXADataSource"      -->
               
               <New class="org.enhydra.jdbc.standard.StandardXADataSource">
                 <Set name="DriverName">org.hsqldb.jdbcDriver</Set>
                 <Set name="Url">jdbc:hsqldb:extra/etc/tmtest</Set>
                 <Set name="User">sa</Set>
                 <Set name="Password"></Set>
                 
                 <!-- Uncomment to setup isolation level as required            -->
                 
                 <!--
                 <Set name="TransactionIsolation"><Get class="java.sql.Connection" name="TRANSACTION_SERIALIZABLE"/></Set> 
                 -->
               </New>
             </Arg>
             <!-- set up a pool for the datasource -->
             <Arg>
               <New class="org.enhydra.jdbc.pool.StandardXAPoolDataSource">
                 <Arg type="Integer">4</Arg>          <!-- initial size of pool -->     
                 <Set name="MinSize">4</Set>                
                 <Set name="MaxSize">15</Set> 
                 <!-- Uncomment to setup other pool params as required          -->
                 <!--
                 <Set name="SleepTime">10</Set>
                 <Set name="LifeTime">10</Set>
                 <Set name="DeadLockMaxWait">10</Set>
                 <Set name="DeadLockRetryWait">10</Set>
                 <Set name="LoginTimeout">10</Set>
                 <Set name="Debug" type="boolean">true</Set>
                 -->
               </New>
             </Arg>               
        </Call>
        
        <!--If your JDBC driver does connection pooling for you then use the one arg addDataSource() method instead: -->
        <Call name="addDataSource">
             <Arg>jdbc/otherDB</Arg>    <!-- client lookup jndi name of datasource  -->
             <Arg>
               <New class="org.enhydra.jdbc.standard.StandardXADataSource">
                 <Set name="DriverName">com.mysql.jdbc.Driver</Set>
                 <Set name="Url">jdbc:mysql://localhost:3306/oln </Set>
                 <Set name="User"></Set>
                 <Set name="Password"></Set>
               </New>
             </Arg>
        </Call>
     </New>
   </Arg>
  </Call>



  <!-- =============================================================== -->
  <!-- Set up a DataSourceService for non-XA types of DataSources      -->
  <!-- Any number of DataSources can be configured by calling          -->
  <!-- addDataSource().  This example uses the XAPool                  -->
  <!-- StandardDataSource class because the xapool jar is included in  -->
  <!-- the JettyPlus download, but you can configure any type of       -->
  <!-- DataSource impl. NOTE also that this service does not provide   -->
  <!-- automatic support for connection pooling. See instead the       -->
  <!-- DefaultPoolingDataSourceService (however of course, the         -->
  <!-- the DataSource impl you use may do it's own pooling.            -->
  <!-- =============================================================== -->

  <Call name="addService">
    <Arg>
      <New class="org.mortbay.jetty.plus.DataSourceService">
        <Set name="Name">DataSourceService</Set>
         <Call name="addDataSource">
             <Arg>jdbc/myNonXADataSource</Arg>   <!-- client lookup jndi name of datasource  -->
             <!-- set up the datasource -->
             <Arg>
               <New class="org.enhydra.jdbc.standard.StandardDataSource">
                 <Set name="DriverName">org.hsqldb.jdbcDriver</Set>
                 <Set name="Url">jdbc:hsqldb:extra/etc/tmtest</Set>
                 <Set name="User">sa</Set>
                 <Set name="Password"></Set>
                 <!-- a bug in StandardDataSource makes it necessary to explicitly set a Logger -->
                 <Set name="Logger">
                   <New class="org.enhydra.jdbc.util.Logger">
                     <Arg>
                       <Call class="org.apache.commons.logging.LogFactory" name="getLog">
                         <Arg>org.enhydra.jdbc.xapool</Arg>
                       </Call>
                     </Arg>
                   </New>
                 </Set>
                 <!-- Uncomment to setup isolation level as required            -->
                 <!--
                 <Set name="TransactionIsolation"><Get class="java.sql.Connection" name="TRANSACTION_SERIALIZABLE"/></Set> 
                 -->
               </New>
             </Arg>
         </Call>
         <!-- add other DataSources here -->
       </New>
     </Arg>
   </Call> 
 
 
 
</Configure>

jettyplus.xml configuration file

Notice particularly that it is the JettyPlus server class org.mortbay.jetty.plus.Server being configured, not the normal Jetty server (org.mortbay.jetty.Server).

Note also that a log4J log sink must be configured. You must specify the location of the log4j configuration file on the run line. For this demo, this is located in the org.mortbay.jetty.plus.resource.jar file, the source of which is in $jetty.home/extra/resources/log4j.properties.

Now, you're ready to try the demo.