使用jdbc-pool替代dbcp、c3p0等连接池的原因
以前一直用apache的dbcp来做Datasource,最近偶然发现了tomcat的jdbc-pool,然后研究了下,毅然决定换为tomcat的,这里有很多原因,首先看apache官网:http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html
?
大致如下:
?
So why do we need a new connection pool?
Here are a few of the reasons:
- commons-dbcp is single threaded, in order to be thread safe commons-dbcp
locks the entire pool, even during query validation.
- commons-dbcp is slow - as the number of logical CPUs grow, the performance
suffers, the above point shows that there is not support for high concurrency
Even with the enormous optimizations of the
synchronized
statement
in Java 6, commons-dbcp still suffers in speed and concurrency.
- commons-dbcp is complex, over 60 classes. tomcat-jdbc-pool, core is 8
classes, hence modifications for future requirement will require much less
changes. This is all you need to run the connection pool itself, the rest is
gravy.
- commons-dbcp uses static interfaces. This means you can't compile it with
JDK 1.6, or if you run on JDK 1.6/1.7 you will get NoSuchMethodException for all
the methods not implemented, even if the driver supports it.
- The commons-dbcp has become fairly stagnant. Sparse updates, releases, and
new feature support.
- It's not worth rewriting over 60 classes, when something as a connection
pool can be accomplished with as a much simpler implementation.
- Tomcat jdbc pool implements a fairness option not available in commons-dbcp
and still performs faster than commons-dbcp
- Tomcat jdbc pool implements the ability retrieve a connection
asynchronously, without adding additional threads to the library itself
- Tomcat jdbc pool is a Tomcat module, it depends on Tomcat JULI, a simplified
logging framework used in Tomcat.
- Retrieve the underlying connection using the javax.sql.PooledConnection
interface.
- Starvation proof. If a pool is empty, and threads are waiting for a
connection, when a connection is returned, the pool will awake the correct
thread waiting. Most pools will simply starve.
?
Features added over other connection pool implementations
- Support for highly concurrent environments and multi core/cpu systems.
- Dynamic implementation of interface, will support java.sql and javax.sql
interfaces for your runtime environment (as long as your JDBC driver does the
same), even when compiled with a lower version of the JDK.
- Validation intervals - we don't have to validate every single time we use
the connection, we can do this when we borrow or return the connection, just not
more frequent than an interval we can configure.
- Run-Once query, a configurable query that will be run only once, when the
connection to the database is established. Very useful to setup session
settings, that you want to exist during the entire time the connection is
established.
- Ability to configure custom interceptors. This allows you to write custom
interceptors to enhance the functionality. You can use interceptors to gather
query stats, cache session states, reconnect the connection upon failures, retry
queries, cache query results, and so on. Your options are endless and the
interceptors are dynamic, not tied to a JDK version of a java.sql/javax.sql
interface.
- High performance - we will show some differences in performance later on
- Extremely simple, due to the very simplified implementation, the line count
and source file count are very low, compare with c3p0 that has over 200 source
files(last time we checked), Tomcat jdbc has a core of 8 files, the connection
pool itself is about half that. As bugs may occur, they will be faster to track
down, and easier to fix. Complexity reduction has been a focus from inception.
- Asynchronous connection retriev