数据源和连接池

数据源

  从接触DBMS开始就在用数据源(DataSource),它其中很重要的一个作用就是可以管理Connection,管理的方式也就是经常听到的ConnectionPool。它的管理其实就是对DriverManager获取Connection进行了包装。

  下面就首先看看用DataSource来取代DriverManager来获取Connection的好处:

  一般DataSource内部会用一个连接池来缓存Connection,这样获得Connection速度很快,可以大幅度提高数据库的访问速度;通过它获得的Connection都是已经被包裹过的(不是驱动原来的连接),他的close方法已经被修改(并不是真正的关闭)。我们只需和DataSource打交道,不会直接访问连接池。

连接池

  前面博客讲了,操作数据库的一般步骤:

   1.注册驱动

   2.建立连接

   3.创建执行sql语句的对象

   4.执行语句

   5.处理执行结果

   6.释放资源

  上面的过程其实就是客户端与DB服务器交互的过程。这个过程就像两个人隔着一条河想要交流一样,其中最费时间的莫过于属搭桥的过程了。上面第二步“建立连接”的过程也就是搭桥的过程了。

  所以,创建Connection就相当于建一座桥,是数据库操作中最耗时的。所以用完以后就关掉是很浪费的。现在,创建完以后将它放到集合中(arrayList或linkList),用的时候从集合中取,用完了还放回集合中,这样连接就可以复用了。就是用一个集合容器来缓存Connection对象。

  上面说的集合其实就是连接池了,连接池可以理解成一个能够存放Connection的Collection,有两种形式,即arrayList或linkList。arrayList实际为一个数组,访问速度很快;linkList为一个链表,增、删速度比较快。而连接池中的Connection需要频繁的增删,所以采用linkList来作为Connection对象的容器集合。

  下面就用代码模拟一个DataSource内部的连接池:

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.util.LinkedList;

/**
 * @author-zhipeng
 */
public class MyDataSource {
	private static String url = "jdbc:mysql://localhost:3306/jdbc";
	private static String user = "root";
	private static String password = "";

	private static int initCount = 5;
	private static int maxCount = 10;
	private int currentCount = 0;

	//创建一个LinkedList作为Connection的容器
	LinkedList<Connection> connectionsPool = new LinkedList<Connection>();
	//初始,创建5个Connection对象放到LinkedList中,用的时候从链表头部取,不用了放到尾部
	public MyDataSource() {
		try {
			for (int i = 0; i < initCount; i++) {
				this.connectionsPool.addLast(this.createConnection());
				this.currentCount++;
			}
		} catch (SQLException e) {
			throw new ExceptionInInitializerError(e);
		}
	}

	//创建连接时就调用这个方法--从Connection链表容器头部取一个
	public Connection getConnection() throws SQLException {
		//枷锁-针对并发操作
		synchronized (connectionsPool) {
			//如果连接池(实际为LinkList)中还有Connection对象则取出一个
			if (this.connectionsPool.size() > 0)
				return this.connectionsPool.removeFirst();
			//如果连接池没有(初始为5个)Connection对象,而请求连接数小于最大连接数,则创建一个新的Connection
			if (this.currentCount < maxCount) {
				this.currentCount++;
				return this.createConnection();
			}
			//否则抛出异常,超过最大连接数,没有连接可用
			throw new SQLException("已没有链接");
		}
	}
	//关闭连接时就调用这个方法--不是真正的释放连接,而是放到从Connection链表容器的尾部
	public void free(Connection conn) {
		this.connectionsPool.addLast(conn);
	}
	//创建Connection的根代码
	private Connection createConnection() throws SQLException {
		return DriverManager.getConnection(url, user, password);
	}
}

  从上面的代码实现可知,如果超过Connection Pool的最大连接数(10个)则必然会因没有连接可以使用而抛异常,下面就用代码实验一下:

/**
 * @author-zhipeng
 */
public class TestConnectionPool {

