Servlet中jdbc应用高级篇(三)

DBConnectionPool类代表一个由url标识的数据库连接池。前面,我们已经提到,jdbc的url由三个部分组成:协议标识(总是jdbc),子协议标识(例如,odbc.oracle),和数据库标识(跟特定的数据库有关)。连接池也具有一个名字,供客户程序引用。另外,连接池还有一个用户名,一个密码和一个最大允许连接数。如果web应用允许所有的用户使用某些数据库操作,而另一些操作是有限制的,则可以创建两个连接池,具有同样的url,不同的user name和password,分别处理两类不同的操作权限。现把DBConnectionPool详细介绍如下:

  一、DBConnectionPool的构造

  构造函数取得上述的所有参数:

public DBConnectionPool(String name, String URL, String user,

String password, int maxConn) {

this.name = name;

this.URL = URL;

this.user = user;

this.password = password;

this.maxConn = maxConn;

}

  将所有的参数保存在实例变量中。

  二、从池中打开一个连接

  DBConnectionPool提供两种方法来检查连接。两种方法都返回一个可用的连接,如果没有多余的连接,则创建一个新的连接。如果最大连接数已经达到,第一个方法返回null,第二个方法则等待一个连接被其他进程释放。

public synchronized Connection getConnection() {

Connection con = null;

if (freeConnections.size() > 0) {

// Pick the first Connection in the Vector

// to get round-robin usage

con = (Connection) freeConnections.firstElement();

freeConnections.removeElementAt(0);

try {

if (con.isClosed()) {

log("Removed bad connection from " + name);

// Try again recursively

con = getConnection();

}

}

catch (SQLException e) {

log("Removed bad connection from " + name);

// Try again recursively

con = getConnection();

}

}

else if (maxConn == 0 || checkedOut < maxConn) {

con = newConnection();

}

if (con != null) {

checkedOut++;

}

return con;

}

  所有空闲的连接对象保存在一个叫freeConnections 的Vector中。如果存在至少一个空闲的连接,getConnection()返回其中第一个连接。下面,将会看到,进程释放的连接返回到freeConnections的末尾。这样,最大限度地避免了数据库因一个连接不活动而意外将其关闭的风险。

  再返回客户之前,isClosed()检查连接是否有效。如果连接被关闭了,或者一个错误发生,该方法递归调用取得另一个连接。

  如果没有可用的连接,该方法检查是否最大连接数被设置为0表示无限连接数,或者达到了最大连接数。如果可以创建新的连接,则创建一个新的连接。否则,返回null。

  方法newConnection()用来创建一个新的连接。这是一个私有方法,基于用户名和密码来确定是否可以创建新的连接。

private Connection newConnection() {

Connection con = null;

try {

if (user == null) {

con = DriverManager.getConnection(URL);

}

else {

con = DriverManager.getConnection(URL, user, password);

}

log("Created a new connection in pool " + name);

}

catch (SQLException e) {

log(e, "Can not create a new connection for " + URL);

return null;

}

return con;

}

  jdbc的DriverManager提供一系列的getConnection()方法,可以使用url和用户名,密码等参数创建一个连接。

时间: 2024-11-02 00:48:16

Servlet中jdbc应用高级篇(三)的相关文章

Servlet中jdbc应用高级篇

servlet|高级  JDBC使用数据库URL来说明数据库驱动程序.数据库URL类似于通用的URL,但SUN 在定义时作了一点简化,其语法如下: Jdbc::[node]/[database] 其中子协议(subprotocal)定义驱动程序类型,node提供网络数据库的位置和端口号,后面跟可选的参数.例如: String url="jdbc:inetdae:myserver:1433?language=us-english&sql7=true" 表示采用inetdae驱动程

Servlet中jdbc应用高级篇(二)

