You need to call broker.close() when you are done with each broker.  You 
are actually asking for 500 simultaneously active brokers.

-steve

Steve Clark
ECOS Development Group
[EMAIL PROTECTED]
(970)226-9291




"Wang Lei" <[EMAIL PROTECTED]> 
05/24/2005 09:48 AM
Please respond to
"OJB Users List" <[email protected]>


To
[email protected]
cc

Subject
a problem about oracle connection leak






I have a stange a problem.
At first i design a table by the following script
CREATE TABLE MY_TEST
(
  TEST_ID  INTEGER
)

I also write a class whick is mapping to the table

package junit.entity;

public class MyTest
{
    private int testId;
    /**
     * @return
     */
    public int getTestId()
    {
        return testId;
    }

    /**
     * @param testId     */
    public void setTestId(int testId)
    {
        this.testId = testId;
    }
}

I write a descriptor in the xml file repository.xml

<class-descriptor class="junit.entity.MyTest" table="MY_TEST">
    <field-descriptor autoincrement="true" column="TEST_ID" 
jdbc-type="INTEGER" name="testId" primarykey="true"/>
  </class-descriptor>

I configure the pool as this
<connection-pool maxActive="20"  maxIdle="10"  whenExhaustedAction="2" 
maxWait="2000"  /> 
this configuration is the same as ojb.properties.

I use the following configuration
ConnectionFactoryClass=org.apache.ojb.broker.accesslayer.ConnectionFactoryPooledImpl

ObjectCacheClass=org.apache.ojb.broker.cache.ObjectCachePerBrokerImpl.


I write a multi-thread class to test ojb and have a strange problem

At first i run the class on my computer on oracle9i in the 
company.Everything is fine.
Later i run the class on the computer on oracle9i in the client.I found a 
connection leak that the connections increase fast.
after a while, it established more than 200 connections.
I got a exception.

org.apache.ojb.broker.PBFactoryException: Borrow broker from pool failed, 
using PBKey org.apache.ojb.broker.PBKey: jcdAlias=oracle, 
user=ideal_bright, password=*****
                 at 
org.apache.ojb.broker.core.PersistenceBrokerFactoryDefaultImpl.createPersistenceBroker(Unknown
 

Source)
                 at 
org.apache.ojb.broker.core.PersistenceBrokerFactoryBaseImpl.defaultPersistenceBroker(Unknown
 

Source)
                 at 
org.apache.ojb.broker.PersistenceBrokerFactory.defaultPersistenceBroker(Unknown 

Source)
                 at junit.entity.MyTest.main(MyTest.java:86)
Caused by: java.util.NoSuchElementException: Timeout waiting for idle 
object
                 at 
org.apache.commons.pool.impl.GenericKeyedObjectPool.borrowObject(GenericKeyedObjectPool.java:782)

                 ... 4 more

I tries many ways ,the result keep the same.

I also run the class on the computer on oracle9i in home.
The same exception happened.

I don't know why.

The following is my code to test ojb.

First this is not a single-thread code.
It result in the same exception.

for (int i = 0; i < 500;i++)
        {
 
            try
            {
                MyTest t_Test = new MyTest();
 
                PersistenceBroker broker = 
PersistenceBrokerFactory.defaultPersistenceBroker();
                broker.beginTransaction();
                broker.store(t_Test);
                broker.commitTransaction();
 
                System.out.println( 
PersistenceBrokerFactoryFactory.instance().activePersistenceBroker());
//It keeps increasing and never decreasing.
//just like 1,2,3,and so on
            }
            catch (Exception e)
            {
                e.printStackTrace();
            } 
        }

The following is a multi-thread code to test ojb.


List t_Threads = new ArrayList();
        for (int i = 0; i < 500; i++)
        {
            Thread t_Thread = new Thread()
            {
                public void run()
                {

                    MyTest t_Test = new MyTest();

                    PersistenceBroker broker = 
PersistenceBrokerFactory.defaultPersistenceBroker();
                    broker.beginTransaction();
                    broker.store(t_Test);
                    broker.commitTransaction();
                    System.err.println( 
PersistenceBrokerFactoryFactory.instance().activePersistenceBroker());
//It keeps increasing and never decreasing.
//just like 1,2,3,and so on
             }
            };

            t_Threads.add(t_Thread);
        }

        for (int i = 0; i < t_Threads.size(); i++)
        {
            Thread t_Thread = (Thread) t_Threads.get(i);
            t_Thread.start(); 
        }


Is there anybody can provider a solution to me,
Thanks much.

_________________________________________________________________
享用世界上最大的电子邮件系统― MSN Hotmail。  http://www.hotmail.com 


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



Reply via email to