[JBoss Messaging] - Exception while creating JBM tables
by yuvalry
Hi,
We are using jboss-4.2.1.GA with jboss-messaging-1.3.0.GA and Oracle 10.2.0.2 DB.
We defined an XA datasource for Oracle connection:
<xa-datasource>
<jndi-name>com/mindbill/system/jdbc</jndi-name>
<track-connection-by-tx/>
<isSameRM-override-value>false</isSameRM-override-value>
<xa-datasource-class>oracle.jdbc.xa.client.OracleXADataSource</xa-datasource-class>
<xa-datasource-property name="URL">jdbc:oracle:thin:@10.10.2.23:1521:BILL</xa-datasource-property>
<xa-datasource-property name="User">aaaa</xa-datasource-property>
<xa-datasource-property name="Password">bbbb</xa-datasource-property>
<!-- Uses the pingDatabase method to check a connection is still valid before handing it out from the pool -->
<!--valid-connection-checker-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker</valid-connection-checker-class-name-->
<!-- Checks the Oracle error codes and messages for fatal errors -->
<exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.OracleExceptionSorter</exception-sorter-class-name>
<!-- Oracles XA datasource cannot reuse a connection outside a transaction once enlisted in a global transaction and vice-versa -->
<no-tx-separate-pools/>
<!-- corresponding type-mapping in the standardjbosscmp-jdbc.xml -->
<type-mapping>Oracle9i</type-mapping>
</xa-datasource>
and oracle-persistence-service.xml file looks like that:
<mbean code="org.jboss.messaging.core.plugin.JDBCPersistenceManagerService"
name="jboss.messaging:service=PersistenceManager"
xmbean-dd="xmdesc/JDBCPersistenceManager-xmbean.xml">
jboss.jca:service=DataSourceBinding,name=com/mindbill/system/jdbc
<depends optional-attribute-name="TransactionManager">jboss:service=TransactionManager
java:/com/mindbill/system/jdbc
true
true
<![CDATA[
CREATE_MESSAGE_REFERENCE=CREATE TABLE JBM_MSG_REF (CHANNEL_ID INTEGER, MESSAGE_ID INTEGER, TRANSACTION_ID INTEGER, STATE CHAR(1), ORD INTEGER, PAGE_ORD INTEGER, DELIVERY_COUNT INTEGER, SCHED_DELIVERY INTEGER, PRIMARY KEY(CHANNEL_ID, MESSAGE_ID))
CREATE_IDX_MESSAGE_REF_TX=CREATE INDEX JBM_MSG_REF_TX ON JBM_MSG_REF (TRANSACTION_ID)
CREATE_IDX_MESSAGE_REF_ORD=CREATE INDEX JBM_MSG_REF_ORD ON JBM_MSG_REF (ORD)
CREATE_IDX_MESSAGE_REF_PAGE_ORD=CREATE INDEX JBM_MSG_REF_PAGE_ORD ON JBM_MSG_REF (PAGE_ORD)
CREATE_IDX_MESSAGE_REF_MESSAGE_ID=CREATE INDEX JBM_MSG_REF_MESSAGE_ID ON JBM_MSG_REF (MESSAGE_ID)
CREATE_IDX_MESSAGE_REF_SCHED_DELIVERY=CREATE INDEX JBM_MSG_REF_SCHED_DELIVERY ON JBM_MSG_REF (SCHED_DELIVERY)
CREATE_MESSAGE=CREATE TABLE JBM_MSG (MESSAGE_ID INTEGER, RELIABLE CHAR(1), EXPIRATION INTEGER, TIMESTAMP INTEGER, PRIORITY INTEGER, HEADERS BLOB, PAYLOAD BLOB, CHANNEL_COUNT INTEGER, TYPE INTEGER, PRIMARY KEY (MESSAGE_ID))
CREATE_TRANSACTION=CREATE TABLE JBM_TX (TRANSACTION_ID INTEGER, BRANCH_QUAL RAW(254), FORMAT_ID INTEGER, GLOBAL_TXID RAW(254), PRIMARY KEY (TRANSACTION_ID))
CREATE_COUNTER=CREATE TABLE JBM_COUNTER (NAME VARCHAR2(255), NEXT_ID INTEGER, PRIMARY KEY(NAME))
INSERT_MESSAGE_REF=INSERT INTO JBM_MSG_REF (CHANNEL_ID, MESSAGE_ID, TRANSACTION_ID, STATE, ORD, PAGE_ORD, DELIVERY_COUNT, SCHED_DELIVERY) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
DELETE_MESSAGE_REF=DELETE FROM JBM_MSG_REF WHERE MESSAGE_ID=? AND CHANNEL_ID=? AND STATE='C'
UPDATE_MESSAGE_REF=UPDATE JBM_MSG_REF SET TRANSACTION_ID=?, STATE='-' WHERE MESSAGE_ID=? AND CHANNEL_ID=? AND STATE='C'
UPDATE_PAGE_ORDER=UPDATE JBM_MSG_REF SET PAGE_ORD = ? WHERE MESSAGE_ID=? AND CHANNEL_ID=?
COMMIT_MESSAGE_REF1=UPDATE JBM_MSG_REF SET STATE='C', TRANSACTION_ID = NULL WHERE TRANSACTION_ID=? AND STATE='+'
COMMIT_MESSAGE_REF2=DELETE FROM JBM_MSG_REF WHERE TRANSACTION_ID=? AND STATE='-'
ROLLBACK_MESSAGE_REF1=DELETE FROM JBM_MSG_REF WHERE TRANSACTION_ID=? AND STATE='+'
ROLLBACK_MESSAGE_REF2=UPDATE JBM_MSG_REF SET STATE='C', TRANSACTION_ID = NULL WHERE TRANSACTION_ID=? AND STATE='-'
LOAD_PAGED_REFS=SELECT MESSAGE_ID, DELIVERY_COUNT, PAGE_ORD, SCHED_DELIVERY FROM JBM_MSG_REF WHERE CHANNEL_ID = ? AND PAGE_ORD BETWEEN ? AND ? ORDER BY PAGE_ORD
LOAD_UNPAGED_REFS=SELECT MESSAGE_ID, DELIVERY_COUNT, SCHED_DELIVERY FROM JBM_MSG_REF WHERE STATE = 'C' AND CHANNEL_ID = ? AND PAGE_ORD IS NULL ORDER BY ORD
LOAD_REFS=SELECT MESSAGE_ID, DELIVERY_COUNT, SCHED_DELIVERY FROM JBM_MSG_REF WHERE STATE = 'C' AND CHANNEL_ID = ? ORDER BY ORD
UPDATE_REFS_NOT_PAGED=UPDATE JBM_MSG_REF SET PAGE_ORD = NULL WHERE PAGE_ORD BETWEEN ? AND ? AND CHANNEL_ID=?
SELECT_MIN_MAX_PAGE_ORD=SELECT MIN(PAGE_ORD), MAX(PAGE_ORD) FROM JBM_MSG_REF WHERE CHANNEL_ID = ?
SELECT_EXISTS_REF=SELECT MESSAGE_ID FROM JBM_MSG_REF WHERE CHANNEL_ID = ? AND MESSAGE_ID = ?
SELECT_EXISTS_REF_MESSAGE_ID=SELECT MESSAGE_ID FROM JBM_MSG_REF WHERE MESSAGE_ID = ?
UPDATE_DELIVERY_COUNT=UPDATE JBM_MSG_REF SET DELIVERY_COUNT = ? WHERE CHANNEL_ID = ? AND MESSAGE_ID = ?
UPDATE_CHANNEL_ID=UPDATE JBM_MSG_REF SET CHANNEL_ID = ? WHERE CHANNEL_ID = ?
LOAD_MESSAGES=SELECT MESSAGE_ID, RELIABLE, EXPIRATION, TIMESTAMP, PRIORITY, HEADERS, PAYLOAD, TYPE FROM JBM_MSG
INSERT_MESSAGE=INSERT INTO JBM_MSG (MESSAGE_ID, RELIABLE, EXPIRATION, TIMESTAMP, PRIORITY, HEADERS, PAYLOAD, CHANNEL_COUNT, TYPE) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)
INC_CHANNEL_COUNT=UPDATE JBM_MSG SET CHANNEL_COUNT = CHANNEL_COUNT + 1 WHERE MESSAGE_ID=?
DEC_CHANNEL_COUNT=UPDATE JBM_MSG SET CHANNEL_COUNT = CHANNEL_COUNT - 1 WHERE MESSAGE_ID=?
DELETE_MESSAGE=DELETE FROM JBM_MSG WHERE MESSAGE_ID=? AND CHANNEL_COUNT=0
MESSAGE_ID_COLUMN=MESSAGE_ID
MESSAGE_EXISTS=SELECT MESSAGE_ID FROM JBM_MSG WHERE MESSAGE_ID = ? FOR UPDATE
INSERT_TRANSACTION=INSERT INTO JBM_TX (TRANSACTION_ID, BRANCH_QUAL, FORMAT_ID, GLOBAL_TXID) VALUES(?, ?, ?, ?)
DELETE_TRANSACTION=DELETE FROM JBM_TX WHERE TRANSACTION_ID = ?
SELECT_PREPARED_TRANSACTIONS=SELECT TRANSACTION_ID, BRANCH_QUAL, FORMAT_ID, GLOBAL_TXID FROM JBM_TX
SELECT_MESSAGE_ID_FOR_REF=SELECT MESSAGE_ID, CHANNEL_ID FROM JBM_MSG_REF WHERE TRANSACTION_ID = ? AND STATE = '+' ORDER BY ORD
SELECT_MESSAGE_ID_FOR_ACK=SELECT MESSAGE_ID, CHANNEL_ID FROM JBM_MSG_REF WHERE TRANSACTION_ID = ? AND STATE = '-' ORDER BY ORD
UPDATE_COUNTER=UPDATE JBM_COUNTER SET NEXT_ID = ? WHERE NAME=?
SELECT_COUNTER=SELECT NEXT_ID FROM JBM_COUNTER WHERE NAME=? FOR UPDATE
INSERT_COUNTER=INSERT INTO JBM_COUNTER (NAME, NEXT_ID) VALUES (?, ?)
SELECT_ALL_CHANNELS=SELECT DISTINCT(CHANNEL_ID) FROM JBM_MSG_REF
]]>
500
<mbean code="org.jboss.messaging.core.plugin.DefaultPostOfficeService"
name="jboss.messaging:service=PostOffice"
xmbean-dd="xmdesc/DefaultPostOffice-xmbean.xml">
<depends optional-attribute-name="ServerPeer">jboss.messaging:service=ServerPeer
jboss.jca:service=DataSourceBinding,name=com/mindbill/system/jdbc
<depends optional-attribute-name="TransactionManager">jboss:service=TransactionManager
JMS
java:/com/mindbill/system/jdbc
true
<![CDATA[
CREATE_POSTOFFICE_TABLE=CREATE TABLE JBM_POSTOFFICE (POSTOFFICE_NAME VARCHAR2(255), NODE_ID INTEGER, QUEUE_NAME VARCHAR2(1023), COND VARCHAR2(1023), SELECTOR VARCHAR2(1023), CHANNEL_ID INTEGER, CLUSTERED CHAR(1))
INSERT_BINDING=INSERT INTO JBM_POSTOFFICE (POSTOFFICE_NAME, NODE_ID, QUEUE_NAME, COND, SELECTOR, CHANNEL_ID, CLUSTERED) VALUES (?, ?, ?, ?, ?, ?, ?)
DELETE_BINDING=DELETE FROM JBM_POSTOFFICE WHERE POSTOFFICE_NAME=? AND NODE_ID=? AND QUEUE_NAME=?
LOAD_BINDINGS=SELECT NODE_ID, QUEUE_NAME, COND, SELECTOR, CHANNEL_ID, CLUSTERED FROM JBM_POSTOFFICE WHERE POSTOFFICE_NAME = ?
]]>
<mbean code="org.jboss.jms.server.plugin.JDBCJMSUserManagerService"
name="jboss.messaging:service=JMSUserManager"
xmbean-dd="xmdesc/JMSUserManager-xmbean.xml">
jboss.jca:service=DataSourceBinding,name=com/mindbill/system/jdbc
<depends optional-attribute-name="TransactionManager">jboss:service=TransactionManager
java:/com/mindbill/system/jdbc
true
<![CDATA[
CREATE_USER_TABLE=CREATE TABLE JBM_USER (USER_ID VARCHAR2(32) NOT NULL, PASSWD VARCHAR2(32) NOT NULL, CLIENTID VARCHAR2(128), PRIMARY KEY(USER_ID))
CREATE_ROLE_TABLE=CREATE TABLE JBM_ROLE (ROLE_ID VARCHAR2(32) NOT NULL, USER_ID VARCHAR2(32) NOT NULL, PRIMARY KEY(USER_ID, ROLE_ID))
SELECT_PRECONF_CLIENTID=SELECT CLIENTID FROM JBM_USER WHERE USER_ID=?
POPULATE.TABLES.1=INSERT INTO JBM_USER (USER_ID,PASSWD,CLIENTID) VALUES ('dilbert','dogbert','dilbert-id')
]]>
The problem is that the tables are not created, ORA exception is thrown (we get this exception for every query that tries to create one of the JBM tables):
2007-09-20 10:50:19,203 DEBUG [org.jboss.messaging.core.plugin.JDBCSupport] Failed to execute: CREATE TABLE JBM_MSG_REF (CHANNEL_ID INTEGER, MESSAGE_ID INTEGER, TRANSACTION_ID INTEGER, STATE CHAR(1), ORD INTEGER, PAGE_ORD INTEGER, DELIVERY_COUNT INTEGER, SCHED_DELIVERY INTEGER, PRIMARY KEY(CHANNEL_ID, MESSAGE_ID))
java.sql.SQLException: ORA-02089: COMMIT is not allowed in a subordinate session
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:331)
at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:288)
at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:745)
at oracle.jdbc.driver.T4CStatement.doOall8(T4CStatement.java:207)
at oracle.jdbc.driver.T4CStatement.executeForRows(T4CStatement.java:1122)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1280)
at oracle.jdbc.driver.OracleStatement.executeUpdateInternal(OracleStatement.java:1864)
at oracle.jdbc.driver.OracleStatement.executeUpdate(OracleStatement.java:1829)
at org.jboss.resource.adapter.jdbc.WrappedStatement.executeUpdate(WrappedStatement.java:186)
at org.jboss.messaging.core.plugin.JDBCSupport.createSchema(JDBCSupport.java:290)
at org.jboss.messaging.core.plugin.JDBCSupport.start(JDBCSupport.java:158)
at org.jboss.messaging.core.plugin.JDBCPersistenceManager.start(JDBCPersistenceManager.java:123)
at org.jboss.messaging.core.plugin.JDBCPersistenceManagerService.startService(JDBCPersistenceManagerService.java:88)
at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)
at org.jboss.system.ServiceMBeanSupport.start(ServiceMBeanSupport.java:196)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:995)
at $Proxy0.start(Unknown Source)
at org.jboss.system.ServiceController.start(ServiceController.java:417)
at org.jboss.system.ServiceController.start(ServiceController.java:435)
at org.jboss.system.ServiceController.start(ServiceController.java:435)
at org.jboss.system.ServiceController.start(ServiceController.java:435)
at org.jboss.system.ServiceController.start(ServiceController.java:435)
at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
at $Proxy4.start(Unknown Source)
at org.jboss.deployment.SARDeployer.start(SARDeployer.java:302)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
at $Proxy42.start(Unknown Source)
at org.jboss.deployment.XSLSubDeployer.start(XSLSubDeployer.java:197)
at org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)
at sun.reflect.GeneratedMethodAccessor22.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
at $Proxy9.deploy(Unknown Source)
at org.jboss.deployment.scanner.URLDeploymentScanner.deploy(URLDeploymentScanner.java:421)
at org.jboss.deployment.scanner.URLDeploymentScanner.scan(URLDeploymentScanner.java:634)
at org.jboss.deployment.scanner.AbstractDeploymentScanner$ScannerThread.doScan(AbstractDeploymentScanner.java:263)
at org.jboss.deployment.scanner.AbstractDeploymentScanner.startService(AbstractDeploymentScanner.java:336)
at org.jboss.system.ServiceMBeanSupport.jbossInternalStart(ServiceMBeanSupport.java:289)
at org.jboss.system.ServiceMBeanSupport.jbossInternalLifecycle(ServiceMBeanSupport.java:245)
at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.system.ServiceController$ServiceProxy.invoke(ServiceController.java:978)
at $Proxy0.start(Unknown Source)
at org.jboss.system.ServiceController.start(ServiceController.java:417)
at sun.reflect.GeneratedMethodAccessor9.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:86)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
at $Proxy4.start(Unknown Source)
at org.jboss.deployment.SARDeployer.start(SARDeployer.java:302)
at org.jboss.deployment.MainDeployer.start(MainDeployer.java:1025)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:819)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:782)
at org.jboss.deployment.MainDeployer.deploy(MainDeployer.java:766)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at org.jboss.mx.interceptor.ReflectedDispatcher.invoke(ReflectedDispatcher.java:155)
at org.jboss.mx.server.Invocation.dispatch(Invocation.java:94)
at org.jboss.mx.interceptor.AbstractInterceptor.invoke(AbstractInterceptor.java:133)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.interceptor.ModelMBeanOperationInterceptor.invoke(ModelMBeanOperationInterceptor.java:142)
at org.jboss.mx.server.Invocation.invoke(Invocation.java:88)
at org.jboss.mx.server.AbstractMBeanInvoker.invoke(AbstractMBeanInvoker.java:264)
at org.jboss.mx.server.MBeanServerImpl.invoke(MBeanServerImpl.java:659)
at org.jboss.mx.util.MBeanProxyExt.invoke(MBeanProxyExt.java:210)
at $Proxy5.deploy(Unknown Source)
at org.jboss.system.server.ServerImpl.doStart(ServerImpl.java:482)
at org.jboss.system.server.ServerImpl.start(ServerImpl.java:362)
at org.jboss.Main.boot(Main.java:200)
at org.jboss.Main$1.run(Main.java:508)
at java.lang.Thread.run(Thread.java:595)
Does anyone know what can be the problem?
Thanks,
Ana & Yuval
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4086626#4086626
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4086626
18 years, 9 months
[EJB 3.0] - [AS 4.2.1] Persistence, EntitManager and dependency injectio
by jonas_c
Hi!
We have experienced a problem in JBoss AS 4.2.1 GA.
We have succeeded in manager.createQuery(...).getResultList(); but only when forced to instantiate the EntityManager using EntityManagerFactory.
We have failed in using manager.persist(Object);.
Although we have created a workaround - that appears ugly in our eyes - since we wish to use code as nicely stated in the standard EJB3-specification - and obvoiusly many of you have succeeded in implementing and deploying those EJB3s.
Our workaround is to lookup UserTransaction and then our persistence works - persisting our Enterprise entity persists also its contact information, that is isolated in the Contact entity - so we belive that our entity beans are correct, and the persistence annotations also. We haven't encountered any problem is retrieving data.
@PersistenceContext(unitName="xyz") EntityManager manager;
When using the above annotations - the persist attempt results in console output that the instance of EnterpriseManager is null - in other words a NullPointerException of the EntityManger is thrown.
As we wrote on top of this message we were forced to instantiate the EntityManager using EntityManagerFactory as follows:
private EntityManagerFactory factory = Persistence.createEntityManagerFactory("xyz");
| private EntityManager manager = factory.createEntityManager();
We have been considering if there could possibly be a deployment issue, or if it is a JBoss AS/EJB3 settings issue.
The JBoss AS 4.2.1 GA is almost equal to standard installation - only jmx-console password is changed.
We are using MySql 5 - and it's a InnoDB dialect in the database.
Since EntityManager seems to work when retrieving data from the database - but not in persisting - we obvously start thinking that it might be related to our datasources and database drivers and setting etc.
To prevent that you have to ask us for more information instead of help guiding us to the right path with our problem - we provide as much information as we think is needed.
In the META-INF we have persistence.xml
| <persistence>
| <persistence-unit name="xyz">
| <jta-data-source>java:jdbc/XYZDS_XA</jta-data-source>
| <properties>
| <property name="hibernate.transaction.manager_lookup_class">org.hibernate.transaction.JBossTransactionManagerLookup</property>
| <property name="hibernate.hbm2ddl.auto" value="none"/>
| <property name="hibernate.show_sql" value="true" />
| <property name="format_sql" value="true"/>
| <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" /> </properties>
| </persistence-unit>
| </persistence>
|
In the servers/default/deploy we have xyz-xa-ds.xml(we have tried both local-tx-datasource and tx-datasource):
| <datasources>
| <xa-datasource>
| <jndi-name>jdbc/XYZDS_XA</jndi-name>
| <xa-datasource-class>com.mysql.jdbc.jdbc2.optional.MysqlXADataSource</xa-datasource-class>
| <xa-datasource-property name="URL">jdbc:mysql://localnetwordcomputername:3306/xyz</xa-datasource-property>
| <user-name>username</user-name>
| <password>password</password>
| <max-pool-size>5</max-pool-size>
| <min-pool-size>0</min-pool-size>
| <blocking-timeout-millis>2000</blocking-timeout-millis>
| <idle-timeout-minutes>2</idle-timeout-minutes> <track-connection-by-tx>true</track-connection-by-tx>
| <new-connection-sql>set autocommit=1</new-connection-sql>
| <no-tx-separate-pools>true</no-tx-separate-pools>
|
| <exception-sorter-class-name>org.jboss.resource.adapter.jdbc.vendor.MySQLExceptionSorter</exception-sorter-class-name>
| <metadata>
| <type-mapping>mySQL</type-mapping>
| </metadata>
| </xa-datasource>
| </datasources>
|
Our service that we use is a Stateless EJB3:
EnterpriseService.java
package org.xyz.services;
|
| import java.util.ArrayList;
| import java.util.Collection;
| import java.util.List;
|
| import javax.ejb.Stateless;
| import javax.ejb.TransactionManagement;
| import javax.ejb.TransactionManagementType;
| import javax.naming.Context;
| import javax.naming.InitialContext;
| import javax.naming.NamingException;
| import javax.persistence.EntityManager;
| import javax.persistence.EntityManagerFactory;
| import javax.persistence.Persistence;
| import javax.persistence.PersistenceContext;
| import javax.transaction.Status;
| import javax.transaction.UserTransaction;
|
| import org.xyz.dao.Contact;
| import org.xyz.dao.Enterprise;
| import org.xyz.dao.IEnterpriseService;
| import org.xyz.dao.User;
|
| @Stateless
| @TransactionManagement(TransactionManagementType.CONTAINER)
| public class EnterpriseService implements IEnterpriseServiceLocal
| {
| // @PersistenceContext(unitName="xyz") EntityManager manager;
| private EntityManagerFactory factory = Persistence.createEntityManagerFactory("xyz");
| private EntityManager manager = factory.createEntityManager();
| private UserTransaction usertransaction = null;
|
| private final static boolean useStandardEJB3 = true;
|
| private void initUserTransaction()
| {
| try
| {
| Context context = new InitialContext();
| usertransaction = (org.jboss.tm.usertx.client.ServerVMClientUserTransaction)context.lookup("UserTransaction");
| }
| catch(NamingException ne)
| {
| ne.printStackTrace();
| }
| }
|
| private Object persist(Object o) throws Exception
| {
| if( useStandardEJB3 )
| {
| if(o instanceof ArrayList)
| {
| for(Object o2:(ArrayList)o)
| manager.persist(o2);
| }
| else
| manager.persist(o);
| return o;
| }
| else
| {
| boolean succeed=false;
| if(usertransaction == null)
| initUserTransaction();
| try {
| usertransaction.begin();
|
| if(o instanceof ArrayList)
| {
| for(Object o2:(ArrayList)o)
| manager.persist(o2);
| }
| else
| manager.persist(o);
| }
| catch (Exception e)
| {
| usertransaction.setRollbackOnly(); // Force a rollback for this error
| throw e;
| }
| finally
| {
| if (usertransaction.getStatus() == Status.STATUS_ACTIVE)
| {
| usertransaction.commit();
| succeed=true;
| }
| else
| {
| usertransaction.rollback();
| succeed=false;
| }
| }
| if(succeed)
| return o;
| else
| return null;
| }
| }
|
| public User login(String username, String password)
| {
| List<? extends User> results = (List<? extends User>) manager.createQuery(
| "SELECT u FROM User u WHERE u.username = :username AND u.password = :password")
| .setParameter("username", username)
| .setParameter("password", password).getResultList();
| if (results.isEmpty())
| {
| return null;
| }
| else
| {
| return results.get(0);
| }
| }
|
| public Enterprise getEnterprise(int id)
| {
| return manager.find(Enterprise.class, id);
| }
|
| public Collection getEnterprises()
| {
| return manager.createQuery("SELECT e FROM Enterprise e")
| .getResultList();
| }
|
| public Collection getEnterprisesByType(String type)
| {
| return manager.createQuery(
| "SELECT e FROM Enterprise e JOIN e.types t WHERE t.name = :type")
| .setParameter("type", type)
| .getResultList();
| }
|
| public Enterprise createEnterprise(Enterprise enterprise)
| {
| try {
| return (Enterprise)persist(enterprise);
| } catch (Exception e) {
| // TODO Auto-generated catch block
| e.printStackTrace();
| return null;
| }
| }
|
| public Enterprise updateEnterprise(Enterprise enterprise)
| {
| manager.merge(enterprise);
| manager.flush();
| return enterprise;
| }
|
| public Collection getEnterpriseTypes()
| {
| return manager.createQuery("SELECT t FROM EnterpriseType t")
| .getResultList();
| }
| }
|
We are using a local interface for the Stateless EJB3:
IEnterpriseServiceLocal.java
| package org.xyz.dao;
|
| import java.util.Collection;
|
| import javax.ejb.Local;
|
| @Local
| public interface IEnterpriseServiceLocal
| {
| public Enterprise getEnterprise(int id);
| public Collection getEnterprises();
| public Collection getEnterprisesByType(String type);
| public Enterprise createEnterprise(Enterprise enterprise);
| public Enterprise updateEnterprise(Enterprise enterprise);
| public Collection getEnterpriseTypes();
| public User login(String username, String password);
| }
|
We have a some entity beans:
Enterprise.java
| package org.xyz.dao;
|
| import java.io.Serializable;
| import java.util.Collection;
|
| import javax.persistence.CascadeType;
| import javax.persistence.Entity;
| import javax.persistence.FetchType;
| import javax.persistence.GeneratedValue;
| import javax.persistence.GenerationType;
| import javax.persistence.Id;
| import javax.persistence.JoinColumn;
| import javax.persistence.JoinTable;
| import javax.persistence.ManyToMany;
| import javax.persistence.OneToOne;
|
| @Entity
| @SequenceGenerator(name = "enterprise_sequence", sequenceName = "enterprise_id_seq")
| public class Enterprise implements Serializable
| {
| private int id;
| private String name;
| private Collection<EnterpriseType> types;
| private Contact contact;
|
| @Id @GeneratedValue(strategy=GenerationType.IDENTITY, generator = "enterprise_sequence")
| public int getId() {
| return id;
| }
| public void setId(int id) {
| this.id = id;
| }
|
| @OneToOne(cascade = CascadeType.ALL, fetch = FetchType.EAGER, optional = false)
| public Contact getContact() {
| return contact;
| }
| public void setContact(Contact contact) {
| this.contact = contact;
| }
|
| public String getName() {
| return name;
| }
| public void setName(String name) {
| this.name = name;
| }
|
| @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
| @JoinTable(inverseJoinColumns = @JoinColumn(name = "enterprisetype_id"))
| public Collection<EnterpriseType> getTypes() {
| return types;
| }
| public void setTypes(Collection<EnterpriseType> types) {
| this.types = types;
| }
| }
|
Contact.java
| package org.xyz.dao;
|
| import java.io.Serializable;
|
| import javax.persistence.Entity;
| import javax.persistence.GeneratedValue;
| import javax.persistence.GenerationType;
| import javax.persistence.Id;
| import javax.persistence.SequenceGenerator;
|
| @Entity
| @SequenceGenerator(name = "contact_sequence", sequenceName = "contact_id_seq")
| public class Contact implements Serializable
| {
| private int id;
| private String email;
| private String phone;
| private String cellular;
| private String fax;
| private String streetAddress;
| private String postalCode;
| private String city;
|
| @Id @GeneratedValue(strategy=GenerationType.IDENTITY, generator = "contact_sequence")
| public int getId() {
| return id;
| }
| public void setId(int id) {
| this.id = id;
| }
|
| public String getCellular() {
| return cellular;
| }
| public void setCellular(String cellular) {
| this.cellular = cellular;
| }
|
| public String getCity() {
| return city;
| }
| public void setCity(String city) {
| this.city = city;
| }
|
| public String getEmail() {
| return email;
| }
| public void setEmail(String email) {
| this.email = email;
| }
|
| public String getFax() {
| return fax;
| }
| public void setFax(String fax) {
| this.fax = fax;
| }
|
| public String getPhone() {
| return phone;
| }
| public void setPhone(String phone) {
| this.phone = phone;
| }
|
| public String getPostalCode() {
| return postalCode;
| }
| public void setPostalCode(String postalCode) {
| this.postalCode = postalCode;
| }
|
| public String getStreetAddress() {
| return streetAddress;
| }
| public void setStreetAddress(String streetAddress) {
| this.streetAddress = streetAddress;
| }
| }
|
and EnterpriseType.java(not used in our tests - it's a ManyToMany enitity - and we leave it out, using an empty Collection - but we thought we could include it here to show anyway)
| package org.xyz.dao;
|
| import java.io.Serializable;
|
| import javax.persistence.Entity;
| import javax.persistence.GeneratedValue;
| import javax.persistence.GenerationType;
| import javax.persistence.Id;
| import javax.persistence.SequenceGenerator;
|
| @Entity
| @SequenceGenerator(name = "enterprisetype_sequence", sequenceName = "enterprisetype_id_seq")
| public class EnterpriseType implements Serializable
| {
| private int id;
| private String name;
|
| @Id @GeneratedValue(strategy=GenerationType.IDENTITY, generator = "enterprisetype_sequence")
| public int getId() {
| return id;
| }
| public void setId(int id) {
| this.id = id;
| }
|
| public String getName() {
| return name;
| }
| public void setName(String name) {
| this.name = name;
| }
| }
|
Extra info: our MySql-tables have all got an Auto Increment key, a bigint. And we are using JDK1.5_0_10. We are deploying as a JAR using an build.xml and ANT (nothing special, just includes the META-INF consisting the persistence.xml and the class packages in the JAR-root). We are using JBoss IDE 2.0 beta as IDE.
This became a long message - hopefully there is someone who is able to support us regarding our problems. A short repetition of our experienced problems is as follows:
- We could not get EntityManager to work with annotations. (only when using EntityManagerFactory).
- We can not persist using standard EJB3 annotations for container managed transacions (needed to lookup UserTransaction and use that). Although we could get info from DB (without UserTransaction).
- We do not know if our datasources are configured correctly.
- We do not know if there is anything with the deployment that may be wrong.
- We do not know if we have failed to configure something in JBoss - that is not in the standard configuration.
We are thankfull for every input and response we can get - please ask for more information if we have left something out - thanks in advance
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4086613#4086613
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4086613
18 years, 9 months