|
系统管理员
管理员
|
1 # 大 中 小 发表于 2008-01-06 17:42:07
| Installation |
DBCP uses the Jakarta-Commons Database Connection Pool. It relies on number
of Jakarta-Commons components:
- Jakarta-Commons DBCP
- Jakarta-Commons Collections
- Jakarta-Commons Pool
These libraries are located in a single JAR
at $CATALINA_HOME/common/lib/naming-factory-dbcp.jar. However, only
the classes needed for connection pooling have been included, and the packages
have been renamed to avoid interfering with applications.
|
| Preventing dB connection pool
leaks |
A database connection pool creates and manages a pool of connections to a
database. Recycling and reusing already existing connections to a dB is more
efficient than opening a new connection.
There is one problem with connection pooling. A web application has to
explicetely close ResultSet's, Statement's, and Connection's. Failure of a web
application to close these resources can result in them never being available
again for reuse, a db connection pool "leak". This can eventually result in your
web application db connections failing if there are no more available
connections.
There is a solution to this problem. The Jakarta-Commons DBCP can be
configured to track and recover these abandoned dB connections. Not only can it
recover them, but also generate a stack trace for the code which opened these
resources and never closed them.
To configure a DBCP DataSource so that abandoned dB connections are removed
and recycled add the following attribute to the Resource
configuration for your DBCP DataSource:
When
available db connections run low DBCP will recover and recyle any abandoned dB
connections it finds. The default is false.
Use the removeAbandonedTimeout attribute to set the number of
seconds a dB connection has been idle before it is considered abandoned.
 |
 |
 |
 |
removeAbandonedTimeout="60"
|
 |
 |
 |
 | The
default timeout for removing abandoned connections is 300 seconds.
The logAbandoned attribute can be set to true if
you want DBCP to log a stack trace of the code which abandoned the dB connection
resources.
The
default is false.
|
| MySQL DBCP
Example |
0. Introduction
Versions of MySQL and JDBC drivers
that have been reported to work:
- MySQL 3.23.47, MySQL 3.23.47 using InnoDB,, MySQL 3.23.58, MySQL 4.0.1alpha
- Connector/J
3.0.11-stable (the official JDBC Driver)
- mm.mysql 2.0.14 (an old 3rd
party JDBC Driver)
Before you proceed, don't forget to copy the JDBC Driver's jar into
$CATALINA_HOME/common/lib.
1. MySQL configuration
Ensure that you follow these instructions as variations can cause problems.
Create a new test user, a new database and a single test table. Your MySQL
user must have a password assigned. The driver will fail if you
try to connect with an empty password.
 |
 |
 |
 |
mysql> GRANT ALL PRIVILEGES ON *.* TO javauser@localhost
-> IDENTIFIED BY 'javadude' WITH GRANT OPTION;
mysql> create database javatest;
mysql> use javatest;
mysql> create table testdata (
-> id int not null auto_increment primary key,
-> foo varchar(25),
-> bar int);
|
 |
 |
 |
 |
Note: the above user should be removed once testing
is complete!
Next insert some test data into the testdata table.
 |
 |
 |
 |
mysql> insert into testdata values(null, 'hello', 12345);
Query OK, 1 row affected (0.00 sec)
mysql> select * from testdata;
+----+-------+-------+
| ID | FOO | BAR |
+----+-------+-------+
| 1 | hello | 12345 |
+----+-------+-------+
1 row in set (0.00 sec)
mysql>
|
 |
 |
 |
 |
2. Context configuration
Configure the JNDI DataSource in Tomcat by adding a declaration for your
resource to your Context.
For example:
 |
 |
 |
 |
<Context path="/DBTest" docBase="DBTest"
debug="5" reloadable="true" crossContext="true">
<!-- maxActive: Maximum number of dB connections in pool. Make sure you
configure your mysqld max_connections large enough to handle
all of your db connections. Set to 0 for no limit.
-->
<!-- maxIdle: Maximum number of idle dB connections to retain in pool.
Set to -1 for no limit. See also the DBCP documentation on this
and the minEvictableIdleTimeMillis configuration parameter.
-->
<!-- maxWait: Maximum time to wait for a dB connection to become available
in ms, in this example 10 seconds. An Exception is thrown if
this timeout is exceeded. Set to -1 to wait indefinitely.
-->
<!-- username and password: MySQL dB username and password for dB connections -->
<!-- driverClassName: Class name for the old mm.mysql JDBC driver is
org.gjt.mm.mysql.Driver - we recommend using Connector/J though.
Class name for the official MySQL Connector/J driver is com.mysql.jdbc.Driver.
-->
<!-- url: The JDBC connection url for connecting to your MySQL dB.
The autoReconnect=true argument to the url makes sure that the
mm.mysql JDBC Driver will automatically reconnect if mysqld closed the
connection. mysqld by default closes idle connections after 8 hours.
-->
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="javauser" password="javadude" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/javatest?autoReconnect=true"/>
</Context>
|
 |
 |
 |
 |
3. web.xml configuration
Now create a WEB-INF/web.xml for this test application.
 |
 |
 |
 |
<web-app xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
version="2.4">
<description>MySQL Test App</description>
<resource-ref>
<description>DB Connection</description>
<res-ref-name>jdbc/TestDB</res-ref-name>
<res-type>javax.sql.DataSource</res-type>
<res-auth>Container</res-auth>
</resource-ref>
</web-app>
|
 |
 |
 |
 |
4. Test code
Now create a simple test.jsp page for use later.
 |
 |
 |
 |
<%@ taglib uri="http://java.sun.com/jsp/jstl/sql" prefix="sql" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<sql:query var="rs" dataSource="jdbc/TestDB">
select id, foo, bar from testdata
</sql:query>
<html>
<head>
<title>DB Test</title>
</head>
<body>
<h2>Results</h2>
<c:forEach var="row" items="${rs.rows}">
Foo ${row.foo}<br/>
Bar ${row.bar}<br/>
</c:forEach>
</body>
</html>
|
 |
 |
 |
 |
That JSP page makes use of JSTL's SQL and Core taglibs.
You can get it from Sun's Java Web
Services Developer Pack or Jakarta
Taglib Standard 1.1 project - just make sure you get a 1.1.x release. Once
you have JSTL, copy jstl.jar and standard.jar to your
web app's WEB-INF/lib directory.
Finally deploy your web app into $CATALINA_HOME/webapps either
as a warfile called DBTest.war or into a sub-directory called
DBTest
Once deployed, point a browser at
http://localhost:8080/DBTest/test.jsp to view the fruits of your
hard work. |
|
JAVA世纪网
愿意为喜欢JAVA的朋友提供一点帮助
|