文章目录

  • 数据库连接池
  • 1.传统连接图解
  • 2.传统连接问题分析
  • 3.数据库连接池
  • 3.1基本介绍
  • 3.2数据库连接池种类
  • 4.连接池C3P0的使用
  • 5.连接池德鲁伊的使用


数据库连接池

1.传统连接图解

1.通过网络连接,最大连接数有限制,多个Java程序并发会瘫痪。

spark java mysql连接池 mysql连接池大小_spark java mysql连接池


代码模拟:

public  void testCon(){
for (int i = 0;i<5000;i++){
Connection connection = JDBCUtils.getConnection();
JDBCUtils.close(null,null,connection);
}

此时不关闭,抛出Too many cnonections异常
当每一次都关闭时,耗时7秒。

2.传统连接问题分析

spark java mysql连接池 mysql连接池大小_数据库_02


时间与网络质量有关。

3.数据库连接池

3.1基本介绍

1.预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕后放回去。
2.数据库连接池负责分配、管理和释放数据库连接,它允许程序重复使用一个现有连接,而不是重新建立一个。
3.当应用程序连接向连接池请求数量超过最大数量时,这些请求将被加入到等待队列。

数据库连接池示意图:

当连接池中连接都用完时,会进入等待队列,等待再连接。放回连接是不在引用连接,而不是断掉连接到数据库的线。

spark java mysql连接池 mysql连接池大小_数据库_03

3.2数据库连接池种类

spark java mysql连接池 mysql连接池大小_数据库连接池_04


注:1.速度相对慢,只是相对,C3P0稳定性好用的也比较多。德鲁伊用的最多。

2.提供相应的接口,就是会有相应的Java包。

4.连接池C3P0的使用

1.c3p0的jar包拷贝到libs下并加入项目中。
2.在使用标准配置文件模板时,c3p0-confg.xml
内容如下

<?xml version="1.0" encoding="UTF-8" ?>
<c3p0-config>
        <!--数据源名称代表连接池-->
    <named-config name="testc3p0">
        <!--指定连接数据源的基本属性-->
        <!--用户名-->
        <property name="user">root</property>
        <!--密码-->
        <property name="password">123456</property>
<!--驱动类-->
        <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
        <property name="jdbcUrl">jdbc:mysql://localhost:3306/studb</property>
        <!--初始化数据库连接池时连接的数量-->
        <property name="initialPoolSize">5</property>
        <!--若数据库中连接数不足时,一次向数据库服务器申请多少个连接-->
        <property name="acquireIncremen">5</property>
        <!--数据库连接池中最大的数据库连接数-->
        <property name="maxPoolSize">20</property>
        <!--数据库连接池中最小的数据库连接数(空连对象个数为这个数时就去申请更多连接对象)-->
        <property name="minPoolSize">2</property>
    </named-config>
</c3p0-config>

代码演示:

注意: 以下演示两种连接方式,第一种不使用配置文件,自己获取连接时相关参数,passw、user、url等等。第二种使用配置文件,ComplooedDataSource中自动获取相关参数。直接连接,非常简便

package Jdbc.datasourse;

import com.mchange.v2.c3p0.ComboPooledDataSource;
import org.junit.Test;

import java.beans.PropertyVetoException;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author zq
 * 演示C3P0的使用
 *
 */
public class C3P0_ {
    @Test
    //方式一:程序中指定user、url、password等
    public void testC3P0_01() throws IOException, PropertyVetoException, SQLException {
        //1.创建一个数据源对象
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
        //2.通过配置文件获取相关连接信息。MySQL.properties
        Properties properties = new Properties();
        properties.load(new FileInputStream("src\\Jdbc\\myjdbc\\mysql.properties"));
        //读取相关信息
        String user = properties.getProperty("user");
        String password = properties.getProperty("password");
        String url = properties.getProperty("url");
        String driver = properties.getProperty("driver");

        //给数据源 comboPolledDataSource 设置相关参数
        //连接管理由他管理
        comboPooledDataSource.setDriverClass(driver);
        comboPooledDataSource.setJdbcUrl(url);
        comboPooledDataSource.setUser(user);
        comboPooledDataSource.setPassword(password);

        //设置初始化连接数
        comboPooledDataSource.setInitialPoolSize(10);
        //设置最大连接数,最多能增加到多少
        comboPooledDataSource.setMaxPoolSize(50);
        //取出一个连接
        //测试连接池效率,测试连接mysql5000千次效率
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {
            Connection connection = comboPooledDataSource.getConnection();
            //这个方法从DataSource接口实现

            connection.close();
        }
        System.out.println("连接成功");
        long end = System.currentTimeMillis();
        System.out.println(end - start);

    }
    @Test
    //使用配置文件模板连接c3p0-config.xml
//    将其拷贝到src下,该文件指定了连接数据库和连接池的相关参数
    public  void testC3PO_02() throws SQLException {
        //数据源
        ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("testc3p0");
        //直接连接,ComPooledDataSource以及全部做完获取参数等
        //测试效率
        long start = System.currentTimeMillis();
        for (int i = 0; i < 5000; i++) {

            Connection connection = comboPooledDataSource.getConnection();
           connection.close();
        }
        long end = System.currentTimeMillis();
        System.out.println("连接成功");
        System.out.println(end - start);

    }

}

5.连接池德鲁伊的使用

1.同样加入德鲁伊的jar包到项目
下载地址:
https://repo1.maven.org/maven2/com/alibaba/druid/ 2.加入配置文件druid.properties到src目录
druid.properties代码演示:

driverClassName=com.mysql.cj.jdbc.Driver

url=jdbc:mysql://localhost:3306/studb?user=root&password=123456&useUnicode=true


user=root
password=123456
initialSize = 10
maxActive=300
maxWait=60000
minTdle =5

代码演示:

package Jdbc.datasourse;

import com.alibaba.druid.pool.DruidDataSourceFactory;
import org.junit.Test;

import javax.sql.DataSource;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.sql.Connection;
import java.util.ConcurrentModificationException;
import java.util.Properties;

/**
 * @author  zq
 */public class Druid_ {
     @Test
     public  void testDruid() throws Exception {
         //创建Prperties对象读取配置文件
         Properties properties = new Properties();
         properties.load(new FileInputStream("src\\druid.properties"));
//         创建一个指定参数的数据库连接池
         DataSource dataSource =
                 DruidDataSourceFactory.createDataSource(properties);
         Connection connection = dataSource.getConnection();
         System.out.println("连接成功");
         connection.close();

     }
}