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

原创 2012年03月21日 10:42:39

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

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


Spring框架中获取连接池的四种方式

1、连接池概述  数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标。数据库连接池正...
  • eff666
  • eff666
  • 2017年02月28日 20:28
  • 2499

使用数据库连接池获取JDBC数据库

为什么必须使用数据库连接池:   1.普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接时都要将Connection加载到内存中,再验证用户名和密码。需要数据库连接...
  • caidie_huang
  • caidie_huang
  • 2016年09月23日 16:23
  • 1938

【Elasticsearch】Java Client连接池

按照Elasticsearch API,在Java端使用是ES服务需要创建Java Client,但是每一次连接都实例化一个client,对系统的消耗很大,即使在使用完毕之后将client close...
  • u011404265
  • u011404265
  • 2016年05月05日 13:22
  • 11326

javaweb连接池总结

数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。...
  • w112736112736
  • w112736112736
  • 2017年10月28日 14:12
  • 87

JDBC ConnectionManager类,从连接池获取Connection,释放资源等功能

package com.bjpowernode.drp.util; import java.sql.Connection; import java.sql.ResultSet; import...
  • seeds_home
  • seeds_home
  • 2011年11月23日 08:44
  • 1700

连接池详解

对于共享资源,有一个很著名的设计模式:资源池(Resource Pool)。该模式正是为了解决资源的频繁分配﹑释放所造成的问题。为解决我们的问题,可以采用数据库连接池技术。数据库连接池的基本思想就是为...
  • u012152619
  • u012152619
  • 2015年06月01日 08:35
  • 3081

四个流行的java连接池之DBCP篇

四个流行的java连接池之DBCP篇
  • zmycoco2
  • zmycoco2
  • 2013年09月03日 09:23
  • 3384

Java Web 创建和使用数据连接池

确定MySQL数据库服务开启后,创建对应的数据库,导入对应的connector到工程.我这里创建数据库的叫user. 1.在WebRoot/META-INF/下创建或更改context.xml,添加代...
  • lc0817
  • lc0817
  • 2015年05月04日 21:38
  • 1402

Java连接池详解

http://www.javaweb1024.com/java/JavaWebzhongji/2015/06/01/736.html 对于共享资源,有一个很著名的设计模式:资源池(Resou...
  • fangquan1980
  • fangquan1980
  • 2016年09月04日 05:31
  • 18583

使用数据库连接池获取JDBC数据库

为什么必须使用数据库连接池:   1.普通的JDBC数据库连接使用DriverManager来获取,每次向数据库建立连接时都要将Connection加载到内存中,再验证用户名和密码。需要数据库连接...
  • caidie_huang
  • caidie_huang
  • 2016年09月23日 16:23
  • 1938
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:例5:通过连接池获得连接
举报原因:
原因补充:

(最多只允许输入30个字)