欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

荐 JDBC(4)DBCP数据源 | C3P0 数据源

程序员文章站 2022-04-29 10:46:25
目录后续对JDBC更深入的了解好了,我亲爱的读者朋友,以上就是本文的全部内容了!!!觉得有点用记得给我点赞哦!通过坚持不懈地学习,持续不断地输出,你的编程基本功算得上是突飞猛进。为了帮助更多的程序员,专注于分享有趣的 Java 技术编程和有益的程序人生。一开始,阅读量寥寥无几,关注人数更是少得可怜。但随自己的不断努力,阅读量和关注人都在猛烈攀升。绝对不容错过,期待与你的不期而遇。......

1.DBCP 数据源

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

  • Commons-dbcp.jar:连接池的实现
  • Commons-pool.jar:连接池实现的依赖库
    Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独
    立使用。

注意:

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

方式一:

步骤:

1、加入两个 jar
DBCP 数据库连接池的的 jar:Commons-dbcp.jar
连接池实现的依赖库:Commons-pool.jar,如果不加这个,运行报如下异常
荐
                                                        JDBC(4)DBCP数据源 | C3P0 数据源

代码实现:

public class TestDBCP {
	public static void main(String[] args) throws SQLException {
		//1.创建 DBCP 数据源(即连接池)
		BasicDataSource ds = new BasicDataSource();
		//2.设置数据源的必须属性
		ds.setDriverClassName("com.mysql.jdbc.Driver");
		ds.setUrl("jdbc:mysql://localhost:3306/test");
		ds.setUsername("root");
		ds.setPassword("root");
		//3.设置数据源的可选属性
		//(1)指定数据库连接池中初始化连接数的个数
		ds.setInitialSize(10);
		//(2)指定最大的连接数: 同一时刻可以同时向数据库申请的连接数
		ds.setMaxActive(50);
		//(3)在数据库连接池中保存的最少的空闲连接的数量
		ds.setMinIdle(2);
		//(4)等待数据库连接池分配连接的最长时间. 单位为毫秒. 超出该时间将抛出异常.
		ds.setMaxWait(1000*5);
		//4.从数据源中获取数据库连接
		Connection conn = ds.getConnection();
		System.out.println(conn);
	}
}

测试超过连接数

荐
                                                        JDBC(4)DBCP数据源 | C3P0 数据源

测试如果连接重复使用

荐
                                                        JDBC(4)DBCP数据源 | C3P0 数据源

方式二:

优化代码:
直接使用 BasicDataSource,耦合,而且在代码中需要很多 setXxx()设置属性值
使用 dbcp.properties 属性配置文件和 BasicDataSourceFactory 更灵活

步骤:

  1. 加载 dbcp 的 properties 配置文件: 配置文件中的键需要来自 BasicDataSource 的属性.
  2. 调用 BasicDataSourceFactory 的 createDataSource 方法创建 DataSource 实例
  3. 从 DataSource 实例中获取数据库连接.

优化代码如下:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/test
username=root
password=root
initialSize=3
maxActive=5
minIdle=2
maxWait=5000
public class TestDBCP3 {
	public static void main(String[] args) throws Exception {
		//1.获取配置文件信息
		// 注意:配置文件中的 key 来自 BasicDataSourceFactory 的属性(set 方法后面单词首字母改小写即可)
		Properties pro = new Properties();
		pro.load(ClassLoader.getSystemResourceAsStream("dbcp.properties"));
		//2.创建 DBCP 数据源(即连接池)
		DataSource ds = BasicDataSourceFactory.createDataSource(pro);
		//3.从数据源中获取数据库连接
		Connection conn = ds.getConnection();
		System.out.println("获取 1 个"+conn);
	}
}

JDBCUtils 修改 PDBCP 版

代码实现:

public class DBCPUtils {
	private static Properties pro = new Properties();
	private static DataSource ds ;
	static{
		try {
			//加载,读取 jdbc.properties 配置的信息
			pro.load(ClassLoader.getSystemClassLoader().getResourceAsStream("dbcp.properties"));
			//创建池子
			ds = BasicDataSourceFactory.createDataSource(pro);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	
	public static Connection getConnection()throws Exception{
		return ds.getConnection();
	}
}

2.C3P0 数据源

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

c3p0 与 dbcp 区别

  • dbcp 没有自动回收空闲连接的功能
  • c3p0 有自动回收空闲连接功能

方式一:

步骤:

加入 jar

  • 如果是 c3p0-0.9.1.2 版本,加入一个 jar 即可 c3p0-0.9.1.2.jar
  • 如果是 c3p0-0.9.2 之后的版本,需要加入两个 jar:c3p0-0.9.X.jar 和 mchange-commons-java-XX.jar

代码实现:

public class TestC3P0 {
	public static void main(String[] args)throws Exception {
		//1、创建 c3p0 数据源对象
		ComboPooledDataSource ds = new ComboPooledDataSource();
		//2、设置必须属性
		ds.setDriverClass( "com.mysql.jdbc.Driver" );
		ds.setJdbcUrl( "jdbc:mysql://localhost:3306/test" );
		ds.setUser("root");
		ds.setPassword("root");
		//3、获取连接
		System.out.println(ds.getConnection());
	}
}

方式二:

步骤:

  1. 在 src 目录创建 c3p0-config.xml 文件, 参考帮助文档中 Appendix B: Configuation Files 的内容
  2. 创建 ComboPooledDataSource 实例;
    DataSource dataSource = new ComboPooledDataSource(“helloc3p0”);
  3. 从 DataSource 实例中获取数据库连接.

代码如下:

配置文件:

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

测试类:

public class TestC3P02 {
	public static void main(String[] args)throws Exception {
		DataSource dataSource = new ComboPooledDataSource("helloc3p0");
		System.out.println(dataSource.getConnection());
	}
}

JDBCUtils 修改成 0 c3p0 版

public class C3p0Utils {
	//创建数据源,用的是 c3p0-config.xml 文件中<default-config>
	private static ComboPooledDataSource dataSource = new ComboPooledDataSource();
	//获取数据源对象
	public static ComboPooledDataSource getDataSource() {
		return dataSource;
	}
	
	//获取连接
	public static Connection getConnection() throws SQLException{
		return dataSource.getConnection();
	}
}

如果有收获!!! 希望老铁们来个三连,点赞、收藏、转发
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客

本文地址:https://blog.csdn.net/weixin_45606067/article/details/107094698