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

From Peter
Subject Re: Totally weird behaviour in org.postgresql.Driver
Date
Msg-id 002201c9a2f9$edd47510$c97d5f30$@com
Whole thread Raw
In response to Re: Totally weird behaviour in org.postgresql.Driver  (Kris Jurka <books@ejurka.com>)
Responses Re: Totally weird behaviour in org.postgresql.Driver
List pgsql-jdbc
>> 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;
        }
    }
}


pgsql-jdbc by date:

Previous
From: Kris Jurka
Date:
Subject: Re: Renaming sequence auto generated by SERIAL type don't update pg_attrdef
Next
From: Dave Cramer
Date:
Subject: Re: Totally weird behaviour in org.postgresql.Driver