Re: Totally weird behaviour in org.postgresql.Driver - Mailing list pgsql-jdbc

From Dave Cramer
Subject Re: Totally weird behaviour in org.postgresql.Driver
Date
Msg-id 491f66a50903120342j67e87c7dob10cfdc23580c8f4@mail.gmail.com
Whole thread Raw
In response to Re: Totally weird behaviour in org.postgresql.Driver  ("Peter" <peter@greatnowhere.com>)
Responses Re: Totally weird behaviour in org.postgresql.Driver  ("Peter" <peter@greatnowhere.com>)
List pgsql-jdbc
Peter,

Couple things.... do you really need to synchronize twice in every method ???
Have you looked at dbcp or c3po instead of re-inventing the wheel ?

Can you supply us with a test case which does exhibit the bug ?

On Thu, Mar 12, 2009 at 6:04 AM, Peter <peter@greatnowhere.com> wrote:
>> I added a bunch more synchronized (mutex) blocks in my code to avoid
>> getConnection being called simultaneously from multiple threads (why
>> isnt that method synchronized anyway?) - so far so good... keeping
>> fingers crossed. Maybe should have just subclassed PGSimpleDataSource...

>I'm not sure why it needs to be synchronized.  The attached test case (20
threads each opening and closing >connections as fast as possible) doesn't
show any problems for me.  Does it fail for you?  Is there a >particular
change that fixes it for you?

I'm not sure if it needs to be synchronized either. Most likely I'm running
into a JVM bug in my particular environment (Tomcat servlet). I adapted your
test case to run inside a servlet and it does not produce any errors.

In my app I'm using singleton class instance to handle all database
connections, sample code below. If I remove synchronized (dbManager.class)
blocks the bug is back with a vengeance...

final public class dbManager {


   private static PGSimpleDataSource _ds;
   // Our global instance
   private static dbManager _dbManager = null;

       /**

        * Attempts to create a valid PG DataSource
        *
        * @return a boolean representing whether the DS was successfully
created
        */
       private synchronized static boolean createDataSource() {
       try {
               synchronized (dbManager.class) {

               _ds = new PGSimpleDataSource();
                       _ds.setServerName("myserver");
                       _ds.setDatabaseName("mydb");
                       _ds.setPortNumber(5432);

               }

               return true;
       } catch (Exception ex) {
           Logger.getLogger(dbManager.class.getName()).log(Level.SEVERE,
null, ex);
           return false;
       }
       }

   public synchronized static dbManager getInstance(String connString) {
       if ( _dbManager == null ) {
               if ( createDataSource() ) {
                   _dbManager = new dbManager();
               }
       }

       return _dbManager;
   }

   /**
    *
    * @return returns a connection created w/ default initial credentials
and very little access rights
    */
   public synchronized Connection getInitialConnection() throws
SQLException {
       synchronized (dbManager.class) {
               return _ds.getConnection("inituser", "initpass");
       }
   }

   /**
    *
    * @param dbUser
    * @param dbPass
    * @return a connection if it can be created, null otherwise
    */
   public synchronized Connection getNewUserConnection(String dbUser,
String dbPass){
       try {

               synchronized (dbManager.class) {

                       Connection userConn = _ds.getConnection(dbUser,
dbPass);
                       return userConn;

               }

           } catch (Exception ex) {

Logger.getLogger(dbManager.class.getName()).log(Level.SEVERE, null, ex);
               return null;
               }
   }
}


--
Sent via pgsql-jdbc mailing list (pgsql-jdbc@postgresql.org)
To make changes to your subscription:
http://www.postgresql.org/mailpref/pgsql-jdbc

pgsql-jdbc by date:

Previous
From: "Peter"
Date:
Subject: Re: Totally weird behaviour in org.postgresql.Driver
Next
From: Tom Lane
Date:
Subject: Re: Renaming sequence auto generated by SERIAL type don't update pg_attrdef