zoukankan      html  css  js  c++  java
  • JBDC—③数据库连接池的介绍、使用和配置

        首先要知道数据库连接(Connection对象)的创建和关闭是非常浪费系统资源的,如果是使用常规的数据库连接方式来操作数据库,当用户变多时,每次访问数据库都要创建大量的Connnection对象,使用完成后关闭连接。这一过程频繁地使用时,会导致程序性能急剧下降。如果项目存在频繁访问数据库的操作,则应该使用数据库连接池来管理数据库连接,可以显著提升程序运行效率。

    数据库连接池原理

    先回顾一下Java程序访问数据库的步骤:
    ①加载载数据库驱动程序-->②通过jdbc建立数据库连接-->③访问数据库,执行sql语句-->④关闭数据库连接。
            如果是一个网站,每次用户进行查询或者登录等访问数据库的操作,则数据库连接就会不停地创建,然后又关闭,系统资源被毫无节制的分配,如果连接过多,甚至会导致服务器的崩溃。所以在每次使用完数据库连接后,不对其进行关闭,而是存储起来,等待下一次的使用,这样就能避免重复创建数据库连接和关闭连接所带来的时间消耗,从而做到对数据库连接的有效管理,这就是数据库连接池的原理。关于连接池,Java中的许多连接池也是类似原理,例如线程池、对象池等,其优势就是减少资源频繁分配所带来的延迟,从而提高性能。
     

    数据库连接池的介绍

    在Java中有一个DataSource接口类,所有的连接池都是对该接口的实现。数据源在网上有许多种,但大体差不多,所以下面就简单介绍一下DBCP数据源和C3P0数据源的使用方式,但也可以自己去实现该接口,完成一个功能简单的连接池。除了上面说的两个数据源,另外推荐使用阿里的Druid数据源,功能比较强大。
    DBCP数据源和C3P0数据源以及配置文件都已经打包好了,需要的自行下载:数据库连接池jar包下载
     

    DBCP数据源

    相关配置参数
    常用的例如驱动程序、数据库地址(url)和账户密码的作用就不说了,DBCP的主要参数如下:
     
    initialSize
     
    初始化连接:连接池启动时创建的连接数量;
    maxActive
     
    最大活动连接:连接池在同一时间能够分配的最大活动连接的数量, 设为负数表示不限制;
    maxIdle
     
    最大空闲连接:连接池中容许保持空闲状态的最大连接数量,超过的空闲连接将被释放,设为负数表示不限制;
    minIdle
     
    最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,设为0则不创建;
    maxWait
     
    最大等待时间:当没有可用连接时,连接池等待连接被归还的最大时间(以毫秒计数),超过时间则抛出异常,设为-1表示无限等待。
     
    使用DBCP需要导入两个包commons-dbcp-1.4.jar和commons-pool-1.6.jar,这两个包可在官网Apache commons下载,至于版本根据个人来选择。配置DBCP数据源可以采用多种方式配置,非Web项目的话就用*.properties文件或者代码配置,在Web项目中当然最好使用JNDL(Java命名和目录接口服务)。
    这里采用属性文件的方式来配置DBCP数据源,配置列表如下:
    #数据库驱动包程序
    driverClassName=com.mysql.jdbc.Driver
    #访问的数据库地址 ,高版本Mysql要求使用SSL,这里改成false,就没警告了。
    url=jdbc:mysql://localhost:3306/testdb?useSSL=false
    #数据库用户
    username=root
    #数据库密码
    password=1234
    #初始连接数
    initialSize=5
    #最大活动连接数
    maxActive=10
    #最小空闲数
    minIdle=3
    #超过时长 6s
    maxWait=60000
    public class DBCPUtils{
    	private static DataSource ds = null;//数据源只需要一个,设为static。
    	//静态块只加载一次
    	static {
    		try {
    			InputStream is = new FileInputStream("dbconfig.properties");//加载配置文件
    			Properties prop = new Properties();
    			prop.load(is);
    			//使用DBCP的数据源工厂来创建数据源
    			ds = BasicDataSourceFactory.createDataSource(prop);
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}
    	/**
    	 * 使用DBCP数据源来获取数据库连接
    	 */
    	public static Connection getConnection() {
    		Connection conn = null; 
    		try {
    			conn = ds.getConnection();//从连接池中拿出一个连接
    		} catch (SQLException e) {
    			e.printStackTrace();
    		}
    		return conn;
    	}
    	/**
    	 * 关闭资源
    	 */
    	public void close(Connection conn, Statement st, ResultSet rs) {
    		//关闭结果集对象
    		if(rs != null){
    			try {
    				rs.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		//关闭执行SQL语句的Statement对象
    		if(st != null) {
    			try {
    				st.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    		//关闭连接,并非真正关闭,而是返回连接池
    		if(conn != null) {
    			try {
    				conn.close();
    			} catch (SQLException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    }
    代码里面配置DBCP数据源(不推荐,仅作了解)
    	private static BasicDataSource ds = null;
    	static {
    		//创建数据源对象
    		ds = new BasicDataSource();
    		ds.setDriverClassName("com.mysql.jdbc.Driver");
    		ds.setUrl("jdbc:mysql://localhost:3306/testdb?useSSL=false");
    		ds.setUsername("root");
    		ds.setPassword("1234");
    		ds.setInitialSize(5);
    		ds.setMaxActive(25);
    		ds.setMinIdle(10);
    	}

    C3P0数据源

    和DBCP数据源一样,需要导入两个包:c3p0-0.9.5.2.jar 和 mchange-commons-java-0.2.11.jar。
    相关配置参数
    initialPoolSize:连接池初始化时创建的连接数,default : 3,取值应在minPoolSize与maxPoolSize之间。
    minPoolSize:连接池保持的最小连接数,default :3
    maxPoolSize:连接池中拥有的最大连接数,如果获得新连接时连接总数超过该值则不再获取新连接,而是等待其他连接释放,default :15。
    acquireIncrement:连接池在无空闲连接可用时一次性创建的新数据库连接数,default :3
    maxIdleTime:连接的最大空闲时间,如果超过这个时间,某个连接还未被使用,则会断开这个连接。如果为0,则永远不会断开连接,default : 0 。
    idleConnectionTestPeriod:每900秒检查所有连接池中的空闲连接
    acquireRetryAttempts:连接池在获得新连接失败时重试的次数,如果小于等于0则无限重试直至连接获得成功。

    配置方式推荐两种:一是类似上面配置DBCP数据源所采用的属性文件方式,但C3P0的配置属性文件名必须为c3p0.properties,而且属性名为c3p0.属性名,不然没法解析。最重要的存放路径一定要对,不然会找不到,从而一直出现异常;二是采用XML配置文件,在类路径下新建一个c3p0-config.xml文件。

    如图所示,要放在存放类文件的路径之下,不然找不到。

    使用properties方式

    #mysql驱动程序
    c3p0.driverClass=com.mysql.jdbc.Driver
    #数据库地址。高版本Mysql要求使用SSL,这里改成false,就没警告了。
    c3p0.jdbcUrl=jdbc:mysql://localhost:3306/testdb?useSSL=false
    #用户
    c3p0.user=root
    #密码
    c3p0.password=1234
    #初始连接数
    c3p0.InitialPoolSize = 5
    #最大连接数
    c3p0.maxPoolSize=20
    #最小连接数  
    c3p0.minPoolSize=5
    #连接的最大空闲时间,单位s
    c3p0.maxIdleTime=10  
    #获得新连接失败时重试的次数  
    c3p0.acquireRetryAttempts=30  
    #连接池获得新连接时的间隔时间  
    c3p0.acquireRetryDelay=1000 
    使用XML配置方式
    <?xml version="1.0" encoding="UTF-8"?>
    <c3p0-config>
    	<!-- 默认配置,创建c3p0连接池对象时,没有指定名字,则使用该配置 -->
    	<default-config>
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<property name="jdbcUrl">jdbc:mysql://localhost:3306/testdb?useSSL=false</property>
    		<property name="user">root</property>
    		<property name="password">1234</property>		
    		<!-- 省略设置参数,采用默认设定-->
    	</default-config>
    	
    	<!-- 命名配置,创建c3p0连接池对象时,指定该名字,则使用该配置 -->
    	<named-config name="MYSQL">
    		<property name="driverClass">com.mysql.jdbc.Driver</property>
    		<property name="jdbcUrl">jdbc:mysql://localhost:3306/testdb?useSSL=false</property>
    		<property name="user">root</property>
    		<property name="password">1234</property>		
    		<!-- 设置配置参数 -->
    		<property name="initialPoolSize">5</property>
    		<property name="maxPoolSize">25</property>
    		<property name="minPoolSize">5</property>
    		<property name="maxIdleTime">60</property>				<!-- 连接的最大空闲时间,单位s -->
    		<property name="acquireRetryAttempts">30</property>		<!-- 获取连接失败时,重试次数 -->
    		<property name="acquireRetryDelay">30</property>		<!-- 连接池获得新连接时的间隔时间   -->
    	</named-config>
    </c3p0-config>

    c3p0获取数据库连接的代码

    public class C3p0Util {
    	private static ComboPooledDataSource ds =null; 
    	static {
    		//指定名字,就使用该命名的配置;未指定则使用默认配置。
    		ds = new ComboPooledDataSource("MYSQL");
    	}
    	/**
    	 * 从连接池获取数据库连接
    	 */
    	public static Connection getConnection() throws SQLException {
    		return ds.getConnection();
    	}
    	//省略关闭资源方法,和上面DBCP数据源的一样
    }
    
     
    以上就是最常用的两大开源数据库连接池的使用方法和配置方式,但这两个数据库连接池都没有连接监控,算是一个缺点,但数据库连接池proxool支持连接池监控,感兴趣可以自行了解。
  • 相关阅读:
    ionic 刷新页面的几种方法
    Highcharts中如何外部修改pointStart
    前端分页 思路
    快捷选时间
    获取今天,昨天,本周,上周,本月,上月时间
    angularjs 弹出框 $modal
    SQL 查找存在某内容的存储过程都有哪些
    LINQ to SQL和Entity Framework
    SQL模糊查询条件的四种匹配模式
    数据库--中文表名及字段名的优缺点
  • 原文地址:https://www.cnblogs.com/fwnboke/p/8529788.html
Copyright © 2011-2022 走看看