• JDBC数据库连接池


    用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长。假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出、拓机。

    数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提出来的。数据库连接池负责分配,管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。

    一.DBCP数据源

    DBCP 是 Apache 软件基金组织下的开源连接池实现,要使用DBCP数据源,需要应用程序应在系统中增加如下两个 jar 文件:

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

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

    1.编写数据库连接池

    编写dbcp连接池需实现java.sql.DataSource接口。

    public void DBCPtest() throws SQLException{
    	BasicDataSource datasource=null;
    	//1.创建DBCP数据源实例
    	datasource=new BasicDataSource();
    	//2.为数据源指定必须的属性
    	datasource.setUsername("root");
    	datasource.setPassword("0404");
    	datasource.setUrl("jdbc:mysql://localhost:3303/extra");
    	datasource.setDriverClassName("com.mysql.jdbc.Driver");
    	//3.指定数据源的一些可选的属性
    	//1).指定数据库连接池中初始化连接数的个数
    	datasource.setInitialSize(10);
    	//2).指定数据库连接池中最大连接个数:同一时刻可以同时向数据库申请的连接个数
    	datasource.setMaxTotal(50);
    	//3).指定最小的连接数
    	datasource.setMinIdle(5);
    	//4).等待数据库连接池分配连接的最长时间,单位毫秒,超出抛异常
    	datasource.setMaxWaitMillis(1000*5);
    	//4.从数据源中获取数据库连接
    	Connection connection=datasource.getConnection();
    	System.out.println(connection);
    }
    

    指定的数据源的属性可以放在配置文件中:

    username=root
    password=0404
    driverClassName=com.mysql.jdbc.Driver
    url=jdbc:mysql://localhost:3303/extra
    
    initialSize=10
    maxTotal=50
    minIdle=5
    maxWaitMillis=5000
    

    示例代码:

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

    上面代码创建jdbc数据库连接池的步骤分为以下几步:

    ①加载dbcp的properties配置文件:配置文件中的键需要来自BasicDataSource的属性。

    ②调用BasicDataSourceFactory的createDataSource方法创建DataSource实例。

    ③从DataSource实例中获取数据库连接。

    二.C3P0数据源

    C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate, Spring等。C3P0数据源在项目开发中使用得比较多。

    要使用C3P0数据源,需要应用程序应在系统中增加如下两个 jar 文件:

    • c3p0-0.9.2.jar
    • mchange-commons.jar
    c3p0与dbcp区别:
    1. dbcp没有自动回收空闲连接的功能
    2. c3p0有自动回收空闲连接功能

    1.创建c3p0数据库连接池

    public void testC3P0() throws PropertyVetoException, SQLException{
    	ComboPooledDataSource cpds = new ComboPooledDataSource();
    	cpds.setDriverClass( "com.mysql.jdbc.Driver" );
    	cpds.setJdbcUrl( "jdbc:mysql://localhost:3303/extra" );
    	cpds.setUser("root"); 
    	cpds.setPassword("0404");
    	System.out.println(cpds.getConnection());
    }
    

    同样可以将setxxx的属性放置在配置文件中:(c3p0的配置文件的格式为xml)

    <c3p0-config>
     <named-config name="helloC3P0"> 
     <property name="user">root</property> 
     <property name="password">0404</property> 
     <property name="driverClass">com.mysql.jdbc.Driver</property> 
     <property name="jdbcUrl">jdbc:mysql://localhost:3303/extra</property> 
     <!-- 若数据库中连接数不足时,一次性向数据库服务器申请多少个连接 -->
     <property name="acquireIncrement">50</property> 
     <!-- 初始化数据库时连接池的个数 -->
     <property name="initialPoolSize">100</property> 
     <!-- 数据库连接池中最小的数据库连接个数 -->
     <property name="minPoolSize">50</property> 
     <property name="maxPoolSize">1000</property>
     <!-- c3p0数据库连接池可以维护的Statement的最大的个数 --> 
     <property name="maxStatements">20</property> 
     <!-- 每个连接可以使用多少个Statement -->
     <property name="maxStatementsPerConnection">5</property> 
     </named-config>
    </c3p0-config>
    

    示例代码:

    public void testC3P0WithConfigFile() throws SQLException{
    	DataSource dataSource=new ComboPooledDataSource("helloC3P0");
    	System.out.println(dataSource.getConnection());
    }
    

    上面代码中:

    ①创建c3p0-config.xml文件,参考api帮助文档;

    ②创建ComboPooledDataSource实例:DataSource dataSource=new ComboPooledDataSource("helloC3P0");

    ③从DataSource实例中获取数据库连接。

    至此JDBCTools中的数据库连接方法就可以改为:

    private static DataSource dataSource=null;
    static{
    //数据库连接池应该只被初始化一次 dataSource=new ComboPooledDataSource("helloc3p0"); } public static Connection getconnection2() throws SQLException{ return dataSource.getConnection(); }
  • 相关阅读:
    <转>Npoi导入导出Excel操作<载>
    将DataTable导出为Excel C#
    错误 X “X1”不包含“XX2”的定义,并且找不到可接受类型为“X1”的第一个参数的扩展方法“XX2”(是否缺少 using 指令或程序集引用?)
    错误 1 未知的服务器标记“asp:ScriptManager”。
    分析器错误消息: 类型“test.test.testx”不明确: 它可能来自程序集“F: estProjectin est.test.DLL”或程序集“F: estProjectin estProject.DLL”。请在类型名称中显式指定程序集。
    There are no interfaces on which a capture can be done.
    基础知识系列☞GET和POST→及相关知识
    基础知识系列☞Abstract和Virtual→及相关知识
    同源策略
    26Mybatis_一级缓存及其测试
  • 原文地址:https://www.cnblogs.com/naihuangbao/p/10121832.html
Copyright © 2020-2023  润新知