Author: fhanik
Date: Fri Jul 24 15:24:52 2009
New Revision: 797528
URL: http://svn.apache.org/viewvc?rev=797528&view=rev
Log:
Add in Linux special case for performance optimization around locking.
Set default queue to be the fair one
Remove unused code
Modified:
tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
Modified: tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml?rev=797528&r1=797527&r2=797528&view=diff
==============================================================================
--- tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml (original)
+++ tomcat/trunk/modules/jdbc-pool/doc/jdbc-pool.xml Fri Jul 24 15:24:52 2009
@@ -353,10 +353,16 @@
<attribute name="fairQueue" required="false">
<p>(boolean) Set to true if you wish that calls to getConnection should
be treated
fairly in a true FIFO fashion. This uses the
<code>org.apache.tomcat.jdbc.pool.FairBlockingQueue</code>
- implementation for the list of the idle connections. The default
value is <code>false</code>.
+ implementation for the list of the idle connections. The default
value is <code>true</code>.
This flag is required when you want to use asynchronous connection
retrieval.<br/>
- During performance tests, the fairQueue does very well on a multi
core Solaris system,
- but performs terribly on a Linux Fedora 11 system. On Linux we
recommend setting this to false.
+ Setting this flag ensures that threads receive connections in the
order they arrive.<br/>
+ During performance tests, there is a very large difference in how
locks
+ and lock waiting is implemented. When <code>fairQueue=true></code>
+ there is a decision making process based on what operating system the
system is running.
+ If the system is running on Linux (property
<code>os.name=Linux</code>.
+ To disable this Linux specific behavior and still use the fair queue,
simply add the property
+
<code>org.apache.tomcat.jdbc.pool.FairBlockingQueue.ignoreOS=true</code> to
your system properties
+ before the connection pool classes are loaded.
</p>
</attribute>
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java?rev=797528&r1=797527&r2=797528&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/ConnectionPool.java
Fri Jul 24 15:24:52 2009
@@ -148,6 +148,9 @@
if (idle instanceof FairBlockingQueue) {
Future<PooledConnection> pcf =
((FairBlockingQueue<PooledConnection>)idle).pollAsync();
return new ConnectionFuture(pcf);
+ } else if (idle instanceof MultiLockFairBlockingQueue) {
+ Future<PooledConnection> pcf =
((MultiLockFairBlockingQueue<PooledConnection>)idle).pollAsync();
+ return new ConnectionFuture(pcf);
} else {
throw new SQLException("Connection pool is misconfigured, doesn't
support async retrieval. Set the 'fair' property to 'true'");
}
@@ -306,21 +309,6 @@
}
/**
- * If the connection pool gets garbage collected, lets make sure we clean
up
- * and close all the connections.
- * {...@inheritdoc}
- */
- @Override
- protected void finalize() throws Throwable {
-// Runnable closer = new Runnable() {
-// public void run() {
-// close(true);
-// }
-// };
-// this.cancellator.execute(closer);
- }
-
- /**
* Closes the pool and all disconnects all idle connections
* Active connections will be closed upon the {...@link
java.sql.Connection#close close} method is called
* on the underlying connection instead of being returned to the pool
@@ -381,6 +369,7 @@
//make space for 10 extra in case we flow over a bit
if (properties.isFairQueue()) {
idle = new FairBlockingQueue<PooledConnection>();
+ //idle = new MultiLockFairBlockingQueue<PooledConnection>();
} else {
idle = new
ArrayBlockingQueue<PooledConnection>(properties.getMaxActive(),properties.isFairQueue());
}
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java?rev=797528&r1=797527&r2=797528&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/DataSourceProxy.java
Fri Jul 24 15:24:52 2009
@@ -155,17 +155,6 @@
}
}
- protected void finalize() throws Throwable {
-// //terminate the pool?
-// ThreadPoolExecutor closer = new
ThreadPoolExecutor(0,1,1000,TimeUnit.MILLISECONDS,new
LinkedBlockingQueue<Runnable>());
-// final Runnable r = new Runnable() {
-// public void run(){
-// close(true);
-// }
-// };
-// closer.execute(r);
- }
-
public int getPoolSize() throws SQLException{
final ConnectionPool p = pool;
if (p == null) return 0;
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java?rev=797528&r1=797527&r2=797528&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/FairBlockingQueue.java
Fri Jul 24 15:24:52 2009
@@ -43,6 +43,20 @@
public class FairBlockingQueue<E> implements BlockingQueue<E> {
/**
+ * This little sucker is used to reorder the way to do
+ * {...@link java.util.concurrent.locks.Lock#lock()},
+ * {...@link java.util.concurrent.locks.Lock#unlock()}
+ * and
+ * {...@link java.util.concurrent.CountDownLatch#countDown()}
+ * during the {...@link #poll(long, TimeUnit)} operation.
+ * On Linux, it performs much better if we count down while we hold the
global
+ * lock, on Solaris its the other way around.
+ * Until we have tested other platforms we only check for Linux.
+ */
+ final static boolean isLinux =
"Linux".equals(System.getProperty("os.name")) &&
+
(!Boolean.getBoolean(FairBlockingQueue.class.getName()+".ignoreOS"));
+
+ /**
* Phase one entry lock in order to give out
* per-thread-locks for the waiting phase we have
* a phase one lock during the contention period.
@@ -86,6 +100,7 @@
c = waiters.poll();
//give the object to the thread instead of adding it to the
pool
c.setItem(e);
+ if (isLinux && c!=null) c.countDown();
} else {
//we always add first, so that the most recently used object
will be given out
items.addFirst(e);
@@ -94,7 +109,7 @@
lock.unlock();
}
//if we exchanged an object with another thread, wake it up.
- if (c!=null) c.countDown();
+ if (!isLinux && c!=null) c.countDown();
//we have an unbounded queue, so always return true
return true;
}
@@ -261,6 +276,7 @@
* {...@inheritdoc}
* @throws UnsupportedOperation - this operation is not supported
*/
+
public int drainTo(Collection<? super E> c) {
return drainTo(c,Integer.MAX_VALUE);
}
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java?rev=797528&r1=797527&r2=797528&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolConfiguration.java
Fri Jul 24 15:24:52 2009
@@ -65,7 +65,7 @@
* Set to true if you wish that calls to getConnection
* should be treated fairly in a true FIFO fashion.
* This uses the {...@link FairBlockingQueue} implementation for the list
of the idle connections.
- * The default value is false.
+ * The default value is true.
* This flag is required when you want to use asynchronous connection
retrieval.
* @param fairQueue
*/
Modified:
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
URL:
http://svn.apache.org/viewvc/tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java?rev=797528&r1=797527&r2=797528&view=diff
==============================================================================
---
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
(original)
+++
tomcat/trunk/modules/jdbc-pool/java/org/apache/tomcat/jdbc/pool/PoolProperties.java
Fri Jul 24 15:24:52 2009
@@ -68,7 +68,7 @@
protected String initSQL;
protected boolean testOnConnect =false;
protected String jdbcInterceptors=null;
- protected boolean fairQueue = false;
+ protected boolean fairQueue = true;
protected boolean useEquals = false;
protected int abandonWhenPercentageFull = 0;
protected long maxAge = 0;
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]