博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
例5:通过连接池获得连接
阅读量:3673 次
发布时间:2019-05-21

本文共 3158 字,大约阅读时间需要 10 分钟。

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

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();			}		}	}}

转载地址:http://tzpbn.baihongyu.com/

你可能感兴趣的文章
【hadoop】关于HDFS的四大机制与两大核心
查看>>
【hadoop】yarn资源调度
查看>>
linux下sed 和 awk用法
查看>>
虚函数的底层调用过程
查看>>
【STL源码分析】vector
查看>>
【STL源码分析】deque
查看>>
【STL源码分析】map
查看>>
CTFShow-web入门WriteUp(长期更新)
查看>>
浅谈ERP的核心管理思想
查看>>
构筑完美软件开发流程,解决一切细节问题
查看>>
小APP里的大学问:APP开发流程全面详解
查看>>
MES系统与工业4.0: 概念和现实的有机融合
查看>>
软件开发的8大主流方法介绍
查看>>
WMS智能仓储系统与电商仓储成长史
查看>>
云ERP系统值得采用吗?
查看>>
面向未来的MES系统和大数据
查看>>
如何才能开发出一款好软件?
查看>>
企业有必要拥有自己的APP吗?
查看>>
WMS、ERP、进存销软件,三者到底有什么区别?
查看>>
为了ERP系统能够更好的在企业实施,企业领导应该做些什么?
查看>>