连接池的概念和初步代码

连接池的概念 

1)连接池是一个进程

  多个连接是在一个进程里面存储、管理的。这个进程保存所有的连接,当我们打开连接,如果有未用连接可用,则返回该连接。如果池中的连接都用完了,则创建一个新的连接保存到连接池。而但我们关闭连接的时候,连接池里面并不关闭连接,而是返回连接池中并标记为可重用的状态,等待重新连接直到等待超时。再次打开连接的时候,我们就可以重用上次的连接。如果在这个时间内没有连接请求(打开连接),这个数据库连接将被关闭,并从连接池中移除这个连接实例。如果池中连接到达了最大连接数,请求进入等待队列直到空闲连接可用。如果在可获取连接对象之前超时期限已过(由 Connect Timeout 连接字符串属性来决定),则将出错。

2)该进程保存连接并使其处于活动状态,使连接可以被重复使用

  应用程序访问底层的数据源的时候是通过OS的数据访问组件或者说Sql Client数据访问提供程序进行访问的。都是通过系统提供的组件去访问数据库服务器的数据库的。连接是通过这些组件建立的,连接池是在这些组件之上的,它存在于应用程序的进程里面。因此需要重用连接,就是在这一个进程里面重用。例如:两个WinForm程序在不同的计算机上,他们同时连接一个数据库服务器,这个时候,连接池就没办法起作用,因为连接池是一个进程里面。这时候,我们可以在数据库服务器上层搭建一个Web Service,而Web Service 和数据库服务器之间使用的是连接池,数据库服务器的压力就会小。

如果没有连接池

1)连接到数据源

– 建立物理通道(例如套接字或命名管道)

– 与服务器进行初次握手

– 分析连接字符串信息

– 由服务器对连接进行身份验证

– 运行检查以便在当前事务中登记(连接的环境是不是分布式事务)

另:不仅是连接池,还有使用的比较多的对象,我们也可以将之放在对象池,以便下次使用。

连接池的作用 

1)通过数据库连接池,应用程序可以重用池中现有的连接中现有的连接,而不必反复与数据库建立新的连接。

2)使用连接池可显著提高应用程序的可伸缩,因为有限数量的数据库连接可以为数量大得多的客户端提供服务。例如:数据库应用里面,上万的用户可能只需要少量的连接,因为客户端不可能同时并发的大量的访问数据库。故少量的连接可以支持大量的服务,提高程序的可伸缩性。

3)同时,由于可以节省建立新连接所需的大由于可以节省建立新连接所需的大量时间,使用连接池还能够改善性能。

4)连接池对于应用程序来说是透明的,例如:conn.Open() 和 conn.Close()。

连接池的的初步代码

package pool;

import java.io.FileInputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.Properties;
import java.util.Vector;
/**
 * 连接池
 * @author
 *
 */
public class ConnectionPool {

	//私有属性driver名称
	private String driverClassName;
	//私有属性url
	private String url;
	//私有属性username
	private String username;
	//私有属性password
	private String password;
	//私有属性线程安全集合对象Vector
	private Vector<Connection> pool;

	/**
	 *连接池的大小,也就是连接池中有多少个数据库连接。
	 */
	private int poolSize = 1;

	/**
	 * 单例模式(懒汉模式)
	 */
	private static ConnectionPool instance = null;

	/**
	 * 私有的构造方法,禁止从外部创建本类的对象,要想获得本类的对象,通过<code>getInstance()<code>方法。
	 * 使用了设计模式中的(单例模式)
	 */
	private ConnectionPool() {
		init();
	}

	/**
	 * 连接池初始化方法,读取属性文件的内容,建立连接池中的初始连接。
	 */
	private void init() {
		pool = new Vector<Connection>(poolSize);
		readConfig();
		addConnection();
	}

	/**
	 * 返回连接到连接池中
	 */
	public synchronized void release(Connection conn) {
		pool.add(conn);
	}

	/**
	 * 关闭连接池中的所有数据库连接
	 */
	public synchronized void closePool() {
		for (int i = 0; i < pool.size(); i++) {
			try {
				pool.get(i).close();
			} catch (SQLException e) {
				e.printStackTrace();
			}
			pool.remove(i);
		}
	}

	/**
	 * 返回当前连接池的一个对象
	 */
	public static ConnectionPool getInstance() {
		//循环条件下,从连接池内拿走一个连接,连接池内就少一个连接
		if (instance == null) {
			instance = new ConnectionPool();
		}
		return instance;
	}

	/**
	 * 返回连接池中的一个数据库连接
	 */
	public synchronized Connection getConnection() {
		if (pool.size() > 0) {
			Connection conn = pool.get(0);
			pool.remove(conn);
			return conn;
		} else {
			return null;
		}
	}

