连接池、C3P0、DRUID、jdbc工具类

连接池

连接池的概述:

  • 连接池是创建和管理数据库连接的缓冲吃技术。
  • 连接池就是一个容器,连接池中保存了一些数据库连接,这些连接是可以重复使用的。

为什么要使用连接池:

  • 因为频繁建立连接和销毁连接对象是很耗时间很耗资源的过程,为了提高连接对象的复用性,需要使用连接池来保证连接对象在执行完毕操作之后不被销毁,等待下一次复用。

连接池的核心思想:

  • 连接复用。

连接池解决数据库资源浪费问题的原理:

连接对象操作特点
创建时在程序启动时找数据库服务器创建一定数量连接对象存放在集合中
使用时

直接从连接池对象中获得连接对象使用

关闭时不是真正关闭连接对象,而是放回连接池中等待下一次复用。

自定义连接池步骤

1)定义一个类实现javax.sql.DataSource接口。

2)实现接口DataSource中的抽象方法。

3)定义连接池相关参数。

  1. 初始化连接个数。(空参构造方法构造)
  2. 最大的连接个数。
  3. 当前已经创建的连接个数。

4)创建容器保存连接。(例:LinkedList<Connection>)

5)提供获取连接方法。

5)提供关闭连接方法。(把连接放回集合,不是真正意义的关闭)

自定义连接存在的问题:

  • connection.close()只能用于关闭连接,不能将连接还回连接池。

解放方案:

  • 我们可以使用动态代理来增强Connection的close方法,变成将连接还回连接池。

改良后的自定义连接池示例代码:

public class MyPool implements DataSource {

    //初始化池子链接个数
    private int initCount = 3;

    //最大链接个数
    private int maxCount=10;

    //当前已经创建的连接个数
    private int curCount=0;


    //定义一个容器用于存储链接
    private LinkedList<Connection> list = new LinkedList<>();


    //创建链接
    public Connection createConnection() throws SQLException {
        //被代理对象
        Connection connection = JDBCUtils.getConnection();

        //产生一个代理对象
        Connection proxyConnection = (Connection) Proxy.newProxyInstance(MyPool.class.getClassLoader(),new Class[]{Connection.class},
                (proxy,method,args)->{
                    //获取方法名
                    String methodName =method.getName();
                    //判断是否是我需要代理的方法
                    if("close".equalsIgnoreCase(methodName)){
                        //我需要代理,如果是调用了close方法,那么应该把当前的连接添加到连接池中.
                        list.add((Connection) proxy);
                        return null;
                    }else{
                       return  method.invoke(connection,args);
                    }
        });



        curCount++;
        return proxyConnection;
    }


    public MyPool() throws SQLException {
        //一旦创建连接池的时候就会存在3个连接
        for (int i = 0 ; i<initCount ; i++){
            Connection connection = createConnection();
            list.add(connection);
        }
    }




    //获取连接
    @Override
    public Connection getConnection() throws SQLException {
        //情况一: 池子中如果还有连接,那么直接获取即可。
        if(list.size()>0){
            Connection connection = list.removeFirst();
            return connection;
        }

        //情况二: 当前创建的连接个数并没超出最大值
        if(curCount<maxCount){
            Connection connection = createConnection();
            return connection;
        }

        throw new RuntimeException("当前网站访问的人数多过,请稍后!");
    }
}

C3P0

C3P0连接池概述:

  • 免费开源的,现在开源项目使用到c3p0的有:Spring和Hibernate。

c3p0的使用步骤:

1)拷贝c3p0的jar包到lib目录中,并且导入项目中。

2)导入c3p0-config.xml文件到src根目录下。(不能更换目录,不能修改该文件名

3)配置数据库连接参数:连接字符串,用户名,密码,数据库驱动类。

4)创建数据库连接池对象。

5)调用连接池对象的方法获得连接对象使用。

6)调用连接对象的close方法关闭连接:也不是真正关闭而是返回连接池中。

常用的配置参数:

参数说明
initialPoolSize初始连接数:刚创建好连接池的时候准备的连接数量
maxPoolSize最大连接数:连接池最大可以放多少个连接
checkoutTimeout最大等待时间:如果连接池中没有可用的连接对象时最长等待时间,如果在等待时间内仍然没有获得连接对象则抛出异常。
maxIdleTime最大空闲时间:当连接对象在指定的空闲时间内没有被使用,则会关闭该连接对象。

