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>