JDBC--数据库链接池

1、数据库链接池

(1)JDBC数据库链接池的必要性

在使用开发基于数据库的web程序时,传统的模式基本是按如下步骤:  java

  • 在主程序(如servlet、beans)中创建数据库链接。
  • 进行sql操做
  • 断开数据库链接。

这种模式开发,存在的问题:mysql

  • 普通的JDBC数据库链接使用 DriverManager 来获取,每次向数据库创建链接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。须要数据库链接的时候,就向数据库要求一个,执行完成后再断开链接。这样的方式将会消耗大量的资源和时间。数据库的链接资源并无获得很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库链接操做将占用不少的系统资源,严重的甚至会形成服务器的崩溃。
  • 对于每一次数据库链接,使用完后都得断开。不然,若是程序出现异常而未能关闭,将会致使数据库系统中的内存泄漏,最终将致使重启数据库。
  • 这种开发不能控制被建立的链接对象数,系统资源会被毫无顾及的分配出去,如链接过多,也可能致使内存泄漏,服务器崩溃。

(2)数据库链接池(connection pool)

  • 基本思想是为数据库链接创建一个“缓冲池”。预先在缓冲池中放入必定数量的链接,当须要创建数据库链接时,只需从“缓冲池”中取出一个,使用完毕以后再放回去。
  • 数据库链接池负责分配、管理和释放数据库链接,它容许应用程序重复使用一个现有的数据库链接,而不是从新创建一个。
  • 数据库链接池在初始化时将建立必定数量的数据库链接放到链接池中,这些数据库链接的数量是由最小数据库链接数来设定的。不管这些数据库链接是否被使用,链接池都将一直保证至少拥有这么多的链接数量。链接池的最大数据库链接数量限定了这个链接池能占有的最大链接数,当应用程序向链接池请求的链接数超过最大链接数量时,这些请求将被加入到等待队列中。

(3)数据库链接池的工做原理 

(4)数据库链接池技术的优势

  • 资源重用:因为数据库链接得以重用,避免了频繁建立,释放链接引发的大量性能开销。在减小系统消耗的基础上,另外一方面也增长了系统运行环境的平稳性。
  • 更快的系统反应速度:数据库链接池在初始化过程当中,每每已经建立了若干数据库链接置于链接池中备用。此时链接的初始化工做均已完成。对于业务请求处理而言,直接利用现有可用链接,避免了数据库链接初始化和释放过程的时间开销,从而减小了系统的响应时间
  • 新的资源分配手段:对于多应用共享同一数据库的系统而言,可在应用层经过数据库链接池的配置,实现某一应用最大可用数据库链接数的限制,避免某一应用独占全部的数据库资源
  • 统一的链接管理,避免数据库链接泄露:在较为完善的数据库链接池实现中,可根据预先的占用超时设定,强制回收被占用链接,从而避免了常规数据库链接操做中可能出现的资源泄露

(5)开源的数据库链接池

JDBC 的数据库链接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口一般由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:web

  • DBCP 数据库链接池
  • C3P0 数据库链接池

DataSource 一般被称为数据源,它包含链接池和链接池管理两个部分,习惯上也常常把 DataSource 称为链接池.sql

 2、DBCP 数据库链接池

(1)基本用法数据库

/**
     * 使用 DBCP数据库链接池
     * 1.加入jar包:
     *   commons-dbcp2-2.1.1.jar
     *   commons-pool2-2.4.2.jar
     * 2.建立数据库链接
     * 3.为数据源实例指定必需的属性
     * 4.从数据源中获取数据库链接
     * @throws SQLException
     */
    @Test
    public void test17() throws SQLException {
        BasicDataSource dataSource = null;
        //1.建立DBPC数据源实例
        dataSource = new BasicDataSource();

        //2.为数据源实例指定必需的属性
        dataSource.setUsername("root");
        dataSource.setPassword("12345");
        dataSource.setUrl("jdbc:mysql://localhost:3306/jdbctest");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");

        //3.指定数据库的一些可选属性
        //3.1 指定数据库链接池初始化链接数的个数
        dataSource.setInitialSize(10);
        //3.2 指定最大链接数,同一时间能够同时向数据库申请的链接数
        dataSource.setMaxTotal(50);
        //3.3 其余...

        //3.从数据源中获取数据库链接
        Connection connection = dataSource.getConnection();
        System.out.println(connection.getClass());
    }

