JDBC 连接池用法

四、类DBConnectionManager 说明 

该类只能创建一个实例,其它对象能够调用其静态方法(也称为类方法)获得该唯一实例的引用。如031至036行所示,DBConnectionManager类的建构函数是私有的,这是为了避免其它对象创建该类的实例。 
DBConnectionManager类的客户程序可以调用getInstance()方法获得对该类唯一实例的引用。如018至029行所示,类的唯一实例在getInstance()方法第一次被调用期间创建,此后其引用就一直保存在静态变量instance中。每次调用getInstance()都增加一个DBConnectionManager的客户程序计数。即,该计数代表引用DBConnectionManager唯一实例的客户程序总数,它将被用于控制连接池的关闭操作。 
该类实例的初始化工作由146至168行之间的私有方法init()完成。其中 getResourceAsStream()方法用于定位并打开外部文件。外部文件的定位方法依赖于类装载器的实现。标准的本地类装载器查找操作总是开始于类文件所在路径,也能够搜索CLASSPATH中声明的路径。db.properties是一个属性文件,它包含定义连接池的键-值对。可供定义的公用属性如下: 

drivers 以空格分隔的JDBC驱动程序类列表 
logfile 日志文件的绝对路径 

其它的属性和特定连接池相关,其属性名字前应加上连接池名字: 

<poolname>.url 数据库的 JDBC URL 
<poolname>.maxconn 允许建立的最大连接数,0表示没有限制 
<poolname>.user 用于该连接池的数据库帐  
<poolname>.password 相应的密码 

其中url属性是必需的,而其它属性则是可选的。数据库帐 和密码必须合法。用于Windows平台的db.properties文件示例如下: 

drivers=sun.jdbc.odbc.JdbcOdbcDriver jdbc.idbDriver 
logfile=D:/user/src/java/DBConnectionManager/log.txt 

idb.url=jdbc:idb:c:/local/javawebserver1.1/db/db.prp 
idb.maxconn=2 

access.url=jdbc

注意在Windows路径中的反斜杠必须输入2个,这是由于属性文件中的反斜杠同时也是一个转义字符。 
init()方法在创建属性对象并读取db.properties文件之后,就开始检查logfile属性。如果属性文件中没有指定日志文件,则默认为当前目录下的DBConnectionManager.log文件。如日志文件无法使用,则向System.err输出日志记录。 
装载和注册所有在drivers属性中指定的JDBC驱动程序由170至192行之间的loadDrivers()方法实现。该方法先用StringTokenizer将drivers属性值分割为对应于驱动程序名称的字符串,然后依次装载这些类并创建其实例,最后在 DriverManager中注册该实例并把它加入到一个私有的向量drivers。向量drivers将用于关闭服务时从DriverManager取消所有JDBC 驱动程序的注册。 
init()方法的最后一个任务是调用私有方法createPools()创建连接池对象。如109至142行所示,createPools()方法先创建所有属性名字的枚举对象(即Enumeration对象,该对象可以想象为一个元素系列,逐次调用其nextElement()方法将顺序返回各元素),然后在其中搜索名字以“.url”结尾的属性。对于每一个符合条件的属性,先提取其连接池名字部分,进而读取所有属于该连接池的属性,最后创建连接池对象并把它保存在实例变量pools中。散列表(Hashtable类 )pools实现连接池名字到连接池对象之间的映射,此处以连接池名字为键,连接池对象为值。 
为便于客户程序从指定连接池获得可用连接或将连接返回给连接池,类DBConnectionManager提供了方法getConnection()和freeConnection()。所有这些方法都要求在参数中指定连接池名字,具体的连接获取或返回操作则调用对应的连接池对象完成。它们的实现分别在051至064行、066至080行、038至049行。 
如082至107行所示,为实现连接池的安全关闭,DBConnectionManager提供了方法release()。在上面我们已经提到,所有DBConnectionManager的客户程序都应该调用静态方法getInstance()以获得该管理器的引用,此调用将增加客户程序计数。客户程序在关闭时调用release()可以递减该计数。当最后一个客户程序调用release(),递减后的引用计数为0,就可以调用各个连接池的release()方法关闭所有连接了。管理类release()方法最后的任务是撤销所有JDBC驱动程序的注册。 