xml配置文件示例:

命名要求:一定要是c3p0-config.xml

位置要求:文件放在src文件夹下。

使用配置文件方式好处:

  • 只需要单独修改配置文件,不用修改代码。

多个配置的好处:

  1. 可以连接不同的数据库:db1,db2.
  2. 可以使用不同的连接池参数:maxPoolSize
  3. 可以连接不同厂商的数据库:Oracle或MySQL
<?xml version="1.0" encoding="utf-8"?>
<c3p0-config>
  <default-config>
    <property name="driverClass">com.mysql.jdbc.Driver</property>
    <property name="jdbcUrl">jdbc:mysql://localhost:3306/test</property>
    <property name="user">root</property>
    <property name="password">abc123</property>
    
    <property name="initialPoolSize">5</property>
    <property name="maxPoolSize">10</property>
    <!--单位是毫秒-->
    <property name="checkoutTimeout">3000</property>
  </default-config>



  <named-config name="otherc3p0">

      <property name="driverClass">com.mysql.jdbc.Driver</property>
      <property name="jdbcUrl">jdbc:mysql://localhost:3306/mysql</property>
      <property name="user">root</property>
      <property name="password">abc123</property>

      <property name="initialPoolSize">5</property>
      <property name="maxPoolSize">10</property>
      <!--单位是毫秒-->
      <property name="checkoutTimeout">3000</property>
  </named-config>
</c3p0-config>

两种创建连接池的方式:

1)无参构造,使用默认配置。

public ComboPooledDataSource() 

  • 无参构造使用默认配置(使用xml中default-config标签中对应的参数)。

public ComboPooledDataSource(String configName) 

  • configName:xml配置的名称,使用xml中named-config标签中对应的参数。

DRUID

Druid概述:

  • Druid是阿里巴巴开发的号称为监控而生的数据库连接池。

常用的配置参数:

参数说明
jdbcUrl连接数据库的URL:mysql : jdbc:mysql://localhost:3306/数据库名
username数据库的用户名
password数据库的密码
driverClassName驱动类型,根据URL自动识别,可不配
initialSize初始化时建立物理链接的个数
maxActive最大连接数量
maxIdle 最大空闲连接个数,配置也没有效果,默认为8
minIdle 最小连接数量
maxWait获取连接时最大等待时间,单位毫秒

druid.properties配置文件示例代码:

driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://127.0.0.1:3306/数据库名
username=root
password=abc123
initialSize=5
maxActive=10
maxWait=3000
maxIdle=8
minIdle=3

使用步骤

1)添加jar包到bin目录。并导入项目。

2)在src目录下创建一个properties文件,并设置对应参数。

3)创建Properties集合,并加载Properties文件的内容到Properties对象中。

1)得到druid.properties文件的输入流,使用类文件文件路径去找src目录下的资源最方便。

2)如果需要使用类文件路径,那么必须要先得到一个class对象,只有class对象才能使用类文件路径。

  • 使用方法:getResourceAsStream( String path )

3)类文件路径我们一定需要用代表scr目录。

  • 示例: InputStream inputStream = JDBCUtils.class.getResourceAsStream("/durid.properties");

4)加载properties文件的内容到Properties对象中。

  • 示例:properties.load(inputStream);

5)创建连接池

com.alibaba.druid.pool.DruidDataSourceFactory类有创建连接池的方法:

public static DataSource createDataSource(Properties properties)

  • 创建一个连接池,连接池的参数使用properties中的数据。

6)用DataSource的getConnection()方法获取连接。

7)执行SQL语句。

8)关闭资源。

jdbc工具类

概述:

  • 我们每次操作数据库都需要创建连接池,获取连接,关闭资源,都是重复的代码。我们可以将创建连接池的获取连接池的代码放到一个工具类中,简化代码。

示例代码:

package com.itheima.travel.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/*
	1. 声明静态数据源成员变量
	2. 创建连接池对象
	3. 定义公有的得到数据源的方法
	4. 定义得到连接对象的方法
	5. 定义关闭资源的方法
 */