	private static DataSource myDataSource = null;
	/**
	 * 循环创建11个Connection,期间都不释放(关闭)
	 */
	public static void main(String[] args) throws Exception {

		for (int i = 0; i < 11; i++) {
			Connection conn = myDataSource.getConnection();
			System.out.println(conn);
			//JdbcUtils.free(null, null, conn);
		}
	}
}

  然后运行,就会发现,当创建第11个的时候就会抛出异常:

  这也验证了我们上面的实现。当然还可以进行一系列其它的测试,比如创建五个再释放一个,然后再创建一个,这是你就会发现,Connection Pool的“队列”结构。

总结

  上面简单介绍了DataSource,和Connection Pool,并用代码简单模拟了它的原理。这也是对旧知识的温习和加深理解的过程吧。

数据源和连接池,布布扣,bubuko.com

时间: 2024-12-10 22:57:07

数据源和连接池的相关文章

JDBC数据源和连接池

数据库连接池就是在应用程序启动时就创建足够多的数据库连接池,在java程序中需要访问 数据库时就可以通过数据源取得一个空闲连接,用完在返还到连接池中 实例: 在Tomcat6.0中+MySQL5.5数据源和连接池的配置 (1)将数据库的JDBC驱动程序复制到<CATALINA_HOME>/common/lib目录下 (2)在<CATALINA_HOME>/conf/server.xml中配置数据源和连接池,例如 <Context path="/JSP_JDBC&qu

Tomcat中配置数据源和连接池

(1)为什么需要配置数据源和连接池? 我们知道在每次java程序俩接数据库的时候我们都需要请求连接数据库然后打开读取数据然后关闭, 这样使得每一个用户访问的时候都需要服务器做出相应,这样的话服务器端承受巨大的压力,如此效率就会下降, 为了解决这个问题我们可以让数据库提前打开连接等待用户连接当有用户连接的时候,就把数据库已存在的连接 给用户即可 而我们就把这条连接叫做"连接池"  当连接池中的连接足够的话 就分给用户,如果不够用户则在"|队列池"中等待: (2)实现过

数据源和连接池介绍

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

Tomcat中设置数据源和连接池

对于大型网站来说,信息查询的次数会非常多,每次查询都需要这样的过程:加载驱动程序.创建连接.创建语句对象.执行SQL语句.关闭这些对象.这样使得每一个用户访问的时候都需要服务器做出相应,这样的话服务器端承受巨大的压力,如此效率就会下降,建立与数据库之间的连接和释放连接会占用很多系统的时间.如果能够让所有用户共享连接,仅仅创建一次连接,谁需要连接谁就使用,这样可以大大减少创建连接所占用的时间.让所有用户共享连接,并且在需要的时候就能够使用,就需要有专门的机制来创建连接,数据库连接池(Dababas

【数据库学习笔记】(4)JDBC数据源和连接池

数据源和数据库连接池

Java中的数据源就是javax.sql.DataSource.DataSource的创建可以有不同的实现.DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池. JNDI方式创建DataSource: (Java Naming and Directory Interface,Java命名和目录接口).首先要配置数据源的相关连接信息,也就是数据源连接池.该配置应该在Tomcat安装目录下的conf/context.xml文件中

数据源于与连接池

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

JDBC五数据源和数据池(web基础学习笔记十一)

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

eclipse下jdbc数据源与连接池的配置及功能简介

今天在做四则运算网页版的时候遇到了一个困惑,由于需要把每个产生的式子存进 数据库,所以就需要很多次重复的加载驱动,建立连接等操作,这样一方面写程序不方便,加大了程序量,另一方面,还有导致数据库的性能急剧下降,那么怎么解决这个问题呢? 我所学到的方法就是通过JDBC数据源和连接池的方式来解决这个问题.利用DataSource来建立数据库的连接不需要加载JDBC驱动,也不需要DriverManager类,通过向一个JNDI服务器查询来得到DataSource对象,然后调用DataSource对象的g