Hi Armin,

Every bean method gets the broker in the following manner:

       PersistenceBroker broker = null;
       try {
           // get broker
           broker = getBroker();

            // ... processing

            // here we instantiate new classes which uses the broker
            // we pass the broker via the constructor to the class


       }
       catch (....Exception e) {
// AesTransactionException is a RuntimeException so the database actions will be rolled back
           throw new AesTransactioinException(....);
       }
       finally {
           releaseBroker(broker);
       }



getBroker():
  AesPersistenceBrokerFactory.getInstance().getBroker()

releaseBroker();
  AesPersistenceBrokerFactory.getInstance().releaseBroker(broker);

AesPersistenceBrokerFactory (Singleton implementation based on a unique app name at the moment it's only one app accessing the beans):

   public static AesPersistenceBrokerFactory getInstance() {
String appName = AesServerProperties.getInstance().getProperty(AesServerProperties.PROP_AES_APPLICATION); AesPersistenceBrokerFactory instance = (AesPersistenceBrokerFactory)instances.get(appName);
       if (instance==null) {
           instance = new AesPersistenceBrokerFactory();
           instances.put(appName,instance);
       }
       return instance;
   }


   public PersistenceBroker getBroker() {
       return getBroker(0);
   }

   private PersistenceBroker getBroker(int retry) {
       PersistenceBroker broker = null;
       try {
           if (retry > 0) {
log.warn("Tried to retrieve broker more than once (" + retry + "). Increase connection pool max size and OJB maxActive settings.");
           }
           // here the call will be blocked till timeout
           broker = pbf.defaultPersistenceBroker();

       } catch (PBFactoryException e) {
           if (retry < retryAttempts) {
               return getBroker(retry+1);
           }
throw new AesTransactionException(new AesOjbPBNotAvailableException("No more Persistence Broker are available ..."),this.getClass());
       }
       broker.removeAllListeners();
       broker.addListener(new AesPBLifeCycleListener());
       broker.addListener(new AesPBStateListener());
       return broker;
   }

   public void releaseBroker(PersistenceBroker broker) {
       if (broker != null) {
           broker.close();
       }
       broker = null;
   }




Thanks and best regards
André





Armin Waibel wrote:

André Markwalder wrote:

Hi Armin,

Thanks for the detailled explanation so far.

Until now we use OJB out of the box. The only spots where we use our own implementations are the persistence broker as described in earlier mail and we extended the sqlgenerator with our own implementation (We implemented some additional oracle optimizer hints, but right now we're getting back to the standard OJB implementation).


I think these user extensions will not cause the issues.


We didn't make any changes to the proxy implementations.


I ask because some user reported about problems caused by the proxy implementation. E.g.
http://www.mail-archive.com/ojb-user%40db.apache.org/msg14287.html

A the patch with additional improvements will be checked in today or tomorrow.



Perhaps the stacktrace of the two errors we get (from customer log) tells you something (listed after the mail).

Something I forget to mention is that we use (at some spots in the application) the db connection from OJB to create our own prepared statements. Afterwards we close these statement and the resulting resultset. We leave the connection untouched (We don't close the connection). Did you experienced problems if we do this?


If you lookup the connection in the same way as described in docs
http://db.apache.org/ojb/docu/guides/connection.html#Can+I+directly+obtain+a%0A++++++++++++++++ (without OJB's tx demarcation - only broker lookup, connection lookup, connection use, stmt/RS close, broker close) ...the answer is no.

If both error below are not reproduceable and only occur under heavy user load, I assume that you have a concurrency problem. Could you describe how you are handling the PB instances - do you lookup a new PB instance in each stateless session bean method or do you share PB instances within some beans?


BTW. OJB Team did a very good job implementing a persistence layer. Our product we're implenting right now uses OJB and OJB helps us a lot to simplify things concerning the data access. Without OJB I think we will still be in development phase of the product ;-). Good job.


Thanks much! You make my day ;-)

regards,
Armin


Thanks and best regards
André

Error 1:
[9/26/05 8:23:50:748 CEST] 7412d0 ExceptionUtil E CNTR0020E: Non-application exception occurred while processing method "getListOfBusinessObjects" on bean "BeanId(SWMApplication#aes_tapir_ejb.jar#TAPIR/Employee, null)". Exception data: java.lang.NullPointerException at org.apache.ojb.broker.core.PersistenceBrokerImpl.getClassDescriptor(Unknown Source) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getClassDescriptor(Unknown Source) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getClassDescriptor(Unknown Source) at com.alabus.aes.server.ejb.util.AesQuery.getQueryByCriteria(AesQuery.java:793) at com.alabus.aes.server.ejb.util.AbstractAesReader.getDataMapFromDatabase(AbstractAesReader.java:119) at com.alabus.aes.server.ejb.util.AesXmlReader.generateXML(AesXmlReader.java:61) at com.alabus.aes.server.ejb.util.AesXmlReader.generateXML(AesXmlReader.java:56) at com.alabus.aes.server.ejb.util.AbstractAesBaseBusinessObject.getListOfBusinessObjects(AbstractAesBaseBusinessObject.java:403) at com.alabus.aes.server.ejb.util.AbstractAesBaseBusinessObject.getListOfBusinessObjects(AbstractAesBaseBusinessObject.java:352) at com.alabus.aes.server.ejb.application.tapir.EmployeeBean.getListOfBusinessObjects(EmployeeBean.java:405) at com.alabus.aes.server.ejb.application.tapir.EJSRemoteStatelessTAPIR_Employee_d0d65d1e.getListOfBusinessObjects(EJSRemoteStatelessTAPIR_Employee_d0d65d1e.java:165) at com.alabus.aes.server.ejb.application.tapir._EJSRemoteStatelessTAPIR_Employee_d0d65d1e_Tie.getListOfBusinessObjects(_EJSRemoteStatelessTAPIR_Employee_d0d65d1e_Tie.java:318) at com.alabus.aes.server.ejb.application.tapir._EJSRemoteStatelessTAPIR_Employee_d0d65d1e_Tie._invoke(_EJSRemoteStatelessTAPIR_Employee_d0d65d1e_Tie.java:135) at com.ibm.CORBA.iiop.ServerDelegate.dispatchInvokeHandler(ServerDelegate.java:615) at com.ibm.CORBA.iiop.ServerDelegate.dispatch(ServerDelegate.java:468)
   at com.ibm.rmi.iiop.ORB.process(ORB.java:396)
   at com.ibm.CORBA.iiop.ORB.process(ORB.java:1608)
   at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2164)
   at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:63)
   at com.ibm.ejs.oa.pool.PooledThread.run(ThreadPool.java:95)
   at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:672)