	/**
	 * 在连接池中创建初始设置的数据库连接
	 */
	private void addConnection() {
		Connection conn = null;
		//循环创建poolsize个连接对象
		for (int i = 0; i < poolSize; i++) {

			try {
				//加载类驱动
				Class.forName(driverClassName);
				//驱动程序连接数据库
				conn = DriverManager.getConnection(url, username, password);
				//将创建的连接对象放进池中
				pool.add(conn);
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	/**
	 * 读取设置连接池的属性文件
	 */
	private void readConfig() {
		try {
			//读取路径并加载路径
			String path = System.getProperty("user.dir") + "\\dbpool.properties";
			FileInputStream is = new FileInputStream(path);
			Properties props = new Properties();
			props.load(is);

			//将文件内的内容加载到属性中
			this.driverClassName = props.getProperty("driverClassName");
			this.username = props.getProperty("username");
			this.password = props.getProperty("password");
			this.url = props.getProperty("url");
			this.poolSize = Integer.parseInt(props.getProperty("poolSize"));
		} catch (Exception e) {
			e.printStackTrace();
			System.out.println("读取属性文件出错!");
		}
	}

}

  

时间: 2024-10-10 07:54:43

连接池的概念和初步代码的相关文章

连接池的概念

连接池的概念  1)连接池是一个进程 多个连接是在一个进程里面存储.管理的.这个进程保存所有的连接,当我们打开连接,如果有未用连接可用,则返回该连接.如果池中的连接都用完了,则创建一个新的连接保存到连接池.而但我们关闭连接的时候,连接池里面并不关闭连接,而是返回连接池中并标记为可重用的状态,等待重新连接直到等待超时.再次打开连接的时候,我们就可以重用上次的连接.如果在这个时间内没有连接请求(打开连接),这个数据库连接将被关闭,并从连接池中移除这个连接实例.如果池中连接到达了最大连接数,请求进入等

Http请求连接池 - HttpClient 的 PoolingHttpClientConnectionManager

两个主机建立连接的过程是非常复杂的一个过程,涉及到多个数据包的交换,而且也非常耗时间.Http连接须要的三次握手开销非常大,这一开销对于比較小的http消息来说更大.但是假设我们直接使用已经建立好的http连接.这样花费就比較小.吞吐率更大. 传统的HttpURLConnection并不支持连接池.假设要实现连接池的机制,还须要自己来管理连接对象.对于网络请求这种底层相对复杂的操作.个人以为假设有可用的其它方案,也没有必要自己去管理连接对象. 除了HttpURLConnection,大家肯定还知

连接池

一.为什么会产生连接池? 我们现在考虑: 程序中连接为什么要来管理?因为连接资源宝贵,所以我们要来对连接资源进行管理 如何高效的来进行管理?频繁的连接,打开.关闭,这会严重影响程序的运行效率!所以我们引入连接池的概念. 二.何为连接池? 普通的连接: 操作数据库,创建连接. 操作结束,关闭! 使用连接池管理: 预先创建一组连接,有的时候每次取出一个. 用完后,放回. 连接池就好比图书馆,我们想要看书去借阅,看完之后我们要归还.就是借与还的关系. 三.学习连接池 3.1.自定义连接池 /* * *

数据源于与连接池

为什么使用数据源和连接池 我们现在开发的应用程序,基本上都是基于数据的,而且是需要频繁的连接数据库的.如果每次操作都连接数据库,然后关闭,这样做性能一定会受限.所以,我们一定要想办法复用数据库的连接.因此针对这种情况,提出了数据源和连接池的概念.使用数据源和连接池可以达到复用数据库连接的目的. 数据源和连接池概念 其实,数据源和连接池是两个不同的概念.有些人会把它们弄混.数据源是用来连接数据库,获得Connection 对象的,在Java 中使用javax.sql.DataSource接口来表示

jdbc基础 (五) 连接池与数据源 DBCP以及C3P0的使用

一.连接池的概念和使用 在实际应用开发中,特别是在WEB应用系统中,如果JSP.Servlet或EJB使用JDBC直接访问数据库中的数据,每一次数据访问请求都必须经历建立数据库连接.打开数据库.存取数据和关闭数据库连接等步骤,而连接并打开数据库是一件既消耗资源又费时的工作,如果频繁发生这种数据库操作,系统的性能必然会急剧下降,甚至会导致系统崩溃.数据库连接池技术是解决这个问题最常用的方法. 数据库连接池的主要操作如下: (1)建立数据库连接池对象. (2)按照事先指定的参数创建初始数量的数据库连

HttpClient 基于连接池的使用

场景:调用外部系统接口的http请求 要求: 1:可能是http请求,也可能是https请求 2:需要加入连接池的概念,不能每次发起请求都新建一个连接(每次连接握手三次,效率太低) 准备使用httpclient 4.5的版本 HTTPClient的特性 1. 基于标准.纯净的Java语言.实现了Http1.0和Http1.1 2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE). 3. 支持HT

数据源和连接池介绍

为什么使用数据源和连接池 我们现在开发的应用程序,基本上都是基于数据的,而且是需要频繁的连接数据库的.如果每次操作都连接数据库,然后关闭,这样做性能一定会受限.所以,我们一定要想办法复用数据库的连接.因此针对这种情况,提出了数据源和连接池的概念.使用数据源和连接池可以达到复用数据库连接的目的. 数据源和连接池概念 其实,数据源和连接池是两个不同的概念.有些人会把它们弄混. 数据源是用来连接数据库 获得Connection对象的,在Java中使用javax.sql.DataSource接口来表示.

java自定义连接池

1.java自定义连接池 1.1连接池的概念: 实际开发中"获取连接"或"释放资源"是非常消耗系统资源的两个过程,为了姐姐此类性能问题,通常情况我们采用连接池技术来贡献连接Connection 用池来管理Connection,这样可以重复使用Connection,有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象,当使用完Connection后,调用Connection的close()方法也不会真的关闭Connection

最近学习了Http连接池

起因 6.1大促值班发现的一个问题,一个rpc接口在0~2点用户下单高峰的时候表现rt高(超过1s,实际上针对性优化过的接口rt超过这个值也是有问题的,通常rpc接口里面即使逻辑复杂,300ms应该也搞定了),可以理解,但是在4~5点的时候接口的tps已经不高了,耗时依然在600ms~700ms之间就不能理解了. 查了一下,里面有段调用支付宝http接口的逻辑,但是每次都new一个HttpClient出来发起调用,调用时长大概在300ms+,所以导致即使在非高峰期接口耗时依然非常高. 问题不难,