tomcat-users mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Pete Helgren <P...@valadd.com>
Subject Re: Pointers on diagnosing session and thread hangs
Date Mon, 22 Jun 2009 12:00:19 GMT
I posted just the part of the code that was relevant.  The 
initialization and retrieval of the configuration options is not shown 
here.  The pooling mechanism was the focus of the post and that is why I 
posted just that code.

Pete


Martin Gainty wrote:
> where is _isIBMi declaration?..
> how is _isIBMi used to configure ConnectionPool?
> Martin
> ______________________________________________ 
> Verzicht und Vertraulichkeitanmerkung/Note de déni et de confidentialité
>  
> Diese Nachricht ist vertraulich. Sollten Sie nicht der vorgesehene Empfaenger sein, so
bitten wir hoeflich um eine Mitteilung. Jede unbefugte Weiterleitung oder Fertigung einer
Kopie ist unzulaessig. Diese Nachricht dient lediglich dem Austausch von Informationen und
entfaltet keine rechtliche Bindungswirkung. Aufgrund der leichten Manipulierbarkeit von E-Mails
koennen wir keine Haftung fuer den Inhalt uebernehmen.
> Ce message est confidentiel et peut être privilégié. Si vous n'êtes pas le destinataire
prévu, nous te demandons avec bonté que pour satisfaire informez l'expéditeur. N'importe
quelle diffusion non autorisée ou la copie de ceci est interdite. Ce message sert à l'information
seulement et n'aura pas n'importe quel effet légalement obligatoire. Étant donné que les
email peuvent facilement être sujets à la manipulation, nous ne pouvons accepter aucune
responsabilité pour le contenu fourni.
>
>
>
>
>   
>> Date: Sun, 21 Jun 2009 13:25:25 -0600
>> From: Pete@valadd.com
>> To: users@tomcat.apache.org
>> Subject: Re: Pointers on diagnosing session and thread hangs
>>
>> "For curiosity's sake, why did you roll your own DB pooling, rather than 
>> letting Tomcat manage it?"
>>
>> That is a good question and one I am not sure I can easily answer since 
>> the base code I am working with was originally written by someone else 6 
>> years ago. I am not sure if DB pooling was implemented back then, but we 
>> have a particular platform where we need to call some system routines 
>> before making the connection and so this driver is just small piece of 
>> code handles that system call and all the DB connecting and pooling.  I 
>> am not sure why the pooling was implemented in this code since my 
>> understanding is that the JDBC driver usually handles this.
>>
>> We then added some additional support for other DB's into this code so 
>> that the web application can stay completely agnostic to the database it 
>> is connecting to.  We specify different JDBC connection information in 
>> the configuration file that the DB Manager code references.  So I guess 
>> the bottom line is that this code exists to keep the webapp independent 
>> of the database but why pooling was implemented in the driver is 
>> something that we are now looking into since it appears to be the point 
>> of pain.
>>
>> FWIW the code from the relevant method is:
>>
>>     public DataSource setupDataSource(String userName, String password,
>>             String connectURI, String roleID, boolean doAdd) {
>>         //
>>         // First, we'll need a ObjectPool that serves as the
>>         // actual pool of connections.
>>         //
>>         // We'll use a GenericObjectPool instance, although
>>         // any ObjectPool implementation will suffice.
>>         //
>>         if(_debug)
>>             System.out.println("Setting up datasource with Role: 
>> "+roleID);  //Specific to our implementation
>>            
>>         ObjectPool connectionPool = new GenericObjectPool(null, maxActive,
>>                 whenExhaustedAction, maxWait, maxIdle, minIdle,
>>                 testOnBorrow, testOnReturn, timeBetweenEvictionRunsMillis,
>>                 numTestsPerEvictionRun, minEvictableIdleTimeMillis, 
>> testWhileIdle);
>>         //
>>         // Next, we'll create a ConnectionFactory that the
>>         // pool will use to create Connections.
>>         // We'll use the DriverManagerConnectionFactory,
>>         // using the connect string passed in the command line
>>         // arguments.
>>         //
>>         ConnectionFactory connectionFactory = new 
>> DriverManagerConnectionFactory(
>>                 connectURI, userName, password);
>>         //
>>         // Now we'll create the PoolableConnectionFactory, which wraps
>>         // the "real" Connections created by the ConnectionFactory with
>>         // the classes that implement the pooling functionality.
>>         //
>>         PoolableConnectionFactory pool = null;
>>        
>>        // Code to handle member overrides specific to IBM i
>>
>>             if(_debug)
>>                 System.out.println("Creating connection pool using 
>> PoolableConnectionFactory");
>>             pool = new PoolableConnectionFactory(
>>                     connectionFactory, connectionPool, null, null, 
>> false, true) {
>>                 /*
>>                  * (non-Javadoc)
>>                  *
>>                  * @see 
>> org.apache.commons.dbcp.PoolableConnectionFactory#makeObject()
>>                  */
>>
>>                 public synchronized Object makeObject() throws Exception {
>>                 // This line of code is BLOCKED randomly
>>                     Connection conn = (Connection) super.makeObject();
>>                // Code to handle member overrides specific to IBM i
>>                     if(_isIBMi.equals("Y"))
>>                         if(_debug)
>>                             System.out.println("Preparing member 
>> connection");
>>                    //Calls the override routines on the IBM i system
>>                     databaseManager.prepareMemberConnection(conn);
>>                    
>>                     return conn;
>>                 }
>>             };
>>            
>>         }
>>         else
>>         {
>>             if(_debug)
>>                 System.out.println("Creating connection pool using 
>> PoolableConnectionFactory");
>>          pool = new PoolableConnectionFactory(
>>                 connectionFactory, connectionPool, null, null, false, true);
>>         }
>>         //
>>         // Finally, we create the PoolingDriver itself,
>>         // passing in the object pool we created.
>>         //
>>         if(_debug)
>>             System.out.println("Creating PoolingDataSource");
>>         PoolingDataSource dataSource = new 
>> PoolingDataSource(connectionPool);
>>        
>>         pool.setDefaultAutoCommit(defaultAutoCommit);
>>         pool.setDefaultCatalog(defaultCatalog);
>>         pool.setDefaultReadOnly(defaultReadOnly);
>>         //pool.setDefaultTransactionIsolation(defaultTransactionIsolation);
>>         if (validationQuery != null)
>>             pool.setValidationQuery(validationQuery);
>>
>>         dataSource
>>                 
>> .setAccessToUnderlyingConnectionAllowed(accessToUnderlyingConnectionAllowed);
>>
>>         try {
>>             for (int i = 0; i < initialSize; i++) {
>>                 if(_debug)
>>                     System.out.println("Adding object to pool up to 
>> initial size");
>>                 connectionPool.addObject();
>>             }
>>         }
>>         catch (Exception e) {
>>             e.printStackTrace();
>>         }
>>         if (doAdd == true)
>>         {
>>             if(_debug)
>>                 System.out.println("Adding object to pool");
>>             _pools.put(roleID, connectionPool);
>>             _dataSources.put(roleID, dataSource);
>>         }
>>         return dataSource;
>>     }
>>
>> I will need to find out why the code is structured this way, 
>> particularly the makeObject calls.  And, again, the thread dump has been 
>> very helpful in sorting this all out. 
>>
>> Pete
>>
>>
>> Caldarale, Charles R wrote:
>>     
>>>> From: Pete Helgren [mailto:Pete@valadd.com]
>>>> Subject: Re: Pointers on diagnosing session and thread hangs
>>>>
>>>> I am looking at the DB Manager code I wrote to see if I am doing
>>>> something wrong in implementing the pooling.
>>>>     
>>>>         
>>> For curiosity's sake, why did you roll your own DB pooling, rather than letting
Tomcat manage it?
>>>
>>>  - Chuck
>>>
>>>
>>> THIS COMMUNICATION MAY CONTAIN CONFIDENTIAL AND/OR OTHERWISE PROPRIETARY MATERIAL
and is thus for use only by the intended recipient. If you received this in error, please
contact the sender and delete the e-mail and its attachments from all computers.
>>>
>>>
>>> ---------------------------------------------------------------------
>>> To unsubscribe, e-mail: users-unsubscribe@tomcat.apache.org
>>> For additional commands, e-mail: users-help@tomcat.apache.org
>>>
>>>
>>>   
>>>       
>
> _________________________________________________________________
> Microsoft brings you a new way to search the web.  Try  Bing^(TM) now
> http://www.bing.com?form=MFEHPG&publ=WLHMTAG&crea=TEXT_MFEHPG_Core_tagline_try
bing_1x1
>   

Mime
  • Unnamed multipart/alternative (inline, None, 0 bytes)
View raw message