Skip site navigation (1) Skip section navigation (2)

Re: Totally weird behaviour in org.postgresql.Driver

From: "Peter" <peter(at)greatnowhere(dot)com>
To: "'Kris Jurka'" <books(at)ejurka(dot)com>
Cc: <pgsql-jdbc(at)postgresql(dot)org>
Subject: Re: Totally weird behaviour in org.postgresql.Driver
Date: 2009-03-12 10:04:27
Message-ID: 002201c9a2f9$edd47510$c97d5f30$@com (view raw or flat)
Thread:
Lists: 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;
		}
    }
}


In response to

Responses

pgsql-jdbc by date

Next:From: Dave CramerDate: 2009-03-12 10:42:46
Subject: Re: Totally weird behaviour in org.postgresql.Driver
Previous:From: Kris JurkaDate: 2009-03-12 04:02:28
Subject: Re: Renaming sequence auto generated by SERIAL type don't update pg_attrdef

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group