avalon-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From blorit...@apache.org
Subject cvs commit: jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/datasource JdbcDataSource.java JdbcConnectionPool.java
Date Fri, 02 Nov 2001 19:28:35 GMT
bloritsch    01/11/02 11:28:35

  Modified:    src/java/org/apache/avalon/excalibur/datasource
                        JdbcDataSource.java JdbcConnectionPool.java
  Log:
  First stab at blocking code
  
  Revision  Changes    Path
  1.11      +18 -3     jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/datasource/JdbcDataSource.java
  
  Index: JdbcDataSource.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/datasource/JdbcDataSource.java,v
  retrieving revision 1.10
  retrieving revision 1.11
  diff -u -r1.10 -r1.11
  --- JdbcDataSource.java	2001/11/02 18:57:11	1.10
  +++ JdbcDataSource.java	2001/11/02 19:28:35	1.11
  @@ -34,7 +34,7 @@
    * </pre>
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
  - * @version CVS $Revision: 1.10 $ $Date: 2001/11/02 18:57:11 $
  + * @version CVS $Revision: 1.11 $ $Date: 2001/11/02 19:28:35 $
    * @since 4.0
    */
   public class JdbcDataSource
  @@ -67,6 +67,7 @@
   
               final int min = controller.getAttributeAsInteger( "min", 1 );
               final int max = controller.getAttributeAsInteger( "max", 3 );
  +            final long timeout = controller.getAttributeAsLong( "timeout", -1 );
               final boolean autoCommit = configuration.getChild("auto-commit").getValueAsBoolean(true);
               final boolean oradb = controller.getAttributeAsBoolean( "oradb", false );
               final String connectionClass = controller.getAttribute( "connection-class",
null );
  @@ -160,7 +161,8 @@
               try
               {
                   m_pool = new JdbcConnectionPool( factory, poolController, l_min, l_max,
autoCommit );
  -                m_pool.setLogger(getLogger());
  +                m_pool.setLogger( getLogger() );
  +                m_pool.setTimeout( timeout );
                   m_pool.initialize();
               }
               catch (Exception e)
  @@ -179,7 +181,20 @@
       public Connection getConnection()
           throws SQLException
       {
  -        try { return (Connection) m_pool.get(); }
  +        try
  +        {
  +            return (Connection) m_pool.get();
  +        }
  +        catch( final SQLException se )
  +        {
  +            if (getLogger().isWarnEnabled())
  +            {
  +                getLogger().warn( "Could not return Connection", se );
  +            }
  +
  +            // Rethrow so that we keep the original stack trace
  +            throw se;
  +        }
           catch( final Exception e )
           {
               if (getLogger().isWarnEnabled())
  
  
  
  1.7       +63 -2     jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/datasource/JdbcConnectionPool.java
  
  Index: JdbcConnectionPool.java
  ===================================================================
  RCS file: /home/cvs/jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/datasource/JdbcConnectionPool.java,v
  retrieving revision 1.6
  retrieving revision 1.7
  diff -u -r1.6 -r1.7
  --- JdbcConnectionPool.java	2001/09/26 17:52:28	1.6
  +++ JdbcConnectionPool.java	2001/11/02 19:28:35	1.7
  @@ -21,7 +21,7 @@
    * thread to manage the number of SQL Connections.
    *
    * @author <a href="mailto:bloritsch@apache.org">Berin Loritsch</a>
  - * @version CVS $Revision: 1.6 $ $Date: 2001/09/26 17:52:28 $
  + * @version CVS $Revision: 1.7 $ $Date: 2001/11/02 19:28:35 $
    * @since 4.0
    */
   public class JdbcConnectionPool
  @@ -31,6 +31,7 @@
       private Thread                 m_initThread;
       private final boolean          m_autoCommit;
       private boolean                m_noConnections = false;
  +    private long                   m_wait = -1;
   
       public JdbcConnectionPool( final JdbcConnectionFactory factory, final DefaultPoolController
controller, final int min, final int max, final boolean autoCommit)
           throws Exception
  @@ -41,6 +42,22 @@
           this.m_autoCommit = autoCommit;
       }
   
  +    /**
  +     * Set the timeout in milliseconds for blocking when waiting for a
  +     * new connection.  It defaults to -1.  Any number below 1 means that there
  +     * is no blocking, and the Pool fails hard.  Any number above 0 means we
  +     * will wait for that length of time before failing.
  +     */
  +    public void setTimeout( long timeout )
  +    {
  +        if (this.m_initialized)
  +        {
  +            throw new IllegalStateException("You cannot change the timeout after the pool
is initialized");
  +        }
  +
  +        m_wait = timeout;
  +    }
  +
       public void initialize()
       {
           m_initThread = new Thread( this );
  @@ -49,7 +66,45 @@
   
       protected final Poolable newPoolable() throws Exception
       {
  -        JdbcConnection conn = (JdbcConnection) super.newPoolable();
  +        JdbcConnection conn = null;
  +
  +        if ( m_wait < 1 )
  +        {
  +            conn = (JdbcConnection) super.newPoolable();
  +        }
  +        else
  +        {
  +            long curMillis = new Date().getTime();
  +            long endTime = curMillis + m_wait;
  +
  +            while ( ( null == conn ) && ( curMillis < endTime ) )
  +            {
  +                try
  +                {
  +                    m_mutex.unlock();
  +                    this.wait( m_wait ); // wait for 50 millis before trying again
  +                }
  +                finally
  +                {
  +                    m_mutex.lock();
  +                }
  +
  +                try
  +                {
  +                    conn = (JdbcConnection) super.newPoolable();
  +                }
  +                finally
  +                {
  +                    // Do nothing except keep waiting
  +                }
  +            }
  +        }
  +
  +        if (null == conn )
  +        {
  +            throw new NoAvailableConnectionException("All available connections are in
use");
  +        }
  +
           conn.setPool(this);
           return conn;
       }
  @@ -119,6 +174,12 @@
           }
   
           return obj;
  +    }
  +
  +    public void put( Poolable obj )
  +    {
  +        super.put( obj );
  +        this.notifyAll();
       }
   
       public void run()
  
  
  

--
To unsubscribe, e-mail:   <mailto:avalon-dev-unsubscribe@jakarta.apache.org>
For additional commands, e-mail: <mailto:avalon-dev-help@jakarta.apache.org>


Mime
View raw message