(2)更好的使用方法服务器

/**
     * 1. 加载 dbcp的 properties配置文件:配置文件中的键须要来自BasicDataSource的属性
     * 2. 调用 BasicDataSourceFactory的 createDataSource方法才建立数据库链接
     * 3. 从 DataSource实例中获取数据库链接。
     *
     * @throws Exception
     */
    @Test
    public void test18() throws Exception {
        Properties properties = new Properties();
        InputStream in = JdbcTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
        properties.load(in);

        DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);

        //BasicDataSource basicDataSource = (BasicDataSource) dataSource;
    }

3、C3P0 数据库链接池

(1)基本用法函数

(2)更好的用法性能

/**
	 * 1. 建立 c3p0-config.xml 文件, 
	 * 参考帮助文档中 Appendix B: Configuation Files 的内容
	 * 2. 建立 ComboPooledDataSource 实例;
	 * DataSource dataSource = 
	 *			new ComboPooledDataSource("helloc3p0");  
	 * 3. 从 DataSource 实例中获取数据库链接. 
	 */
	@Test
	public void testC3poWithConfigFile() throws Exception{
		DataSource dataSource = 
				new ComboPooledDataSource("helloc3p0");  
		
		System.out.println(dataSource.getConnection()); 
		
		ComboPooledDataSource comboPooledDataSource = 
				(ComboPooledDataSource) dataSource;
		System.out.println(comboPooledDataSource.getMaxStatements()); 
	}

附c3p0-config.xml:学习

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>

	<named-config name="helloc3p0">
		
		<!-- 指定链接数据源的基本属性 -->
		<property name="user">root</property>
		<property name="password">1230</property>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql:///atguigu</property>
		
		<!-- 若数据库中链接数不足时, 一次向数据库服务器申请多少个链接 -->
		<property name="acquireIncrement">5</property>
		<!-- 初始化数据库链接池时链接的数量 -->
		<property name="initialPoolSize">5</property>
		<!-- 数据库链接池中的最小的数据库链接数 -->
		<property name="minPoolSize">5</property>
		<!-- 数据库链接池中的最大的数据库链接数 -->
		<property name="maxPoolSize">10</property>

		<!-- C3P0 数据库链接池能够维护的 Statement 的个数 -->
		<property name="maxStatements">20</property>
		<!-- 每一个链接同时可使用的 Statement 对象的个数 -->
		<property name="maxStatementsPerConnection">5</property>
	
	</named-config>
		
</c3p0-config>

 

 

JDBC学习笔记:大数据

1. 获取数据库链接    http://my.oschina.net/daowuming/blog/704243

2. 经过Statement执行更新、查询操做    http://my.oschina.net/daowuming/blog/704384

3. 使用PrepareStatement    http://my.oschina.net/daowuming/blog/704432

4. 使用ResultSetMetaData 对象处理结果集元数据    http://my.oschina.net/daowuming/blog/704487

5. 使用DatabaseMetaData获取数据库信息    http://my.oschina.net/daowuming/blog/704553

6. BLOB    http://my.oschina.net/daowuming/blog/704593

7. 处理事务与隔离级别    http://my.oschina.net/daowuming/blog/704611

8. 批量处理    http://my.oschina.net/daowuming/blog/704641

9. 数据库链接池    ----当前----

10. 调用函数与存储过程    http://my.oschina.net/daowuming/blog/704813

相关文章
相关标签/搜索