c3p0和dbcp的简单使用

实际开发中“获得连接”或“释放资源”是非常消耗系统资源的两个过程,为了解决此类性能问题,通常情况我们采用连接池技术,来共享连接Connection。这样我们就不需要每次都创建连接、释放连接了,这些操作都交给了连接池


1.1     连接池概述

  概念

用池来管理Connection,这样可以重复使用Connection。有了池,所以我们就不用自己来创建Connection,而是通过池来获取Connection对象。当使用完Connection后,调用Connectionclose()方法也不会真的关闭Connection,而是把Connection“归还”给池。池就可以再利用这个Connection对象了。

  规范

Java为数据库连接池提供了公共的接口:javax.sql.DataSource,各个厂商需要让自己的连接池实现这个接口。这样应用程序可以方便的切换不同厂商的连接池!连接池和数据源是同一个意思

常见的连接池:DBCPC3P0

接下来,我们就详细的学习连接池。

1.2     C3P0连接池

C3P0开源免费的连接池!目前使用它的开源项目有:SpringHibernate等。使用第三方工具需要导入jar包,c3p0使用时还需要添加配置文件 c3p0-config.xml

1.2.1     导入jar包

我们使用的0.9.2版本,需要导入2个jar包

下载地址:https://download.csdn.net/download/qq_26106607/10443785

 

1.2.2     核心类

@Test
public void demo01() throws Exception{
	
	//1 获得连接池(数据源)
	ComboPooledDataSource dataSource = new ComboPooledDataSource();
	//1.1 设置基本项
	dataSource.setDriverClass("com.mysql.jdbc.Driver");
	dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/webdb_4");
	dataSource.setUser("root");
	dataSource.setPassword("root");
	//1.2其他项
	// * 初始化连接池中连接的个数
	dataSource.setInitialPoolSize(5);
	// * 最小|最大 连接池中连接的个数
	dataSource.setMinPoolSize(2);
	dataSource.setMaxPoolSize(10);
	// * 最大空闲数
	dataSource.setMaxIdleTime(60);
	// * 每次增长个数
	dataSource.setAcquireIncrement(2);
	
	
	//2获得连接
	Connection conn = dataSource.getConnection();
	System.out.println(conn);
}


1.2.3     配置文件

配置文件名称:c3p0-config.xml (固定)

配置文件位置:src (类路径)

配置文件内容:命名配置



c3p0-config.xml具体的配置

<c3p0-config>
	<!-- 命名的配置 -->
	<named-config name="wulin">
		<!-- 连接数据库的4项基本参数 -->
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/webdb_4</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<!-- 如果池中数据连接不够时一次增长多少个 -->
		<property name="acquireIncrement">5</property>
		<!-- 初始化连接数 -->
		<property name="initialPoolSize">20</property>
		<!-- 最小连接受 -->
		<property name="minPoolSize">10</property>
		<!-- 最大连接数 -->
		<property name="maxPoolSize">40</property>
		<!-- -JDBC的标准参数,用以控制数据源内加载的PreparedStatements数量 -->
		<property name="maxStatements">0</property>
		<!-- 连接池内单个连接所拥有的最大缓存statements数 -->
		<property name="maxStatementsPerConnection">5</property>
	</named-config>
	
	<!-- 默认配置 -->
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/webdb_4</property>
		<property name="user">root</property>
		<property name="password">root</property>
		<property name="checkoutTimeout">30000</property>
		<property name="idleConnectionTestPeriod">30</property>
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="minPoolSize">10</property>
		<property name="maxStatements">200</property>
		<user-overrides user="test-user">
			<property name="maxPoolSize">10</property>
			<property name="minPoolSize">1</property>
			<property name="maxStatements">0</property>
		</user-overrides>
	</default-config>
</c3p0-config>

