精华内容
下载资源
问答
  • JDBC 数据库连接池

    2021-01-19 22:03:13
     为了解决这个问题,引入了数据库连接池技术(个人认为数据库连接池技术是为解决这个问题的),它是批量创建一批数据库连接,放到一个数据库连接池,在需要数据库连接时,像这个池子拿,用完后则将数据库连接还回...
  • jdbc数据库连接池工程文件
  • Java jdbc数据库连接池Java jdbc数据库连接池Java jdbc数据库连接池Java jdbc数据库连接池
  • jdbc数据库连接池工程文件_e3p0jdbc数据库连接池工程文件_e3p0
  • java实现JDBC数据库连接池的原理,里面有oracle驱动jar包,以及代码的阅读步骤
  • jdbc数据库连接池

    2011-10-04 16:27:11
    适合jdbc数据库连接池的使用 非常好的资料
  • JAVA之JDBC数据库连接池(超详细介绍)

    千次阅读 多人点赞 2020-07-09 16:34:50
    JDBC数据库连接池一、JDBC数据库连接池的必要性二、数据库连接池技术三、多种开源的数据库连接池3.1 C3P0数据库连接池3.2 DBCP数据库连接池3.3 Druid(德鲁伊)数据库连接池 一、JDBC数据库连接池的必要性 1、在使用...

    一、JDBC数据库连接池的必要性

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

    (1)在主程序(如servlet、beans)中建立数据库连接
    (2)进行sql操作
    (3)断开数据库连接

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

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

    二、数据库连接池技术

    为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。

    1、数据库连接池的基本思想
    就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

    数据库连接池负责分配管理释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个

    数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。
    在这里插入图片描述
    2、数据库连接池的工作原理:
    在这里插入图片描述
    3、数据库连接池技术的优点:

    (1)资源重用
    由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。

    (2)更快的系统反应速度
    数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间

    (3)新的资源分配手段
    对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置,实现某一应用最大可用数据库连接数的限制,避免某一应用独占所有的数据库资源

    (4)统一的连接管理,避免数据库连接泄漏
    在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露

    三、多种开源的数据库连接池

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

    (1)DBCP 是Apache提供的数据库连接池。tomcat服务器自带dbcp数据库连接池。速度相对c3p0较快,但因自身存在BUG,Hibernate3已不再提供支持。

    (2)C3P0 是一个开源组织提供的一个数据库连接池,速度相对较慢,稳定性还可以,hibernate官方推荐使用。

    (3)Proxool 是sourceforge下的一个开源项目数据库连接池,有监控连接池状态的功能,稳定性较c3p0差一点.

    (4)BoneCP 是一个开源组织提供的数据库连接池,速度快。

    (5)Druid 是阿里提供的数据库连接池,据说是集DBCP 、C3P0 、Proxool优点于一身的数据库连接池,但是速度不确定是否有BoneCP快。

    2、DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池

    3、DataSource用来取代DriverManager来获取Connection,获取速度快,同时可以大幅度提高数据库访问速度。

    特别注意

    (1)数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
    (2)当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close();
    但conn.close()并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。

    3.1 C3P0数据库连接池

    (1)获取连接的方式一:

    //使用C3P0数据库连接池的方式,获取数据库的连接:不推荐
    public static Connection getConnection1() throws Exception{
    	ComboPooledDataSource cpds = new ComboPooledDataSource();
    	cpds.setDriverClass("com.mysql.jdbc.Driver"); 
    	cpds.setJdbcUrl("jdbc:mysql://localhost:3306/test");
    	cpds.setUser("root");
    	cpds.setPassword("abc123");
    		
    //	cpds.setMaxPoolSize(100);
    	
    	Connection conn = cpds.getConnection();
    	return conn;
    }

    (2)获取连接的方式二:

    //使用C3P0数据库连接池的配置文件方式,获取数据库的连接:推荐
    private static DataSource cpds = new ComboPooledDataSource("helloc3p0");
    public static Connection getConnection2() throws SQLException{
    	Connection conn = cpds.getConnection();
    	return conn;
    }

    其中,src下的配置文件为:(c3p0-config.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    	<named-config name="helloc3p0">
    		<!-- 获取连接的4个基本信息 -->
    		<property name="user">root</property>
    		<property name="password">abc123</property>
    		<property name="jdbcUrl">jdbc:mysql:///test</property>
    		<property name="driverClass">com.mysql.jdbc.Driver</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>

    3.2 DBCP数据库连接池

    1、DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool。如需使用该连接池实现,应在系统中增加如下两个 jar 文件:

    Commons-dbcp.jar:连接池的实现
    Commons-pool.jar:连接池实现的依赖库

    2、Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。

    3、数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。

    4、当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池

    配置属性说明:
    在这里插入图片描述
    (1)获取连接方式一:

    public static Connection getConnection3() throws Exception {
    	BasicDataSource source = new BasicDataSource();
    		
    	source.setDriverClassName("com.mysql.jdbc.Driver");
    	source.setUrl("jdbc:mysql:///test");
    	source.setUsername("root");
    	source.setPassword("abc123");
    		
    	//
    	source.setInitialSize(10);
    		
    	Connection conn = source.getConnection();
    	return conn;
    }

    (2)获取连接方式二:

    //使用dbcp数据库连接池的配置文件方式,获取数据库的连接:推荐
    private static DataSource source = null;
    static{
    	try {
    		Properties pros = new Properties();
    		
    		InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
    			
    		pros.load(is);
    		//根据提供的BasicDataSourceFactory创建对应的DataSource对象
    		source = BasicDataSourceFactory.createDataSource(pros);
    	} catch (Exception e) {
    		e.printStackTrace();
    	}
    		
    }
    public static Connection getConnection4() throws Exception {
    		
    	Connection conn = source.getConnection();
    	
    	return conn;
    }

    其中,src下的配置文件为:(dbcp.properties

    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true&useServerPrepStmts=false
    username=root
    password=abc123
    
    initialSize=10
    #...

    3.3 Druid(德鲁伊)数据库连接池

    Druid是阿里巴巴开源平台上一个数据库连接池实现,它结合了C3P0、DBCP、Proxool等DB池的优点,同时加入了日志监控,可以很好的监控DB池连接和SQL的执行情况,可以说是针对监控而生的DB连接池,可以说是目前最好的连接池之一

    import java.sql.Connection;
    import java.util.Properties;
    import javax.sql.DataSource;
    import com.alibaba.druid.pool.DruidDataSourceFactory;
    
    public class TestDruid {
    	public static void main(String[] args) throws Exception {
    		Properties pro = new Properties();		 pro.load(TestDruid.class.getClassLoader().getResourceAsStream("druid.properties"));
    		DataSource ds = DruidDataSourceFactory.createDataSource(pro);
    		Connection conn = ds.getConnection();
    		System.out.println(conn);
    	}
    }

    其中,src下的配置文件为:(druid.properties

    url=jdbc:mysql://localhost:3306/test?rewriteBatchedStatements=true
    username=root
    password=123456
    driverClassName=com.mysql.jdbc.Driver
    
    initialSize=10
    maxActive=20
    maxWait=1000
    filters=wall

    详细参数配置:
    在这里插入图片描述
    在这里插入图片描述

    展开全文
  • 祖传JDBC数据库连接池
  • Java jdbc数据库连接池总结 数据库连接池(connection pool)的工作原理 数据库连接池类
  • java_jdbc数据库连接池总结 有讲原理,不错
  • jdbc数据库连接池R2的源代码。R2通过代理connection对象和工厂模式实现了不改变原jdbc调用方式的前提下的jdbc数据库连接池。结构简单,功能完善,高可配置,充分应用了jdk1.6的同步包特性,提高了并发效率,并能够...
  • mysql驱动包、c3p0数据库连接池jar包、druid数据库连接池jar包、Spring Template jar包。
  • Tomcat5配置Mysql JDBC数据库连接池
  • JDBC数据库连接池的必要性

    千次阅读 2018-06-13 23:56:49
    1.JDBC数据库连接池的必要性 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤: 在主程序(如servlet、beans)中建立数据库连接、进行sql操作、断开数据库连接。 这种模式开发,存在的问题: (1)...

    1.JDBC数据库连接池的必要性

          在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:   在主程序(如servlet、beans)中建立数据库连接、进行sql操作、断开数据库连接。

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

        (1)普通的JDBC数据库连接使用 DriverManager 来获取,每次向数据库建立连接的时候都要将 Connection 加载到内存中,再验证用户名和密码(得花费0.05s~1s的时间)。

         (2) 需要数据库连接的时候,就向数据库要求一个,执行完成后再断开连接。这样的方式将会消耗大量的资源和时间。数据库的连接资源并没有得到很好的重复利用.若同时有几百人甚至几千人在线,频繁的进行数据库连接操作将占用很多的系统资源,严重的甚至会造成服务器的崩溃。

          (3)对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄漏,最终将导致重启数据库。

          这种开发不能控制被创建的连接对象数,系统资源会被毫无顾及的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃.


    2.数据库连接池(connection pool)

         为解决传统开发中的数据库连接问题,可以采用数据库连接池技术。

          数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。

          数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

          数据库连接池在初始化时将创建一定数量的数据库连接放到连接池中,这些数据库连接的数量是由最小数据库连接数来设定的。无论这些数据库连接是否被使用,连接池都将一直保证至少拥有这么多的连接数量。连接池的最大数据库连接数量限定了这个连接池能占有的最大连接数,当应用程序向连接池请求的连接数超过最大连接数量时,这些请求将被加入到等待队列中。


    3.数据库连接池技术的优点
          (1)资源重用:由于数据库连接得以重用,避免了频繁创建,释放连接引起的大量性能开销。在减少系统消耗的基础上,另一方面也增加了系统运行环境的平稳性。

         (2)更快的系统反应速度:数据库连接池在初始化过程中,往往已经创建了若干数据库连接置于连接池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接避免了数据库连接初始化和释放过程的时间开销,从而减少了系统的响应时间

         (3)新的资源分配手段对于多应用共享同一数据库的系统而言,可在应用层通过数据库连接池的配置实现某一应用最大可用数据库连接数的限制避免某一应用独占所有的数据库资源.

         (4)统一的连接管理,避免数据库连接泄露在较为完善的数据库连接池实现中,可根据预先的占用超时设定,强制回收被占用连接,从而避免了常规数据库连接操作中可能出现的资源泄露。

    4.使用c3p0创建数据库连接池

    /**
     * 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:///test</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>

    获取数据库连接:

    /** 
    * 获取数据库连接对象 
    * @return 数据连接对象 
    * @throws SQLException  
    */  
    public static synchronized Connection getConnection() throws SQLException{ 
       DataSource ds = new ComboPooledDataSource("helloc3p0");  
       final Connection conn = ds.getConnection();  
       conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);  
       return conn;  
    }  

    5.使用dbcp创建数据库连接池工厂

    /**
     * 1. 加载 dbcp 的 properties 配置文件: 配置文件中的键需要来自 BasicDataSource的属性.
     * 2. 调用 BasicDataSourceFactory 的 createDataSource 方法创建 DataSource实例
     * 3. 从 DataSource 实例中获取数据库连接. 
     */
    @Test
    public void testDBCPWithDataSourceFactory() throws Exception{
    	
    	Properties properties = new Properties();
    	InputStream inStream = JDBCTest.class.getClassLoader().getResourceAsStream("dbcp.properties");
    	properties.load(inStream);
    	DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
    	
    	System.out.println(dataSource.getConnection()); 
    	
    //	BasicDataSource basicDataSource = (BasicDataSource) dataSource;
    //	System.out.println(basicDataSource.getMaxWait()); 
    }

    dbcp.properties文件内容:

    username=root
    password=1230
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql:///test
    
    initialSize=10
    maxActive=50
    minIdle=5
    maxWait=5000
    
    #配置的属性名必须要与BasicDataSource的setXxx方法的属性名一样。

    参考:

    论数据库连接池的必要性及c3p0的详解

    展开全文
  • Java应用程序访问数据库的基本原理  在Java语言中,JDBC(Java ...JDBC提供两种API,分别是面向开发人员的API和面向底层的JDBC驱动程序API,底层主要通过直接的JDBC驱动和JDBC-ODBC桥驱动实现与数据库连接
  • JDBC数据库连接池的简单实现.rar
  • 数据库连接池的基本思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来...
  • JDBC数据库连接池DBCP jsp页面直接获取DAO层数据 demo
  • 设置JDBC数据库连接池

    千次阅读 热门讨论 2016-05-02 13:17:19
     JDBC作为J2EE的规范之一,它定义了连接数据库的接口,封装了连接数据库的细节问题,给开发人员极大的方便。开发人员只需要实现这些接口,就可以连接不同的数据库,不需要针对不同数据库写不同的连接代码。 JDBC...

    前言


        JDBC作为J2EE的规范之一,它定义了连接数据库的接口,封装了连接数据库的细节问题,给开发人员极大的方便。开发人员只需要实现这些接口,就可以连接不同的数据库,不需要针对不同数据库写不同的连接代码。


    JDBC连接数据库


        JDBC连接数据库,简单来说有下面四个步骤:


            1、加载数据库驱动


            2、建立连接


            3、访问数据库


            4、关闭数据库连接


        当然,JDBC连接数据库没有这么简单,它还包括Statement对象的创建,如果需要,还会创建ResultSet对象,关闭连接的时候,也要相应的先关闭其他对象,如《看JDBC轻松连接数据库,你值得拥有》中,有详细介绍。如果采用单个连接的话,Web的每一次请求都会创建数据库连接,这样既浪费资源又浪费时间,所以就采用了连接池的技术。将数据库连接放入连接池中,访问数据库时去连接池中取连接,用完之后就将连接放回连接池。


    连接池


        数据库连接池又称Resource Pool,基本思想是为数据库连接建立一个缓冲池,当创建连接池时,预先在连接池中配置一些数量的连接,当需要创建数据库连接时,就在连接池中取出连接,用完之后再放进去,否则当使用连接数超过最大连接数,接着再请求连接时,就会出现Timeout异常。当需要创建的连接数超过连接池中预先放入的连接,再创建新的连接。当然,连接池可以设置它的最大连接数,以及初始化时的连接数。


        JDBC并未提供连接池的方法,我们可以采用Tomcat,对连接池的一些参数进行设置。我们可以通过进入Tomcat的管理界面进行设置,或者直接设置Tomcat的server.xml文件,因为管理界面设置完成后,同样也会写入server.xml文件中。如果采用xml文件直接配置,就需要把下面的代码放入server.xml文件中,然后修改相应的参数就可以了。设置连接池的时候,有几个固定的参数:


    <Resource
          name="jdbc/drp"
          type="javax.sql.DataSource"
          maxActive="4"
          maxIdle="2"
          username="drp1"
          maxWait="5000"
          driverClassName="oracle.jdbc.driver.OracleDriver"
          password="123456"
          url="jdbc:oracle:thin:@localhost:1521:orcl"/>
        

        driverClassName:表示数据库驱动,上面代码中是Oracle驱动,如果是Mysql数据库,只需改成Mysql的驱动类就好了


        url:数据库路径,如果是连接服务器的数据库,只需要将localhost改成服务器IP地址就OK了


        username:username是数据库的用户名


        password:是该用户的密码


        maxActive:最大的可用的连接数量


        maxIdle:初始化时,连接池中的空闲连接数


        maxWait:最长等待时间,如果超过这个时间没有获得连接(单位为ms),则提示Timeout


        name:是随便起的名字


        type:指的是实现的javax.sql.DataSource的接口,是JDBC提供的


        配置完成之后,该连接池就对Tomcat服务器下的所有程序起作用。如果想让该连接池设置只对某一个应用程序起作用,只需要将上述代码拷贝到tomcat/conf路径下的context.xml文件中,然后将该文件剪切到应用程序的WebRoot/META-INF路径下即可。


        当需要创建连接池时,直接去连接池中取就好了:

    Connection conn = null;
    try { 
    	Context ctx = new InitialContext();
    	//通过JNDI查找DataSource
     	DataSource ds = (DataSource)ctx.lookup("java:comp/env/jdbc/drp");
     	conn = ds.getConnection();
    }catch(Exception e) {
    	e.printStackTrace();
    	throw new ApplicationException("系统错误,请联系系统管理员");
    } 
    return conn;


    线程并发问题


        数据库连接池并不是线程安全的,所以我们可以在创建Connection时可以采用synchronized关键字来保证线程同步,也可以采用ThreadLocal进行管理。当一个方法需要创建数据库连接时,可以先判断它所在的线程是否已经绑定了一个Connection,如果已经绑定了,那就直接用,如果没有,就创建一个Connection对象,放到ThreadLocal中,以备后面的方法使用。


    private static ThreadLocal<Connection> connectionHolder = new ThreadLocal<Connection>();
    /**
     * 得到Connection
     * @return
     */
    public static Connection getConnection() {
    	Connection conn = connectionHolder.get();
    	//如果在当前线程中没有绑定相应的Connection
    	if (conn == null) {
    		//创建一个新连接
    		conn = DbUtil.getConnection();
    		//将连接放入ThreadLocal
    		connectionHolder.set(conn);
    	}
    	return conn;
    }


    当然,关闭连接时,也需要把Connection从ThreadLocal中移除出去:


    public static void closeConnection() {
    	Connection conn = connectionHolder.get();
    	if (conn != null) {
    		try {
    			conn.close();
    			//从ThreadLocal中清除Connection
    			connectionHolder.remove();
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}	
    	}
    }


    总结


        JDBC作为一个规范,它将连接数据库的细节封装了起来,提供给我们各种接口,只要去实现这些接口,就可以实现数据库的连接。JDBC连接数据库有固定的步骤,而每创建一个连接都需要执行这个过程,对于访问人数较多的网站来说,如果不对数据库连接进行限制的话,系统会一直创建连接,这样就会造成数据库的内存泄露,对数据安全造成问题,所以就采用了连接池技术做改善,在连接池中限制最大连接数,只允许程序创建一定量的连接,用完之后就一定要放回连接池。即使这样,也会出现多线程并发问题,对于线程同步,可以采用synchronized关键字,也可以使用ThreadLocal来解决。

    展开全文
  • Servlet的JDBC 数据库连接池

    千次阅读 2014-10-06 14:51:46
    JDBC 数据库连接池:(代码测试不能用,不过思路应该是对的,后来改好的 代码不对 没有返回 ) 首先,需要一个继承DataSource接口的类,这个就是地址池了; 改写里面的Connection getConnection()方法(无参的...
    国庆的最后的时候,花了些时间整理下笔记等东东:(一些乱乱的东西)

    纯servlet的demo中使用的;
    JDBC 数据库连接池:(代码测试不能用,不过思路应该是对的,后来改好的  代码不对 没有返回    下面的代码是可用的)
    首先,需要一个继承 DataSource接口的类,这个就是地址池了;
    改写里面的 Connection  getConnection()方法(无参的),这个是用来分配地址的,代码可以这么写,大概这样:
       
    public Connection getConnection() throws SQLException {
    //给线程方法连接
    synchronized (pool) {
    if(pool.size()>0){//容器里有东东
    return pool.remove();//给一个出去
    }else if (pool.size()==0&&count<maxPoolSize) {
    pool.add(createConnection());
    return pool.remove();
    }else {
    //容器没有连接了,并且连接数已经超过最大值,让线程等。
    try {
    pool.wait();//让线程等待
    } catch (InterruptedException e) {
    // TODO: handle exception
    e.printStackTrace();
    }
    return pool.remove();
    }
    }
    //return null;
    }
    这里的pool就是一个容器,里面就是连接池咯!

    然后,在这个类里要有创建连接数据库的方法: Connection createConnection();
    不过这里面的地址(放到地址池里的是代理过的连接):
       
    //专门创建连接
    private Connection createConnection(){
    Connection conn =null;
    try {
    Class.forName(driverClassName);
    conn=DriverManager.getConnection(url, user, password);
    //上面是正常的连接!!
    //下面是对连接进行代理,为了就是在调用close方法时 不调用真正的close方法
    //而是我们自己写 的 连接 回收的 方法 代码
    CloseMethodHandler handler = new CloseMethodHandler(pool);
    Connection proxyconnConnection = handler.createProxy(conn);
    count=count+1;
    //return conn;
    return proxyconnConnection;
    } catch (Exception e) {
    e.printStackTrace();
    }
    return null;
    }
    当然 ,这里对这个地址池 类的构造方法 还是要写一下  ,要在构造的时候 先获得基本的数据 并创建 几个连接到地址池
       
    private LinkedList<Connection> pool=new LinkedList<Connection>();
    private String driverClassName;
    private String url;
    private String user;
    private String password;
    private int count=0;//连接计数
    public MyDataSource(int maxPoolSize,int initPoolSize,String driverClassName,String url,String user,String password){
    this.initPoolSize=initPoolSize;
    this.maxPoolSize=maxPoolSize;
    this.driverClassName=driverClassName;
    this.url=url;
    this.user=user;
    this.password=password;
    //创建三个连接
    for (int i = 0; i < initPoolSize; i++) {
    Connection conn =createConnection();
    pool.add(conn);
    }
    }
    这构造方法就没什么好说明的 了:
    接下来:​要创建上面的 CloseMethodHandler这个类了,这个类是用来创建 代理的;
    也就是,代理原本正真的数据库连接,以便在其调用close方法时,调用回收 和 线程 唤醒;

    这个类必须继承 InvocationHandler这个接口,并重写 invoke(Object proxy, Method method, Object[] args)方法;
    这个方法就是用来处理(拦截)代理对象方法使用的;
       
    public class CloseMethodHandler implements InvocationHandler {
    private Connection target;
    private LinkedList<Connection> pool;
    //构造方法 是因为需要pool对象而创建的
    public CloseMethodHandler(LinkedList<Connection> pool){
    this.pool=pool;
    }
    //target是被代理对象,创建一个代理对象//用来创建一个代理的对象 ,并将参数的真的对象 保存起来先  
    /*不过我感觉这里有问题,对参数的处理不太对的赶脚*/
    public Connection createProxy(Connection target){
    System.out.println(target.getClass().getName());
    this.target=target;
    //这个就是一个创建 代理 的方法 参数 我也弄的不明白 好像是 源对象的实例化的方式 ,代理对象的类型(接口),实现代理的类(就是自己)
                        /*感觉这个也有问题 对参数就是搞不明白*/
    return (Connection) Proxy.newProxyInstance(target.getClass().getClassLoader(), new Class[]{Connection.class}, this);
    }
    //拦截被代理对象的方法的方法==》拦截Connection对象中close的方法。
    public Object invoke(Object proxy, Method method, Object[] args)
    throws Throwable {
    if(method.getName().equals("close")){
    //拦截
    synchronized (pool) {
    pool.add((Connection) proxy);
    pool.notify();//唤醒等待的线程
    }
    }else{
        return method.invoke(target, args);//不拦截 //如果这个不返回 则所有的方法 都返回空
    }//问题就是在这里了,这个原先没有返回 所以所有的方法都被拦截了
    return null; //这里是不能返回空 close方法是返回空 而其他的方法 是有 返回的
    }
    }
    至于,这个地址池的使用,就很方便了,只要 创建一个这个地址池的单例,调动里面的方法来获得数据库的连接就可以了;;

    数据库连接池:(小结)
    管理多个数据库连接的容器-连接池。
    特点:
    里面有多个连接。
    这些连接一般不关闭。
    负责分发和回收。
    把Connection 的 close 改造成释放连接,并且唤醒等待的线程。
    使用代理:完成方法的改造
    替代Connection的 close方法。
    第三方成熟的数据库连接池:C3P0,DBCP。
    自定义数据库连接:
    1、实现javax.sql.DataSource接口。
    2、重写里面一个getConnection()方法
    3、设置一个连接数的最大值。(保护数据库)
    4、设置一个初始化的连接数。
    5、负责回收。(连接不关闭,而是回到数据库连接池,并变为空闲状态。)。
    6、设置线程等待和解锁的机制。

    当然这里使用第三方的开源插件是最好的,有:c3p0- 和 commons-pool -dbcp  这两个常用的;这里就试了下c3p0 是可以用的,另外一个似乎有版本问题!!!!我写的demo有问题应该,,,



    展开全文
  • JDBC数据库连接池的必要性: 在使用开发基于数据库的web程序时,传统的模式基本是按以下步骤:  在主程序(如servlet、beans)中建立数据库连接。  进行sql操作 断开数据库连接。 这种模式开发,存在的问题: 普通...
  • 在使用JDBC数据库连接池时,设置最小值是指每次连接建立的最少连接数,设置最大值是指连接池的最大连接数,当连接没达到连接数时,就会继续增加连接池的连接数,直到满了之后,再访问DB,这是才先去检查连接池的连接...
  • 实现jdbc数据库连接池

    2013-05-20 18:19:00
    此类非常简单,免去了网上众多资料里所说的麻烦的tomcat配置,更强...不仅oracle,mysql,sqlserver2000都行,因为它依据的是你自己连接数据库的驱动。当然首先你要保证你拥有一个能连接自己数据库的对应驱动类。如下面以
  • Tomcat5配置MySQL JDBC数据库连接池
  • yy-conn JDBC 数据库连接池,简单封装,可以连接多个数据源
  • Tomcat配置JDBC数据库连接池

    千次阅读 2011-10-06 20:00:46
    在多用户的web应用程序...源的, 针对数据库访问获取连接最好是使用数据库连接池技术,数据库连接池负责分配,管理和释 放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不再是重新建立一个,连接超过 最
  • JDBC数据库连接池(超详解!!!)

    千次阅读 2021-01-02 10:44:49
    一、数据库连接池 1.数据库连接池 概念:存放数据库连接的一个容器(集合)Connection 当系统运行起来之后,这个连接池就被创建,在这个连接池当中,会申请一些对象,当有用户来访问数据库的时候,就从这个连接池...
  • Tomcat5配置MysqlJDBC数据库连接池(JNDI方式)

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 152,551
精华内容 61,020
关键字:

怎么建立jdbc数据库连接池