Error 2:
com.ibm.websphere.ce.cm.ObjectClosedException: DSRA9110E: Statement is closed. at com.ibm.ws.rsadapter.jdbc.WSJdbcStatement.runtimeXIfNotClosed(WSJdbcStatement.java:944) at com.ibm.ws.rsadapter.jdbc.WSJdbcPreparedStatement.executeQuery(WSJdbcPreparedStatement.java:435) at org.apache.ojb.broker.accesslayer.JdbcAccessImpl.executeQuery(Unknown Source) at org.apache.ojb.broker.accesslayer.RsQueryObject.performQuery(Unknown Source) at org.apache.ojb.broker.accesslayer.RsIterator.<init>(Unknown Source) at org.apache.ojb.broker.core.RsIteratorFactoryImpl.createRsIterator(Unknown Source) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getRsIteratorFromQuery(Unknown Source) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getIteratorFromQuery(Unknown Source) at org.apache.ojb.broker.core.PersistenceBrokerImpl.getObjectByQuery(Unknown Source) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByQuery(Unknown Source) at org.apache.ojb.broker.core.DelegatingPersistenceBroker.getObjectByQuery(Unknown Source) at com.alabus.aes.server.ejb.util.AbstractAesReader.<init>(AbstractAesReader.java:105) at com.alabus.aes.server.ejb.util.AesXmlReader.<init>(AesXmlReader.java:50) at com.alabus.aes.server.ejb.util.AbstractAesBaseBusinessObject.getListOfBusinessObjects(AbstractAesBaseBusinessObject.java:402) at com.alabus.aes.server.ejb.util.AbstractAesBaseBusinessObject.getListOfBusinessObjects(AbstractAesBaseBusinessObject.java:364) at com.alabus.aes.server.ejb.application.system.AesLovBean.getListOfBusinessObjects(AesLovBean.java:225) at com.alabus.aes.server.ejb.application.system.EJSLocalStatelessTAPIR_AesLov_ef909e9c.getListOfBusinessObjects(EJSLocalStatelessTAPIR_AesLov_ef909e9c.java:199)
   at java.lang.reflect.Method.invoke(Native Method)
at com.alabus.aes.server.ejb.util.AbstractAesBaseBusinessObject.getLovs(AbstractAesBaseBusinessObject.java:722) at com.alabus.aes.server.ejb.application.tapir.BusTaskBean.getLovs(BusTaskBean.java:656) at com.alabus.aes.server.ejb.application.tapir.EJSRemoteStatelessTAPIR_BusTask_b3b11d52.getLovs(EJSRemoteStatelessTAPIR_BusTask_b3b11d52.java:165) at com.alabus.aes.server.ejb.application.tapir._EJSRemoteStatelessTAPIR_BusTask_b3b11d52_Tie.getLovs(_EJSRemoteStatelessTAPIR_BusTask_b3b11d52_Tie.java:345) at com.alabus.aes.server.ejb.application.tapir._EJSRemoteStatelessTAPIR_BusTask_b3b11d52_Tie._invoke(_EJSRemoteStatelessTAPIR_BusTask_b3b11d52_Tie.java:84) at com.ibm.CORBA.iiop.ServerDelegate.dispatchInvokeHandler(ServerDelegate.java:615) at com.ibm.CORBA.iiop.ServerDelegate.dispatch(ServerDelegate.java:468)
   at com.ibm.rmi.iiop.ORB.process(ORB.java:396)
   at com.ibm.CORBA.iiop.ORB.process(ORB.java:1608)
   at com.ibm.rmi.iiop.Connection.doWork(Connection.java:2164)
   at com.ibm.rmi.iiop.WorkUnitImpl.doWork(WorkUnitImpl.java:63)
   at com.ibm.ejs.oa.pool.PooledThread.run(ThreadPool.java:95)
   at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:672)



---------------------------------------------------------------------
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]

Reply via email to