JdbcDataSource occur IllegalMonitorException. I remove JdbcConnectionPool.put. It works.
----- Original Message ----- From: <[EMAIL PROTECTED]> To: <[EMAIL PROTECTED]> 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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]">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:[EMAIL PROTECTED]> > For additional commands, e-mail: <mailto:[EMAIL PROTECTED]> > > -- To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]> For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>