commons-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Juozas Baliuka" <bali...@centras.lt>
Subject Re: [DBCP] Please let us start to improve the connection pool
Date Tue, 25 Mar 2003 16:37:13 GMT

----- Original Message -----
From: "Mario Ivankovits" <Mario.Ivankovits@ops.co.at>
To: "Jakarta Commons Developers List" <commons-dev@jakarta.apache.org>
Sent: Monday, March 24, 2003 8:57 PM
Subject: Re: [DBCP] Please let us start to improve the connection pool


> 1) ThreadLocal
> This might not help anything, or do i oversee something?
>
> Thread A gets a connection from the pool
> Thread A loops until the abandoned connection interval is passed
> The connection will be passed back to the pool.
> Thread B gets a connection from the pool (the connection which was passed
> back automatically by some pool mechanism)
> Thread B starts a transaction
> Thread A wakes up from sleep and call "commit()"
> Thread B roll back transaction
>

I use thread locals this way in web applications :

MyServlet extends SomeServlet{

  void service(Request request, Response reslonse)throws
ServletExeption,IOException{
           Connection lazyConnctionWrapper =  decorate(getConection());
              ThreadLocalConnection.set(lazyConnctionWrapper);
            try{
               super.service(request, response);
               lazyConnctionWrapper.commit()//IfOpen();
            }catch( Throwable t ){
               lazyConnctionWrapper.rollback();//IfOpen();
             }finally{
                  lazyConnctionWrapper.close();//IfOpen();
                  ThreadLocalConnection.set(null);//not very usefull
            }


 }

}

class ThreadLocalConnection{
  static ThreadLocal connections = new ThreadLocal();

 static  Connection get(){
    Connection result  = connections.get();
      if(result == null ){
        throw IllegalStateExeption("no connection for current thread');
      }else {
        return result;
    }
 }

 static  void set(Connection connection){
         connections.set(connection);
}


ThreadLocalConnection.get() is used to get connection in application,
"lazyConnctionWrapper.close();//IfOpen();" is single place in application (s
ingle servlet) I need to close connection;
The same idea I use in JMS applications (single message listener/dispatcher
per application)





> Well, Thread A and B do always have their own TheadLocal and so, the
Thread
> do not "know", that the connection is abandoned.
>
> 2) Proxy
> Your proxy looks much more interesting, but i think, it does also not
> correctly handle the problem described above. The proxy do not "change"
the
> thread, only the connection does. For sure, i do not have much experiences
> with the java "Proxy" thinggy, but why should
>     if(  owner.get() == Thread.currentThread()  )
> ever by "not true", the thread is still alive.
> But maybe we could catch the method "passivate" and set the "connection"
to
> null, now the connection is really released.
> I have to try this.
>
> I my case, i can easy implement such method. We have only one central
place
> where we ge a connection from the pool, but i suggest this might not be
> correct for all sort of application out there. Such an application then
has
> problems to decorate the connection instance.
>
> At least, i do not understand why this should be more elegant, if it works
> EVERY application has to read the docs, and implement this. This is like
> "cut and paste" in an OO design, isnt it?
>
> Mario
>
> > class MySafeConnection implements InvokationHandler{
> >
> >   Connection connection;
> >   WeakReference owner;
> >
> >    MySafeConnection(Connection connection){
> >      this.connection = connection;
> >      owner = new WeakReference( Thread.currentThread() );
> >   }
> >
> >  Object invoke(Object obj, Method method, Object args[] ) throw
Throwable{
> >
> >     if(  owner.get() == Thread.currentThread()   ){
> >         method.invoke( connection, args );
> >      }else{
> >         throw new IllegalStateExeption();
> >    }
> >
> >  }
> >
> >  static Connection decorate(Connection connection){
> >
> >     return
> >
(Connection)Proxy.newProxyInstance(connection.getClass().getClassLoader(),
> >                                     new Class[] {Connection.class}, new
> > MySafeConnection(connection));
> >
> >   }
> >
> > }
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
> For additional commands, e-mail: commons-dev-help@jakarta.apache.org
>


---------------------------------------------------------------------
To unsubscribe, e-mail: commons-dev-unsubscribe@jakarta.apache.org
For additional commands, e-mail: commons-dev-help@jakarta.apache.org


Mime
View raw message