0 Replies Latest reply on Dec 31, 2002 11:55 AM by scohan

    Orace9i, JBoss 3.0, and XA.

    scohan

       

      "scohan" wrote:
      We're trying to get XA going with Oracle9i (9.2.0.1 running on Linux 7.2) and JBoss 3.0 (running on Win2K - but will eventually run on the Linux box.)

      When we come up to the first update statement, the app hangs. This update is not put into a UserTransaction (because it's not needed in this segment of code.)

      If I go into sql plus and try to update the record after running the app, it appears locked and sql plus hangs as well.

      We're newbies to XA so any info would be helpful. I'm not sure if I left something out of the Oracle install/configuration, if it's a JBoss config issue, or our code.

      Here's the method to get the connection:

      public Connection getDbConnection() throws java.rmi.RemoteException {
      try {
      Context ctx = new InitialContext();
      DataSource ds =
      super.getDataSource("XAOracleSecurityDS");
      return ds.getConnection("security", "security0");
      } catch (Exception e){
      throw new RemoteException(
      "Exception in " + getClass().getName() +
      ".getDbConnection()", e);
      }
      }

      Here's the update:

      try {
      uDao = new UserDao(conn);
      } catch (Exception e) {
      throw new RemoteException(
      getClass().getName() + ".new UserDao(conn)", e);
      }

      uDao.update();

      which looks like:

      Statement statement = conn.createStatement();
      String sql = getUpdateStatement();
      statement.executeUpdate(sql);


      And here's the relevant part of orace-xa-service.xml:

      <mbean code="org.jboss.resource.connectionmanager.XATxConnectionManager"
      name="jboss.jca:service=XATxCM,name=XAOracleSecurityDS">
      <!--make the rar deploy! hack till better deployment-->
      <depends>jboss.jca:service=RARDeployer</depends>


      <depends optional-attribute-name="ManagedConnectionFactoryName">
      <!--embedded mbean-->
      <mbean code="org.jboss.resource.connectionmanager.RARDeployment"
      name="jboss.jca:service=XATxDS,name=XAOracleSecurityDS">
      <!--hack-->
      <depends optional-attribute-name="OldRarDeployment">jboss.jca:service=RARDeployment,name=Minerva JDBC XATransaction ResourceAdapter</depends>

      <!--real attributes-->
      <attribute name="ManagedConnectionFactoryProperties">
      <properties>
      <config-property name="XADataSourceProperties"
      type="java.lang.String">URL=jdbc:oracle:thin:@sherman:1521:SECURITYDEV</config-property>
      <config-property name="XADataSourceClass"
      type="java.lang.String">oracle.jdbc.xa.client.OracleXADataSource</config-property>
      <!--set these only if you want only default logins, not through JAAS -->
      <config-property name="UserName"
      type="java.lang.String"></config-property>
      <config-property name="Password"
      type="java.lang.String"></config-property>
      <!--
      Do not try to set transaction isolation level here or you'll get
      java.sql.SQLException: ORA-01453: SET TRANSACTION must be first statement of transaction
      Read committed is a default isolation level for Oracle, so there
      is not real need to set it here. I'll take a look into it later ...maybe.
      <config-property name="TransactionIsolation"
      type="java.lang.String">TRANSACTION_READ_COMMITTED</config-property>
      -->
      </properties>
      </attribute>
      <attribute name="JndiName">XAOracleSecurityDS</attribute>
      </mbean>
      </depends>

      <depends optional-attribute-name="ManagedConnectionPool">
      <!--embedded mbean-->
      <mbean code="org.jboss.resource.connectionmanager.JBossManagedConnectionPool"
      name="jboss.jca:service=XATxPool,name=XAOracleSecurityDS">

      <attribute name="MinSize">0</attribute>
      <attribute name="MaxSize">50</attribute>
      <attribute name="BlockingTimeoutMillis">5000</attribute>
      <attribute name="IdleTimeoutMinutes">15</attribute>
      <!--criteria indicates if Subject (from security domain) or app supplied
      parameters (such as from getConnection(user, pw)) are used to distinguish
      connections in the pool. Choices are
      ByContainerAndApplication (use both),
      ByContainer (use Subject),
      ByApplication (use app supplied params only),
      ByNothing (all connections are equivalent, usually if adapter supports
      reauthentication)-->
      <attribute name="Criteria">ByContainer</attribute>
      </mbean>
      </depends>
      <depends optional-attribute-name="CachedConnectionManager">jboss.jca:service=CachedConnectionManager</depends>

      <!-- Include a login module configuration named InformixXaDbRealm.
      Update your login-conf.xml, here is an example for a
      ConfiguredIdentityLoginModule:

      <application-policy name = "InformixXaDbRealm">
      <authentication>
      <login-module code = "org.jboss.resource.security.ConfiguredIdentityLoginModule" flag = "required">
      <module-option name = "principal">yourprincipal</module-option>
      <module-option name = "userName">yourusername</module-option>
      <module-option name = "password">yourpassword</module-option>
      <module-option name = "managedConnectionFactoryName">jboss.jca:service=XATxCM,name=InformixXaDS</module-option>
      </login-module>
      </authentication>
      </application-policy>

      NOTE: the application-policy name attribute must match SecurityDomainJndiName, and the
      module-option name = "managedConnectionFactoryName"
      must match the object name of the ConnectionManager you are configuring here.
      -->
      <!--
      <attribute name="SecurityDomainJndiName">SecurityDbRealm</attribute>
      -->
      <depends optional-attribute-name="JaasSecurityManagerService">jboss.security:service=JaasSecurityManager</depends>

      <attribute name="TransactionManager">java:/TransactionManager</attribute>
      </mbean>