Hi again,

> Ok, I forgot
>
> Environment
> OJB 0.9.5
> MySQL 3.23.38-nt
> Windows 2000
> JDK 1.3.1
>
> BrokerFactory does only return the DefaultBroker:
>     public static PersistenceBroker getDefaultBroker() {
>         PersistenceBroker broker = null;
>
>         if (m_defaultBroker == null) {
>             synchronized(PersistenceBrokerFactory.class) {
>                 if (m_defaultBroker == null) {

Hold PB instances is not good. This can cause unexpected behaviour.
The PBF pools PB instances. When you call PB.close() the PB instance was
returned to pool. Your BrokerFactory holds one instance of a PB as a
singleton :-(, but at the same time the instance was returned to pool
for re-use through other classes!!

Kick out the singleton! ;-) You do not have a performace gain in using
the singleton, since PB instances were pooled.

HTH,
Armin

>                     try {
>                         m_defaultBroker =
> PersistenceBrokerFactory.defaultPersistenceBroker();
>                         broker = m_defaultBroker;
>
>                     } catch (Throwable t) {
>                         m_log.error("Error initializing the Default
> PersistenceBroker.");
>                     }
>                 }
>             }
>         } else {
>             broker = m_defaultBroker;
>         }
>
>         return broker;
> }
>
> Hope that helps
>
> bye
> Thomas
>
> > -----Urspr�ngliche Nachricht-----
> > Von: Armin Waibel [mailto:[EMAIL PROTECTED]]
> > Gesendet: Mittwoch, 4. September 2002 12:19
> > An: OJB Users List; [EMAIL PROTECTED]
> > Betreff: Re: TransactionNotInProgressException and AutoCommit
Question
> >
> >
> > Hi Thomas,
> >
> > which version of OJB do you use?
> >
> > I see in your code snip:
> > ....
> > try {
> >             broker = BrokerFactory.getDefaultBroker();
> >
> >             broker.beginTransaction();
> > ....
> >
> > Did you implement your own PersistenceBrokerFactory 'BrokerFactory'?
> > What does BrokerFactory do?
> >
> > > I have debugged the code and the problem is broker.store(sel)
> > > I'm currently using the DefaultSequenceMangerImpl which stores the
MAX
> > ID's
> > > for each table in Object SequenceEntry, within the store-process a
new
> > > Identity is created for SequenceEntry with the construtor of
Identity
> >
> > It's recommended to use the SequenceManagerHiLoImpl or in older
versions
> > the SequenceManagerHighLowImpl.
> >
> >
> > regards,
> > Armin
> >
> >
> > ----- Original Message -----
> > From: "Thomas Fahrmeyer" <[EMAIL PROTECTED]>
> > To: "OJB Users List" <[EMAIL PROTECTED]>
> > Sent: Wednesday, September 04, 2002 12:00 PM
> > Subject: AW: TransactionNotInProgressException and AutoCommit
Question
> >
> >
> > > Hi,
> > >
> > > the complete Method is (and this is executed):
> > >    protected boolean saveSelection(Selection sel, boolean
> > asMarketingAction)
> > > {
> > >         boolean ok = false;
> > >         PersistenceBroker broker = null;
> > >
> > >         try {
> > >             broker = BrokerFactory.getDefaultBroker();
> > >
> > >             broker.beginTransaction();
> > >
> > >             Action action = null;
> > >
> > >
> > >             broker.store(sel);
> > >
> > >             // Hack: ok state must be set after commit, but there
is a
> > >             // unresolved NotInTransactionException which have to
be
> > > considered.
> > >             // Selection is saved anyhow
> > >             ok = true;
> > >
> > >             // 7. commit transaction
> > >             broker.commitTransaction();
> > >             file://broker.close();
> > >             ok = true;
> > >         } catch (PersistenceBrokerException pbe) {
> > >             if (broker.isInTransaction()) {
> > >                 broker.abortTransaction();
> > >             }
> > >
> > >             m_log.error("Selection could not be saved !
Transaction is
> > > rolled back.", pbe);
> > >         } finally {
> > >             if (broker != null) {
> > >                 file://broker.close();
> > >             }
> > >         }
> > >         return ok;
> > >
> > >     } file://end
> > >
> > > I have debugged the code and the problem is broker.store(sel)
> > > I'm currently using the DefaultSequenceMangerImpl which stores the
MAX
> > ID's
> > > for each table in Object SequenceEntry, within the store-process a
new
> > > Identity is created for SequenceEntry with the construtor of
Identity
> > (only
> > > the last lines ...)
> > >             else
> > >             {
> > >                 broker =
> > > PersistenceBrokerFactory.defaultPersistenceBroker();
> > >                 ClassDescriptor cld =
> > > broker.getClassDescriptor(objectToIdentitify.getClass());
> > >
> > >                 // identities must be unique accross extents !
> > >                 this.objectsClass =
> > > broker.getExtentClass(objectToIdentitify.getClass());
> > >                 this.objectsRealClass =
objectToIdentitify.getClass();
> > >                 this.pkValues =
cld.getKeyValues(objectToIdentitify);
> > >             }
> > >
> > >             checkForPrimaryKeys();
> > > <<<< passed and jump to finally >>>>
> > >         }
> > >         catch (Throwable t)
> > >         {
> > >             LoggerFactory.getDefaultLogger().error(t);
> > >             throw new
> > ClassNotPersistenceCapableException(t.getMessage(),
> > > t);
> > >         }
> > >         finally
> > >         {
> > >         if (broker != null)
> > >         {
> > >             broker.close();
> > >         }
> > >         }
> > >
> > > The last statement is broker.close() which is the problem. It
releases
> > the
> > > connection and the connectionManager used by the broker gets in
state
> > > inLocalTransaction = false that on the other Hand raises the
exception
> > > within ConnectionManager.localCommit()
> > > <<<
> > >     public void localCommit()
> > >     {
> > > //        if (log.isDebugEnabled()) log.debug("commit was
called");
> > >         if (!this.isInLocalTransaction)
> > >         {
> > >             throw new TransactionNotInProgressException("Not in
> > transaction,
> > > call begin() before commit()");
> > >         }
> > > ...
> > > >>>>>
> > >
> > > There's the problem. Hmm, I'm a little bit confused. The code says
> > that
> > > should happen every time i wanna use transactions with the PB API.
In
> > the
> > > case a Identity is constructed with constructor Identity(Object)
and
> > not the
> > > one getting a broker as second argument.
> > >
> > > Is this a bug ? Related to the SequenceManager ? I think it is not
> > related
> > > to ODMG or PB API, isn't ?
> > >
> > > Thanx for your help.
> > > Thomas
> > >
> > > > -----Ursprungliche Nachricht-----
> > > > Von: Thomas Mahler [mailto:[EMAIL PROTECTED]]
> > > > Gesendet: Dienstag, 3. September 2002 20:50
> > > > An: OJB Users List
> > > > Betreff: Re: TransactionNotInProgressException and AutoCommit
> > Question
> > > >
> > > >
> > > > Your stacktrace indicates that you have mixed PersistenceBroker
and
> > ODMG
> > > > Transactions !
> > > >
> > > > The code you present here does IMHO not match to the stacktrace
> > where we
> > > > see a org.apache.ojb.odmg.TransactionImpl.abort() first.
> > > > Your code snippet does not contain such a call???
> > > >
> > > > cheers,
> > > > Thomas
> > > >
> > > >
> > > > Thomas Fahrmeyer wrote:
> > > > > Hi,
> > > > >
> > > > > If I try to save a new object I get the exeption
> > > > >
> > > > > ----- Root Cause -----
> > > > > org.apache.ojb.broker.TransactionNotInProgressException
> > > > > at
> > > > >
> > > >
org.apache.ojb.broker.singlevm.PersistenceBrokerImpl.abortTransact
> > > > ion(Persis
> > > > > tenceBrokerImpl.java:266)
> > > > > at
> > > >
org.apache.ojb.odmg.TransactionImpl.abort(TransactionImpl.java:505)
> > > > > at
> > > > >
> > > >
de.virtualsolution.struts.actions.UpdateSelectionAction.updateSele
> > > > ctionODMG(
> > > > > UpdateSelectionAction.java:225)
> > > > >
> > > > > that happend with the following code:
> > > > >
> > > > >
> > > > >>>>>snippet
> > > > >>>>
> > > > >            broker.beginTransaction();
> > > > >
> > > > >            // a new object
> > > > > broker.store(sel);
> > > > >
> > > > >             // 7. commit transaction
> > > > >             broker.commitTransaction();
> > > > >         } catch (PersistenceBrokerException pbe) {
> > > > >             if (broker.isInTransaction()) {
> > > > >                 broker.abortTransaction();
> > > > >             }
> > > > >
> > > > >             m_log.error("Selection could not be saved !
> > Transaction is
> > > > > rolled back.", pbe);
> > > > >         } finally {
> > > > >             if (broker != null) {
> > > > >                 broker.close();
> > > > >             }
> > > > >         }
> > > > > <<<<< end
> > > > >
> > > > > the call to commitTransaction() raises this exception.
> > > > >
> > > > > The object is saved correctly anyway. Is that related to the
> > autoCommit
> > > > > Settings in OJB.properties ? Which settings should I use if I
> > wanna use
> > > > > begin- and commitTransaction() any time ?
> > > > > I have tried to set the autoCommit-level to 2 in
OJB.properties
> > and even
> > > > > ignoreAutoCommitException to true, but doesn't change
anything.
> > > > >
> > > > > Can someone help me out (i'm convinced ;)
> > > > >
> > > > > bye
> > > > > Thomas
> > > > >
> > > > >
> > > > > --
> > > > > To unsubscribe, e-mail:
> > > <mailto:[EMAIL PROTECTED]>
> > > > For additional commands, e-mail:
> > <mailto:[EMAIL PROTECTED]>
> > > >
> > > >
> > > >
> > > >
> > >
> > >
> > >
> > > --
> > > To unsubscribe, e-mail:
> > <mailto:[EMAIL PROTECTED]>
> > > For additional commands, e-mail:
> > <mailto:[EMAIL PROTECTED]>
> > >
> > >
> > > --
> > > To unsubscribe, e-mail:
> > <mailto:[EMAIL PROTECTED]>
> > > For additional commands, e-mail:
> > <mailto:[EMAIL PROTECTED]>
> > >
> > >
> > >
> >
> >
> > --
> > To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> > For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
> >
>
>
> --
> To unsubscribe, e-mail:
<mailto:[EMAIL PROTECTED]>
> For additional commands, e-mail:
<mailto:[EMAIL PROTECTED]>
>
>
>


--
To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to