五、Servlet使用连接池示例 

Servlet API所定义的Servlet生命周期类如: 

1) 创建并初始化Servlet(init()方法)。 
2) 响应客户程序的服务请求(service()方法)。 
3) Servlet终止运行,释放所有资源(destroy()方法)。 

本例演示连接池应用,上述关键步骤中的相关操作为: 

1) 在init(),用实例变量connMgr 保存调用DBConnectionManager.getInstance()所返回的引用。 
2) 在service(),调用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(“不能获取数据库连接.”); 
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(“<H1>职工数据</H1>”); 
while (rs.next()) { 
out.println(“<BR>”); 
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(); 


—————————————————————————————————- 
Jsp连接数据库大全 

现在有好多初学jsp的 友经常会问数据库怎么连接啊,怎么老出错啊以我集中的在这写篇文章供大家参考,其实这种把数据库逻辑全部放在jsp里未必是好的做法,但是有利于初学者学习,所以我就这样做了,当大家学到一定程度的时候,可以考虑用MVC的模式开发。在练习这些代码的时候,你一定将jdbc的驱动程序放到服务器的类路径里,然后要在数据库里建一个表test,有两个字段比如为test1,test2,可以用下面SQL建 create table test(test1 varchar(20),test2 varchar(20),然后向这个表写入一条测试纪录,那么现在开始我们的jsp和数据库之旅吧。 
一、jsp连接Oracle8/8i/9i数据库(用thin模式) 
testoracle.jsp如下: 
<%@ page contentType=”text/html;charset=gb2312″%> 
<%@ page import=”java.sql.*”%> 
<html> 
<body> 
<%Class.forName(“oracle.jdbc.driver.OracleDriver”).newInstance(); 
String url=”jdbc

五、jsp连接Sybase数据库 
testmysql.jsp如下: 
<%@ page contentType=”text/html;charset=gb2312″%> 
<%@ page import=”java.sql.*”%> 
<html> 
<body> 
<%Class.forName(“com.sybase.jdbc.SybDriver”).newInstance(); 
String url =” jdbc:sybase:Tds:localhost:5007/tsdata”; 
//tsdata为你的数据库名 
Properties sysProps = System.getProperties(); 
SysProps.put(“user”,”userid”); 
SysProps.put(“password”,”user_password”); 
Connection conn= DriverManager.getConnection(url, SysProps); 
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
String sql=”select * from test”; 
ResultSet rs=stmt.executeQuery(sql); 
while(rs.next()) {%> 
您的第一个字段内容为:<%=rs.getString(1)%> 
您的第二个字段内容为:<%=rs.getString(2)%> 
<%}%> 
<%out.print(“数据库操作成功,恭喜你”);%> 
<%rs.close(); 
stmt.close(); 
conn.close(); 
%> 
</body> 
</html> 
六、jsp连接MySQL数据库 
testmysql.jsp如下: 
<%@ page contentType=”text/html;charset=gb2312″%> 
<%@ page import=”java.sql.*”%> 
<html> 
<body> 
<%Class.forName(“org.gjt.mm.mysql.Driver”).newInstance(); 
String url =”jdbc:mysql://localhost/softforumser=soft&password=soft1234&useUnicode=true&characterEncoding=8859_1″ 
//testDB为你的数据库名 
Connection conn= DriverManager.getConnection(url); 
Statement stmt=conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_UPDATABLE); 
String sql=”select * from test”; 
ResultSet rs=stmt.executeQuery(sql); 
while(rs.next()) {%> 
您的第一个字段内容为:<%=rs.getString(1)%> 
您的第二个字段内容为:<%=rs.getString(2)%> 
<%}%> 
<%out.print(“数据库操作成功,恭喜你”);%> 
<%rs.close(); 
stmt.close(); 
conn.close(); 
%> 
</body> 
</html> 
七、jsp连接PostgreSQL数据库 
testmysql.jsp如下: 
<%@ page contentType=”text/html;charset=gb2312″%> 
<%@ page import=”java.sql.*”%> 
<html> 
<body> 
<%Class.forName(“org.postgresql.Driver”).newInstance(); 
String url =”jdbc

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2013年6月20日
下一篇 2013年6月21日

相关推荐