一直纠结于数据库连接池的实现,今天终于挤出时间来实现一下。tomcat之前连接池使用dbcp实现,dbcp有很多的缺点,现在的tomcat采用了自己实现的线程池,用起来还是非常的简单方面的。整体操作如下:
1 配置连接池
将以下内容保存为context.xml,放在web项目下的META-INF文件夹下:
< xml version="1.0" encoding="UTF-8" >数据库用户名 password="testtest" //数据库密码 driverClassName="com.mysql.jdbc.Driver" //此处使用mysql数据库,请自行修改驱动 url="jdbc:mysql://localhost:3306/test characterEncoding=UTF-8" /> //test为数据库名,编码为UTF-8
2 代码中引用连接池
package com.hrb2c.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.concurrent.Future;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.tomcat.jdbc.pool.DataSource;
/**
* 数据库连接池
*
* @author Yuedong Li
*
*/
@WebServlet("/ConnPoolTest")
public class ConnPoolTest extends HttpServlet {
private static final long serialVersionUID = 1L;
private Connection con = null;
private static DataSource datasource;
/**
* @see HttpServlet#HttpServlet()
*/
public ConnPoolTest() {
super();
try {
//获取数据源
datasource = getInstance();
//连接池同步
Future future = datasource.getConnectionAsync();
while (!future.isDone()) {
// 等待连接池同步
Thread.sleep(100);
}
// 获取连接池
con = future.get();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 单例模式获取数据源
* @return
* @throws NamingException
*/
private DataSource getInstance() throws NamingException {
if (datasource == null) {
Context initContext = new InitialContext();
Context envContext = (Context) initContext.lookup("java:/comp/env");
datasource = (DataSource) envContext.lookup("jdbc/test");
}
return datasource;
}
/**
* 处理get方法
*/
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/**
* 处理post方法
*/
protected void doPost(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
Statement st;
StringBuffer buff = new StringBuffer("<html>");
try {
if (con != null) {
//简单查询,test表中有2列,id与name
buff.append("id");
buff.append(" ");
buff.append("name");
buff.append("
");
st = con.createStatement();
ResultSet rs = st.executeQuery("select * from test");
while (rs.next()) {
buff.append(rs.getString("id"));
buff.append(" ");
buff.append(rs.getString("name"));
buff.append("
");
}
}
buff.append("