例5:通过连接池获得连接

首先请根据我们在上面创建数据库连接的经验,来思考下列问题:

n 为什么需要连接池?

n 什么是PooledConnection?

n 初始化连接池

n 使用连接池

当使用DriverManager或者DataSource方法来获取数据库连接时,每个对新数据库连接的请求都会导致很大的开销。如果频繁地获取新的连接,将会影响性能问题。这在Web服务器端编程的时候尤为明显。请求一个新的Connection对象会带来大量的开销和很多潜在的错误。为了最小化开销,为什么在我们使用完数据库连接后不是重新使用它们,而是删除它们呢?JDBC设计者在创建接口ConnectionPoolDataSource时使用这种流行的设计模式,这允许您创建数据库连接池,其中的连接在关闭后可以重用,而不是删除。

PooledConnection是一个特殊类型的数据库连接,在关闭时不会被删除,不象常规的Connection对象(当常规的连接不再被使用时,垃圾收集器能删除它们)。相反,PooledConnection被缓存以备将来再次使用,从而可能带来大幅度的性能提升。使用数据库连接池几乎和使用DataSource对象一样。首先,不是创建一个实现DataSource接口的类的实例,而是创建了一个实现了ConnectionPoolDataSource接口的类的实例。可以像以前一样使用JNDI来绑定这个新的数据源到一个名称。要实际使用池化的数据源对象,调用ConnectionPooledDataSource(它接下来会建立数据库连接)上的getPooledConnection()得到一个PooledConnection对象。要创建将使用的Connection对象,调用PooledConnection对象(而不是以前的DriverManager或DataSource对象)上的getConnection().这种方法的一个额外的好处是,因为是自动处理,用ConnectionPool管理一定数量的数据库连接方便多了。如果你的客户机许可限制了能够同时连接到数据库的客户机的数目,这种自动化可能非常重要。

初始化连接池。下面的例子我们将使用SQLServer2000数据库和i-net软件的第三方驱动程序来创建PooledDataSource.所有与数据库相关的代码都包含在初始化或绑定过程中。

首先应该在classpath里面再指向名字为Merlia.jar的jar文件。

2,代码如下:

import com.inet.tds.PDataSource;
import java.util.Hashtable;
import javax.naming.*;
import com.microsoft.jdbcx.sqlserver.SQLServerDataSource;

public class JNDIofPooledDataSourceTest {
	public static void main(String[] args) {
		String serverName = "192.168.0.1";
		String databaseName = "mydb";
		String userName = "student";
		String password = "student";
		// 通过下面的名字可以获得一个池化的连接
		String filePath = "jdbcPool/mydatasource";
		int portNumber = 1433;
		int poolSize = 10; // We want to create a pool with 10 connections.

		Hashtable env = new Hashtable();
		env.put(Context.INITIAL_CONTEXT_FACTORY,
				"com.sun.jndi.fscontext.RefFSContextFactory");
		try {
			Context ctx = new InitialContext(env);
			// 创建一个池化的数据源对象
			PDataSource ds = new PDataSource();
			ds.setServerName(serverName);
			ds.setPortNumber(portNumber);
			ds.setDatabaseName(databaseName);
			ds.setUser(userName);
			ds.setPassword(password);
			ds.setDescription("i-Net PDataSource");
			ds.setMaxPoolSize(poolSize);
			// 绑定池化的数据源
			ctx.bind(filePath, ds);
			ctx.close();
			System.out.println("PooledDataSource Created Success!");
		} catch (Exception ex) {
			System.err.println("ERROR: " + ex.getMessage());
		}
	}
}

一旦初始化了PooledDataSource,就能够在Java应用程序中使用它来创建数据库连接池。请看下面的例子:

import java.util.Hashtable;
import javax.naming.*;
import java.sql.*;
import javax.sql.*;
import java.io.*;

public class UseJNDIOfPooledDataSource {
	public static void main(String[] args) {
		Connection con = null;	
		try {
			String filePath = "jdbcPool/mydatasource";
			Hashtable env = new Hashtable();
			env.put(Context.INITIAL_CONTEXT_FACTORY,
					"com.sun.jndi.fscontext.RefFSContextFactory");
			Context ctx = new InitialContext(env);
			// 通过JNDI获得池化的数据源
			ConnectionPoolDataSource ds = 
	(ConnectionPoolDataSource) ctx	.lookup(filePath);
			// 通过池化的数据源获得池化的连接
			PooledConnection pcon = ds.getPooledConnection();
			// 通过池化的连接获得连接
			con = pcon.getConnection();
			// 如果连接不成功,就会出现异常,不会执行下面这个语句
			System.out.println("connect success!");
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try {
				if (con != null)// 用完连接后,要关闭释放
					con.close();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值