<!-- 默认配置,如果没有指定则使用这个配置 -->
<!-- 
<c3p0-config>
	<default-config>
		<property name="driverClass">com.mysql.jdbc.Driver</property>
		<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/db</property>
		<property name="user">root</property>
		<property name="password">1234</property>
		<property name="checkoutTimeout">30000</property>
		<property name="idleConnectionTestPeriod">30</property>
		<property name="initialPoolSize">10</property>
		<property name="maxIdleTime">30</property>
		<property name="maxPoolSize">100</property>
		<property name="minPoolSize">10</property>
		<property name="maxStatements">200</property>
		<user-overrides user="test-user">
			<property name="maxPoolSize">10</property>
			<property name="minPoolSize">1</property>
			<property name="maxStatements">0</property>
		</user-overrides>
</default-config> 
 -->

 c3p0-config.xml命名的配置测试代码:
        @Test
	public void demo01() throws Exception{
		
		//1 获得连接池(数据源)
		// * c3p0 jar包将自动加载“c3p0-config.xml”文件,并获得具体的配置信息
		// ** 在配置文件中 <named-config name="名称"> ,可以通过核心类 new ComboPooledDataSource("名称")
		ComboPooledDataSource dataSource = new ComboPooledDataSource("wulin");
		//2获得连接
		Connection conn = dataSource.getConnection();
		System.out.println(conn);
	}

c3p0-config.xml默认的配置测试代码:

        @Test
	public void demo01() throws Exception{
		
		//1 获得连接池(数据源)
		// * c3p0 jar包将自动加载“c3p0-config.xml”文件,并获得具体的配置信息
		// ** 在配置文件中 <default-config> ,可以通过核心类 new ComboPooledDataSource()
		ComboPooledDataSource dataSource = new ComboPooledDataSource();//默认的配置没有名字,所以不用写
		
		//2获得连接
		Connection conn = dataSource.getConnection();
		System.out.println(conn);
	}


1.2.4     常见配置项

分类

属性

描述

必须项

user

用户名

password

密码

driverClass

驱动

mysql驱动,com.mysql.jdbc.Driver

jdbcUrl

路径

mysql路径,jdbc:mysql://localhost:3306/数据库

基本配置

acquireIncrement

连接池无空闲连接可用时,一次性创建的新连接数

默认值:3

initialPoolSize

连接池初始化时创建的连接数

默认值:3

maxPoolSize

连接池中拥有的最大连接数

默认值:15

minPoolSize

连接池保持的最小连接数。

maxIdleTime

连接的最大空闲时间。如果超过这个时间,某个数据库连接还没有被使用,则会断开掉这个连接,如果为0,则永远不会断开连接。

默认值:0

管理连接池的大小和连接的生存时间(扩展)

maxConnectionAge

配置连接的生存时间,超过这个时间的连接将由连接池自动断开丢弃掉。当然正在使用的连接不会马上断开,而是等待它close再断开。配置为0的时候则不会对连接的生存时间进行限制。默认值0

maxIdleTimeExcessConnections

这个配置主要是为了减轻连接池的负载,配置不为0,则会将连接池中的连接数量保持到minPoolSize,为0则不处理。

配置Prepared

Statement缓存(扩展)

maxStatements

连接池为数据源缓存的PreparedStatement的总数。由于PreparedStatement属于单个Connection,所以这个数量应该根据应用中平均连接数乘以每个连接的平均PreparedStatement来计算。为0的时候不缓存,同时maxStatementsPerConnection的配置无效。

maxStatementsPerConnection

连接池为数据源单个Connection缓存的PreparedStatement数,这个配置比maxStatements更有意义,因为它缓存的服务对象是单个数据连接,如果设置的好,肯定是可以提高性能的。为0的时候不缓存。



1.2.5     编写工具类

C3P0提供核心工具类:ComboPooledDataSource,如果要使用连接池,必须创建该类的实例对象

new ComboPooledDataSource(“名称”); 使用配置文件“命名配置”

  <named-config name="wulin">

  new ComboPooledDataSource(); 使用配置文件“默认配置”

  <default-config>
public class C3P0Utils{
	
	//使用默认配置
//	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
	//使用命名配置
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource("wulin");
	
	/**
	 * 获得数据源(连接池)
	 * @return
	 */
	public static DataSource getDataSource(){
		return dataSource;
	}

