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]