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]

Reply via email to