Dear Armin, I am testing your patch on ImplementationJTAImpl#registerOpenDatabase. The problems regarding the ejbCreate() method disappeared. Unfortunately I got some problems with the org.odmg.Database#deletePersistent now. Again this problem is related to Transaction Management and was not present with the previous Oracle9iAS 9.0.2.2 version.
The test case I present here is again a simple J2EE application made up of a test stateless session bean with a single business method invoked via RMI. The configuration is the same of the previous e-mail. What I am trying to do is basically to lookup for an object (es. SentMail) and deleting it with the Database#deletePersistent method: /* this is done in ejbCreate()... */ org.odmg.Implementation odmg = OJB.getInstance(); org.odmg.Database db = odmg.newDatabase(); db.open(DEF_DATABASE_NAME, Database.OPEN_READ_WRITE); [...] /* this is done in the business method... */ SentMail objSentMail = (SentMail) lookupObject(SentMail.class, 4); db.deletePersistent(objSentMail); The object is actually found on the DB but when I try to delete it I got the following exception: [exec] The following exception has been catched: Transaction was rolled back: org.odmg.TransactionNotInProgressException: No transaction in progress, cannot delete persistent; nested exception is: [exec] com.evermind.server.rmi.OrionRemoteException: Transaction was rolled back: org.odmg.TransactionNotInProgressException: No transaction in progress, cannot delete persistent [exec] org.odmg.TransactionNotInProgressException: No transaction in progress, cannot delete persistent [exec] at OJB_Tx_StatelessSessionBeanWrapper76.test(OJB_Tx_StatelessSessionBeanWrapper76.java:164) [exec] at java.lang.reflect.Method.invoke(Native Method) [exec] at com.evermind.server.rmi.RMICallHandler.run(RMICallHandler.java:119) [exec] at com.evermind.server.rmi.RMICallHandler.run(RMICallHandler.java:48) [exec] at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:804) [exec] at java.lang.Thread.run(Thread.java:479) [exec] at connection to c-01-091/10.2.20.20 as admin [exec] at com.evermind.server.rmi.RMIConnection.EXCEPTION_ORIGINATES_FROM_THE_REMOTE_SERVER(RMIConnection.java:1576) [exec] at com.evermind.server.rmi.RMIConnection.invokeMethod(RMIConnection.java:1529) [exec] at com.evermind.server.rmi.RemoteInvocationHandler.invoke(RemoteInvocationHandler.java:55) [exec] at com.evermind.server.rmi.RecoverableRemoteInvocationHandler.invoke(RecoverableRemoteInvocationHandler.java:22) [exec] at com.evermind.server.ejb.StatelessSessionRemoteInvocationHandler.invoke(StatelessSessionRemoteInvocationHandler.java:50) [exec] at __Proxy5.test(Unknown Source) [exec] at it.enidata.psv.test.ejb.client.TestOJB_Tx.main(TestOJB_Tx.java:45) [exec] [exec] Nested exception is: [exec] org.odmg.TransactionNotInProgressException: No transaction in progress, cannot delete persistent [exec] at org.apache.ojb.odmg.DatabaseImpl.deletePersistent(Unknown Source) [exec] at it.enidata.psv.test.ejb.OJB_TxBean.test(OJB_TxBean.java:144) [exec] at OJB_Tx_StatelessSessionBeanWrapper76.test(OJB_Tx_StatelessSessionBeanWrapper76.java:115) [exec] at java.lang.reflect.Method.invoke(Native Method) [exec] at com.evermind.server.rmi.RMICallHandler.run(RMICallHandler.java:119) [exec] at com.evermind.server.rmi.RMICallHandler.run(RMICallHandler.java:48) [exec] at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:804) [exec] at java.lang.Thread.run(Thread.java:479) [exec] at connection to c-01-091.prirm.pride.it/10.2.20.20 [exec] at com.evermind.server.rmi.OrionRemoteException.receive(OrionRemoteException.java:130) [exec] at com.evermind.server.rmi.RMIConnection.handleMethodInvocationResponse(RMIConnection.java:1691) [exec] at com.evermind.server.rmi.RMIConnection.run(RMIConnection.java:532) [exec] at com.evermind.server.rmi.RMIConnection.run(RMIConnection.java:275) [exec] at EDU.oswego.cs.dl.util.concurrent.PooledExecutor$Worker.run(PooledExecutor.java:798) [exec] at java.lang.Thread.run(Thread.java:484) You can find the complete source code for the OJB_TxBean here below. I am again in your hands... ;) Thanks in advance. Regards, Dino. ps. (from previous thread...) >> 3. I commented out the beginInternTransaction() >> invocation. Clearly this method is equally invoked >> following another code flow. Does it mean it was called twice before your patch? > >this could be the case, but it doesn't matter, because >beginInternTransaction() take care of this. > >nearly all operations of the odmg-api have to be in context of a >transaction and in managed environments it's not allowed to do OJB/ODMG >related transaction demarcation, thus you always have to use JTA >transactions and the easiest way is to use container-managed tx. >Alternative you can use bm-tx via UserTransaction. -- *********************************************************************** **** Source code for the session bean ********************************* *********************************************************************** public class OJB_TxBean implements SessionBean { private SessionContext sessionContext; private static final String DEF_DATABASE_NAME = "dsOJB"; private Implementation odmg; private Database db; public OJB_TxBean() {} public void ejbActivate() { } public void ejbPassivate() { } public void ejbCreate() throws CreateException { try { init(); } catch (InitException e) { throw new CreateException(e.getMessage()); } } private void init() throws InitException{ /* ---------------------------- */ /* Step0 - Getting log4j logger */ /* ---------------------------- */ Logger logger = Logger.getLogger("psv.j2ee.testing"); logger.debug("OJB_TxBean - init(): begin"); odmg = null; db = null; /* ------------------------------------ */ /* Step1 - Initializing ODMG connection */ /* ------------------------------------ */ logger.debug("OJB_TxBean - init(): initializing ODMG connection [BEGIN]"); odmg = OJB.getInstance(); logger.debug("OJB_TxBean - init(): odmg.newDatabase()"); db = odmg.newDatabase(); try { logger.debug("OJB_TxBean - init(): open new database " + db + " using databaseName name " + DEF_DATABASE_NAME); db.open(DEF_DATABASE_NAME, Database.OPEN_READ_WRITE); } catch (ODMGException e) { logger.error("OJB_TxBean - init(): Database open failed", e); throw new InitException(e.getMessage()); } logger.debug("OJB_TxBean - init(): initializing ODMG connection [END]"); } public void ejbRemove() { Logger logger = Logger.getLogger("psv.j2ee.testing"); logger.debug("OJB_TxBean - ejbRemove(): closing ODMG connection [BEGIN]"); try { logger.debug("OJB_TxBean - ejbRemove(): db.close(): " + db); if (db != null) db.close(); } catch (ODMGException e) { logger.error("OJB_TxBean - ejbRemove(): closing of database failed", e); } db = null; odmg = null; logger.debug("OJB_TxBean - ejbRemove(): closing ODMG connection [END]"); } public void setSessionContext(SessionContext sessionContext) { this.sessionContext = sessionContext; } protected PObject lookupObject(Class target, long oid) { Logger logger = Logger.getLogger("psv.j2ee.testing"); logger.debug("OJB_TxBean - lookupObject(): begin"); PersistenceBroker broker = null; PObject pObject = null; try { broker = PersistenceBrokerFactory.defaultPersistenceBroker(); Criteria crit = new Criteria(); crit.addEqualTo("oid", new Long(oid)); Query query = new QueryByCriteria(target, crit); java.util.Iterator iter = broker.getCollectionByQuery(query).iterator(); if (iter.hasNext()) pObject = (PObject) iter.next(); } catch (Exception e) { logger.error("OJB_TxBean - lookupObject(): Query failed", e); throw new EJBException("OJB_TxBean - lookupObject(): Query failed", e); } finally { if (broker != null) broker.close(); } logger.debug("OJB_TxBean - lookupObject(): end"); return pObject; } public String test() throws java.rmi.RemoteException { Logger logger = Logger.getLogger("psv.j2ee.testing"); logger.debug("OJB_TxBean - test(): begin"); /* ---------------------- */ /* --- Business Stuff --- */ /* ---------------------- */ logger.debug("OJB_TxBean - test(): odmg : " + odmg); SentMail objSentMail = (SentMail) lookupObject(SentMail.class, 4); logger.debug("OJB_TxBean - test(): objSentMail : " + objSentMail); logger.debug("OJB_TxBean - test(): objSentMail.getSubject() : " + objSentMail.getSubject()); logger.debug("OJB_TxBean - test(): objSentMail.getSend_to() : " + objSentMail.getSend_to()); logger.debug("OJB_TxBean - test(): objSentMail.getRecipient() : " + objSentMail.getRecipient()); logger.debug("OJB_TxBean - test(): objSentMail : " + objSentMail); db.deletePersistent(objSentMail); logger.debug("OJB_TxBean - test(): end"); SimpleDateFormat simpleDateFormat = new SimpleDateFormat("dd.MM.yyyy hh:mm:ss"); return "OJB_TxBean - test(): done [" + simpleDateFormat.format(Calendar.getInstance().getTime()) + "]"; } } -- --- Armin Waibel <[EMAIL PROTECTED]> ha scritto: > Hi Dino, > > Dino Di Cola wrote: > > > Dear Armin, > > first of all thanks for your prompt reply! > > > > I applied the change to the > > ImplementationJTAImpl#registerOpenDatabase and > > executed the test from scratch. > > My simple test application works fine now. > > I deployed also the main J2EE application and > works > > also there at first sight. > > > > I would like to have more insight from you > regarding > > the patch you proposed to apply in > > ImplementationJTAImpl class. > > > > 1. You wrote the following: "OJB always lookup a > > running JTA-transaction this can't be successful > when > > db.open(...) is called on ejbCreate()". > > Could you please give me more info? I cannot > see > > the problem with ejbCreate(). Thanks! > > > > ejbCreate() was called on session bean > initialization, this could be > done e.g. at startup of your appServer to setup a > pool of session bean > instances. Thus there is no guarantee that the > session bean was created > in context of a running tx. > > > > 2. You wrote me it could be a "bug" in odmg > > implementation. And clearly you seems right. > > I will fix this in CVS ASAP. > > > > I cannot understand however why it was > successfully > > running on previous versions of ora9ias!?! > > > > e.g. in your previous version your appServer doesn't > setup a session > bean pool at startup, so the instances were created > when needed and thus > when a tx was reachable --> no exception > > > > 3. I commented out the beginInternTransaction() > > invocation. Clearly this method is equally invoked > > following another code flow. > > Does it mean it was called twice before your > patch? > > > > this could be the case, but it doesn't matter, > because > beginInternTransaction() take care of this. > > > > 4. My Session Bean is substantially very close to > > > src\ejb\org\apache\ojb\ejb\odmg\ODMGSessionBean.java > > (taken from the db-ojb-1.0.rc7 distribution). > > The only difference I note is on the "Required" > > attribute marked in the ODMGSessionBean.java > javadoc. > > I use "NotSupported" instead. > > Have I to change the attribute to "Required"? > > > > > nearly all operations of the odmg-api have to be in > context of an > transaction and in managed environments it's not > allowed to do OJB/ODMG > related transaction demarcation, thus you always > have to use JTA > transactions and the easiest way is to use > container-managed tx. > Alternative you can use bm-tx via UserTransaction. > I wonder how you could use odmg-api in managed > environment with > transaction attribute "NotSupported"? > > > > 5. I am quite sure about this bug (anyway I will > check > > it more and more and I will keep you informed). > > If you are certain of this bug too, in what > release > > do you think to fix it? > > Think the next upcoming OJB 1.0.1 will contain this > fix. > > > > Have you planned a target release date for next > OJB > > release? > > We planed a maintenance release 1.0.1 for last week > ;-) > I'm sure we will release the new version in near > future. > > > > What can I do in the meantime a new release > will be > > officially distributed? > > > > use the patched class > > > > Armin, I really appreciated your help. > > Hope you will answer to all my questions without > > getting bored :) > > > > In return for services, never run down OJB ;-) > > regards, > Armin > > > > Thanks, > > > > d. > > -- > > > > > > > > > > > > > > > > > ____________________________________________________________ > > Yahoo! Companion - Scarica gratis la toolbar di > Ricerca di Yahoo! > > http://companion.yahoo.it > > > > > --------------------------------------------------------------------- > > To unsubscribe, e-mail: > [EMAIL PROTECTED] > > For additional commands, e-mail: > [EMAIL PROTECTED] > > > > > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: > [EMAIL PROTECTED] > For additional commands, e-mail: > [EMAIL PROTECTED] > > ____________________________________________________________ Yahoo! Companion - Scarica gratis la toolbar di Ricerca di Yahoo! http://companion.yahoo.it --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]