一个动态的网站频繁地从数据库中取得数据来构成html页面.每一次请求一个页面都会发生数据库操作.但连接数据库却是一个需要消耗大量时间的工作,因为请求连接需要建立通讯,分配资源,进行权限认证.这些工作很少能在一两秒内完成.所以,建立一个连接,然后再后续的查询中都使用此连接会大大地提高性能.因为servlet可以在不同的请求间保持状态,因此采用数据库连接池是一个直接的解决方案. Servlet在服务器的进程空间中驻留,可以方便而持久地维护数据库连接.接下来,我们介绍一个完整的连接池的实现.在实现中,

Servlet中jdbc应用高级篇(五)

现在我们结合DBConnetionManager和DBConnectionPool类来讲解servlet中连接池的使用: 一.首先简单介绍一下Servlet的生命周期: Servlet API定义的servlet生命周期如下: 1. Servlet 被创建然后初始化(init()方法). 2. 为0个或多个客户调用提供服务(service()方法). 3. Servlet被销毁,内存被回收(destroy()方法). 二.servlet中使用连接池的实例 使用连接池的servlet有三个阶段的典

Servlet中jdbc应用高级篇(四)

DBConnetionManager的构造函数是私有函数,以避免其他类创建其实例. private DBConnectionManager() { init(); } DBConnetionManager的客户调用getInstance()方法来得到该类的单一实例的引用. static synchronized public DBConnectionManager getInstance() { if (instance == null) { instance = new DBConnectio

Servlet中jdbc应用高级篇(一)

JDBC使用数据库URL来说明数据库驱动程序.数据库URL类似于通用的URL,但SUN 在定义时作了一点简化,其语法如下: Jdbc::[node]/[database] 其中子协议(subprotocal)定义驱动程序类型,node提供网络数据库的位置和端口号,后面跟可选的参数.例如: String url="jdbc:inetdae:myserver:1433?language=us-english&sql7=true" 表示采用inetdae驱动程序连接1433端口上的m

[WebKit] JavaScriptCore解析--高级篇(三) Register Allocation &amp;amp; Trampoline

Register Allocation 对于一个JIT而言,寄存器分配对系统的消耗通常是一个瓶径.之前有Graph Coloring Allocators, Chaitin style等分配方式,现在要介绍的是DFG JIT使用的Linear Scan算法.其基本工作方式是将占用寄存器的变量根据生命周期长短排列出来,在使用时查看可以回收哪些寄存器加以利用. 先看一些定义: •Live interval:是某个变量可以存活的一个指令序列,也可以称为了连续性.这个也依赖于算法使用的是深度优先还是广度

Servlet开发中JDBC的高级应用

servlet|高级 连结数据库 JDBC使用数据库URL来说明数据库驱动程序.数据库URL类似于通用的URL,但SUN 在定义时作了一点简化,其语法如下: Jdbc::[node]/[database] 其中子协议(subprotocal)定义驱动程序类型,node提供网络数据库的位置和端口号,后面跟可选的参数.例如: String url="jdbc:inetdae:myserver:1433?language=us-english&sql7=true" 表示采用inetd

c#扩展方法奇思妙用高级篇三:Enumerable.Cast&amp;lt;T&amp;gt;应用

Enumerable.Cast<T>用于将IEnumerable转换为泛型版本IEnumerable<T>.转换后可尽情享用Enumerable的其它方法(如Where.Select),给我们的编码带来极大便利. 但MSDN中仅给出一个转换ArrayList的例子,很多人看了感觉现在都在用List<T>,还有谁会用ArrayList,Cast<T>没多少用处,除非处理一些之前遗留的一些代码. 其实Cast<T>并非如此简单,它可以用在很多地方.

[WebKit] JavaScriptCore解析--高级篇(二) 类型推导(Type Inference)

类型推导是DFG JIT最重要的一个基础,WebKit官网对此做了一点解释,翻译如下做为学习参考. Type inference通过profiling values来做到的,先是预测对哪些类型操作进行分析,再添加类型检查,最后基于类型检查的结果建立类型统计数据. 用下面的例子来说明这个过程: o.x * o.x + o.y * o.y 其中o是一个对象,x和y是它的属性,它们不是访问器(accessor),只是一般的属性.我们也可以说这两个属性值会返回double类型数值,但也有时会返回整型数据