public class JdbcUtils {
	// 1.	声明静态数据源成员变量
	private static DataSource ds;

	// 2. 创建连接池对象
	static {
		// 加载配置文件中的数据
		InputStream is = JdbcUtils.class.getResourceAsStream("/druid.properties");
		Properties pp = new Properties();
		try {
			pp.load(is);
			// 创建连接池,使用配置文件中的参数
			ds = DruidDataSourceFactory.createDataSource(pp);
		} catch (IOException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
	}

	// 3. 定义公有的得到数据源的方法
	public static DataSource getDataSource() {
		return ds;
	}

	// 4. 定义得到连接对象的方法
	public static Connection getConnection() throws SQLException {
		return ds.getConnection();
	}

	// 5.定义关闭资源的方法
	public static void close(Connection conn, Statement stmt, ResultSet rs) {
		if (rs != null) {
			try {
				rs.close();
			} catch (SQLException e) {}
		}

		if (stmt != null) {
			try {
				stmt.close();
			} catch (SQLException e) {}
		}

		if (conn != null) {
			try {
				conn.close();
			} catch (SQLException e) {}
		}
	}

	// 6.重载关闭方法
	public static void close(Connection conn, Statement stmt) {
		close(conn, stmt, null);
	}
}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会回答你的问题,以下是常用数据库连接池 DBCP、c3p0Druid 的配置说明: 1. DBCP (Apache Commons DBCP) DBCP 是 Apache Commons 项目中的一个子项目,它是一个纯 Java 实现的数据库连接池。DBCP 的使用非常简单,只需要引入相关的 jar 包即可。以下是 DBCP 的配置说明: ``` # 最大连接数 maxActive=100 # 最大空闲连接数 maxIdle=30 # 最小空闲连接数 minIdle=10 # 获取连接时的最大等待时间,单位为毫秒 maxWait=10000 # 是否开启自动回收空闲连接的线程 removeAbandoned=true # 回收超时时间,单位为秒 removeAbandonedTimeout=180 # 是否开启缓存 PreparedStatement,提高性能 poolPreparedStatements=true # 缓存 PreparedStatement 的最大数量 maxOpenPreparedStatements=100 ``` 2. c3p0 c3p0 是一个开源的 JDBC 数据库连接池,它实现了数据源和 JNDI 绑定,支持 JDBC3 的 Connection 和 Statement 缓存以及 JDBC4 的自动化管理。以下是 c3p0 的配置说明: ``` # 最大连接数 c3p0.maxPoolSize=100 # 最小连接数 c3p0.minPoolSize=10 # 初始化连接数 c3p0.initialPoolSize=10 # 获取连接时的最大等待时间,单位为毫秒 c3p0.checkoutTimeout=10000 # 是否自动回收超时连接 c3p0.autoCommitOnClose=true # 是否开启自动回收空闲连接的线程 c3p0.idleConnectionTestPeriod=60 # 回收超时时间,单位为秒 c3p0.maxIdleTime=1800 # 是否开启缓存 PreparedStatement,提高性能 c3p0.cachePreparedStatements=true # 缓存 PreparedStatement 的最大数量 c3p0.maxStatements=100 ``` 3. Druid Druid 是阿里巴巴开源的一个高性能、可扩展、功能强大的数据库连接池。它主要提供了以下功能:监控统计、防御 SQL 注入、批量处理、数据源加密、日志记录等。以下是 Druid 的配置说明: ``` # 最大连接数 druid.maxActive=100 # 最大空闲连接数 druid.maxIdle=30 # 最小空闲连接数 druid.minIdle=10 # 获取连接时的最大等待时间,单位为毫秒 druid.maxWait=10000 # 是否开启自动回收空闲连接的线程 druid.removeAbandoned=true # 回收超时时间,单位为秒 druid.removeAbandonedTimeout=180 # 是否开启缓存 PreparedStatement,提高性能 druid.poolPreparedStatements=true # 缓存 PreparedStatement 的最大数量 druid.maxOpenPreparedStatements=100 # 是否开启 SQL 执行监控 druid.stat=true # 是否开启防御 SQL 注入功能 druid.filters=stat,wall,log4j ``` 以上就是常用数据库连接池 DBCP、c3p0Druid 的配置说明。希望对你有所帮助!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值