	/**
	 * 获得连接
	 * @return
	 * @throws SQLException
	 */
	public static Connection getConnection(){
		try {
			return dataSource.getConnection();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}


1.3      DBCP连接池

DBCP也是一个开源的连接池,是Apache Common成员之一,在企业开发中也比较常见,tomcat内置的连接池。

1.3.1     导入jar包



下载地址:

https://download.csdn.net/download/qq_26106607/10443791


1.3.2     核心类

@Test
public void demo01() throws Exception{
	//1 获得连接池
	BasicDataSource dataSource = new BasicDataSource();
	//1.1 基本项
	dataSource.setDriverClassName("com.mysql.jdbc.Driver");
	dataSource.setUrl("jdbc:mysql://localhost:3306/webdb_4");
	dataSource.setUsername("root");
	dataSource.setPassword("root");
	
	//1.2 其他项
	// * 初始化连接池中连个的个数
	dataSource.setInitialSize(5);
	// * 最大活动数
	dataSource.setMaxActive(10);
	
	//2获得连接
	Connection conn = dataSource.getConnection();
	System.out.println(conn);
	
}

1.3.3     配置文件

  配置文件名称:*.properties

  配置文件位置:任意,建议src(classpath/类路径)

  配置文件内容:properties不能编写中文,不支持在STS中修改,必须使用记事本修改内容,否则中文注释就乱码了


dbcp-config.properties具体配置:

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/webdb
username=root
password=root

#<!-- 初始化连接 -->
initialSize=10

#最大连接数量
maxActive=50

#<!-- 最大空闲连接 -->
maxIdle=20

#<!-- 最小空闲连接 -->
minIdle=5

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000


#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] 
#注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=gbk

#指定由连接池所创建的连接的自动提交(auto-commit)状态。
defaultAutoCommit=true

#driver default 指定由连接池所创建的连接的只读(read-only)状态。
#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)
defaultReadOnly=

#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。
#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED


测试代码:

        @Test
	public void demo01() throws Exception{
		//1 获得连接池
		//1.1 加载properties文件,获得Properties对象
		InputStream is = DBCPDemo_02.class.getClassLoader().getResourceAsStream("dbcp-config.properties");
		Properties props = new Properties();
		props.load(is);
		
		//1.2获得连接池
		DataSource dataSource = BasicDataSourceFactory.createDataSource(props); 
		
		//2获得连接
		Connection conn = dataSource.getConnection();
		System.out.println(conn);
		
	}


1.3.4     常见配置项

分类

属性

描述

必须项

driverClassName

 

url

 

username

 

password

 

基本项

maxActive

最大连接数量

minIdle

最小空闲连接

maxIdle

最大空闲连接

initialSize

初始化连接

 

 

 

优化配置(扩展)

logAbandoned

连接被泄露时是否打印

removeAbandoned

是否自动回收超时连接

removeAbandonedTimeout

超时时间(以秒数为单位)

maxWait

超时等待时间以毫秒为单位 1000等于60秒

timeBetweenEvictionRunsMillis

在空闲连接回收器线程运行期间休眠的时间值,以毫秒为单位

numTestsPerEvictionRun

在每次空闲连接回收器线程(如果有)运行时检查的连接数量

minEvictableIdleTimeMillis

连接在池中保持空闲而不被空闲连接回收器线程

参考文档:http://commons.apache.org/proper/commons-dbcp/configuration.html



1.3.5     编写工具类

public class DBCPUtils{
	
	private static DataSource dataSource;
	static{
		try {
			//1 加载配置文件,获得文件流
			InputStream is = DBCPUtils.class.getClassLoader().getResourceAsStream("dbcp.properties");
			//2 使用Properties处理配置文件
			Properties props = new Properties();
			props.load(is);
			//3 使用工具类创建连接池(数据源)
			dataSource = BasicDataSourceFactory.createDataSource(props);
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
	
	public static DataSource getDataSource(){
		return dataSource;
	}

	public static Connection getConnection(){
		try {
			return dataSource.getConnection();
		} catch (Exception e) {
			throw new RuntimeException(e);
		}
	}
}



























































  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值