Tomcat 的数据库连接池
配置好 Log4j 之后,就可以很方面的跟踪这个项目,Debug 起来也很方便。接下来就要慢慢搭建 WEB 的底层了。
之前传统的数据库连接池一般都是在 Tomcat 的 Admin 页面直接操作的。又或者自己利用 JDBC 手动配置。
Apache 最近推出了一个开源项目,基于 DBCP 的数据库连接池。具体内容可以参考这里:http://jakarta.apache.org/commons/dbcp/index.html
要使用 DBCP 数据库连接池,必需要先下载以下 3 个 Jar 包:
commons.dbcp
commons.collections
commons.pool
把这3个包解压后加入到你的工程中就可以了。
下面是 使用 DBCP 建立数据库连接池的示例代码(数据库用的是 MySQL):
import
java.sql.
*
;

import
org.apache.commons.dbcp.
*
;
import
org.apache.commons.pool.
*
;
import
org.apache.commons.pool.impl.
*
;


public
class
DBLinkPool
{

private
static
org.apache.log4j.Category log
=
org.apache.log4j.Category.
getInstance(DBLinkPool.
class
);

/** */
/**
* 数据库连接池
*
@see
http://jakarta.apache.org/commons/dbcp/index.html
*/
private
static
PoolingDriver driver
=
null
;



/** */
/**
* 设置一个数据库连接池
*
*
@param
name 连接池的名称
*
@param
url 数据源
*
@throws
SQLException
*/
private
static
void
setUpDriverPool(String name, String url)
throws
SQLException
{

if
((driver
==
null
)
||
driver.getPoolNames().length
<
2
)
{

try
{

/** */
/**
* 首先创建一个对象池来保存数据库连接
*
* 使用 commons.pool 的 GenericObjectPool对象
*/
ObjectPool connectionPool
=
new
GenericObjectPool();


/** */
/**
* 创建一个 DriverManagerConnectionFactory对象
* 连接池将用它来获取一个连接
*/
ConnectionFactory connectionFactory
=
new
DriverManagerConnectionFactory(url,
null
);


/** */
/**
* 创建一个PoolableConnectionFactory 对象。
*/
PoolableConnectionFactory poolableConnectionFactory
=
new
PoolableConnectionFactory(connectionFactory,
connectionPool,
null
,
null
,
false
,
true
);


/** */
/**
* 注册PoolingDriver。
*/
Class.forName(
"
org.apache.commons.dbcp.PoolingDriver
"
);

driver
=
(PoolingDriver) DriverManager.getDriver(
"
jdbc:apache:commons:dbcp:
"
);

driver.registerPool(name, connectionPool);


}
catch
(ClassNotFoundException e)
{
log.error(e.getMessage(),(Throwable)e);
}
}
}
/** */
/**
* 关闭所有数据库连接池
*
*/
//
public static void shutDownDriver() {
//
//
try {
//
PoolingDriver driver = (PoolingDriver)DriverManager.getDriver("jdbc:apache:commons:dbcp:");
//
for (int i = 0; i < poolNames.length; i++) {
//
driver.closePool("pool");
//
}
//
}
//
catch (SQLException sqle) {
//
throw new RuntimeException(sqle);
//
}
//
}
/** */
/**
* 取得一个数据库连接对象。
*
* 因为可能使用两个不同的数据库,
* 所以依据report的值来确定使用那个数据库。
*
*
@param
report
*
@return
*/
public
static
Connection getConnection()
{
Connection con
=
null
;


try
{
//
装载mysql的jdbc驱动
String driver
=
"
com.mysql.jdbc.Driver
"
;
String url
=
"
jdbc:mysql://localhost/oamisinfo?user=root&password=kingsoft&useUnicode=true&characterEncoding=UTF-8
"
;
String poolName
=
"
pool
"
;
log.info(
"
URL is :
"
+
url);
Class.forName(driver);
setUpDriverPool(poolName, url);
con
=
DriverManager.getConnection(
"
jdbc:apache:commons:dbcp:
"
+
poolName);
log.info(
"
Connected Succeed!
"
);
return
con;

}
catch
(ClassNotFoundException cnfe)
{
log.error(cnfe.getMessage(),(Throwable)cnfe);
throw
new
RuntimeException(
"
无法装入数据库引擎
"
);

}
catch
(SQLException sqle)
{
log.error(sqle.getMessage(),(Throwable)sqle);
throw
new
RuntimeException(
"
无法打开数据库连接
"
);
}
}
/** */
/**
* 执行清理过程
*
* <li>关闭数据库连接</li>
* <li>关闭语句对象</li>
* <li>关闭结果集</li>
*
*
@param
con
*
@param
s
*
@param
rs
*/
public
static
void
closeAll(Connection con, Statement s, ResultSet rs)
{

try
{

if
(rs
!=
null
)
{
rs.close();
rs
=
null
;
}
if
(s
!=
null
)
{
s.close();
s
=
null
;
}
if
(con
!=
null
)
{
con.close();
con
=
null
;
}
}
catch
(SQLException sqle)
{
//
nothing to do, forget it;
}
}
public
static
void
main(String[] args)
{
Connection conn
=
DBLinkPool.getConnection();
ResultSet rs
=
null
;
String sql
=
"
select * from t_questionsort
"
;

try
{
PreparedStatement ps
=
conn.prepareStatement(sql);
rs
=
ps.executeQuery();

while
(rs.next())
{
System.out.println(rs.getString(
"
SortName
"
));
}
}
catch
(SQLException ex)
{
ex.printStackTrace();
}
}
}
下面写个类来测试它:
//
Import your DBLinkPool class
import
com.kingsoft.sys.DBLinkPool;
import
java.sql.
*
;

public
class
TestDB
{
private
static
org.apache.log4j.Category log
=
org.apache.log4j.Category.
getInstance(TestDB.
class
);

public
TestDB()
{
}
public
static
void
main(String[] args)
{

try
{
Connection conn
=
DBLinkPool.getConnection();
log.info(
"
Connect was Succeed
"
);
System.out.println(
"
Connect was Succeed
"
);

}
catch
(Exception ex)
{
log.error(ex.getMessage(),(Throwable)ex);
}
}
}
如果看到 Connect was Succeed,就证明数据库连接池的配置成功了。里面对 连接数的控制,连接集合的控制,完全不用你来操心了。你只需要做的就是从这个连接池类中拿过来一个 Connection 就可以了。
下一节说说在 WEB 应用中经常用的操作 DB 的一些底层方法。包括数据库的 增、删、改、查和分页功能。
都是一些计较简单的,但对于中小型项目又是最有效率的。