现在我们结合DBConnetionManager和DBConnectionPool类来讲解servlet中连接池的使用:
一、首先简单介绍一下Servlet的生命周期:
Servlet API定义的servlet生命周期如下:
1、 Servlet 被创建然后初始化(init()方法)。
2、 为0个或多个客户调用提供服务(service()方法)。
3、 Servlet被销毁,内存被回收(destroy()方法)。
二、servlet中使用连接池的实例
使用连接池的servlet有三个阶段的典型表现是:
1. 在init()中,调用DBConnectionManager.getInstance()然后将返回的引用保存在实例变量中。
2. 在sevice()中,调用getConnection(),执行一系列数据库操作,然后调用freeConnection()归还连接。
3. 在destroy()中,调用release()来释放所有的资源,并关闭所有的连接。
下面的例子演示如何使用连接池。
import java.io.*;
import java.sql.*;
import javax.servlet.*;
import javax.servlet.http.*;
public class TestServlet extends HttpServlet {
private DBConnectionManager connMgr;
public void init(ServletConfig conf) throws ServletException {
super.init(conf);
connMgr = DBConnectionManager.getInstance();
}
public void service(HttpServletRequest req, HttpServletResponse res)
throws IOException {
res.setContentType("text/html");
PrintWriter out = res.getWriter();
Connection con = connMgr.getConnection("idb");
if (con == null) {
out.println("Cant get connection");
return;
}
ResultSet rs = null;
ResultSetMetaData md = null;
Statement stmt = null;
try {
stmt = con.createStatement();
rs = stmt.executeQuery("SELECT * FROM EMPLOYEE");
md = rs.getMetaData();
out.println(" Employee data");
while (rs.next()) {
out.println("
");
for (int i = 1; i < md.getColumnCount(); i++) {
out.print(rs.getString(i) + ", ");
}
}
stmt.close();
rs.close();
}
catch (SQLException e) {
e.printStackTrace(out);
}
connMgr.freeConnection("idb", con);
}
public void destroy() {
connMgr.release();
super.destroy();
}
}