You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@avalon.apache.org by bl...@apache.org on 2001/11/02 20:28:35 UTC

cvs commit: jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/datasource JdbcDataSource.java JdbcConnectionPool.java

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:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>


Re: cvs commit: jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/datasource JdbcDataSource.java JdbcConnectionPool.java

Posted by Eung-ju Park <co...@apache.org>.
JdbcDataSource occur IllegalMonitorException.
I remove JdbcConnectionPool.put. It works.

----- Original Message -----
From: <bl...@apache.org>
To: <ja...@apache.org>
Sent: Saturday, November 03, 2001 4:28 AM
Subject: cvs commit:
jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/datasource
JdbcDataSource.java JdbcConnectionPool.java


> 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/Jdb
cDataSource.java
>
>   Index: JdbcDataSource.java
>   ===================================================================
>   RCS file:
/home/cvs/jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/data
source/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/Jdb
cConnectionPool.java
>
>   Index: JdbcConnectionPool.java
>   ===================================================================
>   RCS file:
/home/cvs/jakarta-avalon-excalibur/src/java/org/apache/avalon/excalibur/data
source/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:
<ma...@jakarta.apache.org>
> For additional commands, e-mail:
<ma...@jakarta.apache.org>
>
>


--
To unsubscribe, e-mail:   <ma...@jakarta.apache.org>
For additional commands, e-mail: <ma...@jakarta.apache.org>