ToB企服应用市场:ToB评测及商务社交产业平台

标题: JDBC p5 数据库连接池 [打印本页]

作者: tsx81428    时间: 2023-7-31 19:01
标题: JDBC p5 数据库连接池
数据库连接池

传统获取Connection问题分析

案例:
  1. package com.hspedu.jdbc.datasource;
  2. import com.hspedu.jdbc.utils.JDBCUtils;
  3. import org.junit.jupiter.api.Test;
  4. import java.sql.Connection;
  5. public class ConQuestion {
  6.     //代码 连接mysql 5000次
  7.     @Test
  8.     public void testCon(){
  9.         long start = System.currentTimeMillis();
  10.         for (int i = 0; i < 5000; i++){
  11.             //使用传统jdbc连接方式
  12.             Connection connection = JDBCUtils.getConnection();
  13.             //可能会抛出too many connections的异常
  14.             //再看看,如果得到连接就立即关闭,总共会耗时多久
  15.             JDBCUtils.close(null, null, connection);
  16.         }
  17.         long end = System.currentTimeMillis();
  18.         System.out.println("耗时 = " + (end - start));//耗时 = 6598
  19.     }
  20. }
复制代码
数据库连接池原理

常用的数据库连接池

​        JDBC 的数据库连接池使用 javax.sql.DateSource 来表示,DataSource 只是一个接口,该接口通常由第三方提供实现。
数据库连接池种类:**
C3P0的使用

需要自行导入相关的jar包。
代码演示:
  1. package com.hspedu.jdbc.datasource;
  2. import com.mchange.v2.c3p0.ComboPooledDataSource;
  3. import org.junit.jupiter.api.Test;
  4. import java.beans.PropertyVetoException;
  5. import java.io.FileInputStream;
  6. import java.io.IOException;
  7. import java.sql.Connection;
  8. import java.sql.SQLException;
  9. import java.util.Properties;
  10. public class C3P0_ {
  11.     //方式1:相关参数,在程序中指定user, url, password
  12.     @Test
  13.     public void testC3P0_01() throws IOException, PropertyVetoException, SQLException {
  14.         //1. 创建一个数据源对象
  15.         ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource();
  16.         //2. 通过配置文件获取相关连接信息
  17.         Properties properties = new Properties();
  18.         properties.load(new FileInputStream("src\\mysql.properties"));
  19.         String user = properties.getProperty("user");
  20.         String password = properties.getProperty("password");
  21.         String url = properties.getProperty("url");
  22.         String driver = properties.getProperty("driver");
  23.         //给数据源(数据源负责连接,连接池) comboPooledDataSource 设置参数
  24.         comboPooledDataSource.setDriverClass(driver);
  25.         comboPooledDataSource.setJdbcUrl(url);
  26.         comboPooledDataSource.setUser(user);
  27.         comboPooledDataSource.setPassword(password);
  28.         //设置初始化连接数
  29.         comboPooledDataSource.setInitialPoolSize(10);
  30.         //最大连接数
  31.         comboPooledDataSource.setMaxPoolSize(50);
  32.         //获取连接
  33.         //测试连接池的效率,连接5000次
  34.         long start = System.currentTimeMillis();
  35.         for (int i = 0; i < 5000; i++) {
  36.             Connection connection = comboPooledDataSource.getConnection();//这个方法就是从DateSource接口实现的
  37. //            System.out.println("连接OK");
  38.             //关闭
  39.             connection.close();
  40.         }
  41.         long end = System.currentTimeMillis();
  42.         System.out.println("c3p0 5000次连接mysql 耗时 = " + (end - start));//c3p0 5000次连接mysql 耗时 = 280,之前传统的耗时 = 6598
  43.     }
  44.     //第二种方式, 使用配置文件的模板来完成
  45.     //1. 将c3p0 提供的 c3p0.config.xml 拷贝到src目录
  46.     //2. 该文件指定了连接数据库和连接池的相关参数
  47.     @Test
  48.     public void testC3P0_02() throws SQLException {
  49.         ComboPooledDataSource comboPooledDataSource = new ComboPooledDataSource("hsp_edu");//填入数据源名称
  50.         long start = System.currentTimeMillis();
  51.         for (int i = 0; i < 500000; i++) {
  52.             Connection connection = comboPooledDataSource.getConnection();//这个方法就是从DateSource接口实现的
  53. //            System.out.println("连接OK");
  54.             //关闭
  55.             connection.close();
  56.         }
  57.         long end = System.currentTimeMillis();
  58.         System.out.println("c3p0 第二种方式500000次连接mysql 耗时 = " + (end - start));//c3p0 第二种方式500000次连接mysql 耗时 = 1452
  59.     }
  60. }
复制代码
配置文件 c3p0-config.xml:
  1. <c3p0-config>
  2.         <named-config name="hsp_edu">
  3.             
  4.             <property name="driverClass">com.mysql.jdbc.Driver</property>
  5.             <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbc_learning</property>
  6.             <property name="user">root</property>
  7.             <property name="password">root</property>
  8.             
  9.             
  10.             <property name="acquireIncrement">5</property>
  11.             
  12.             <property name="initialPoolSize">5</property>
  13.             
  14.             <property name="maxPoolSize">10</property>
  15.             
  16.             <property name="minPoolSize">5</property>
  17.             
  18.             <property name="maxStatementPerConnection">2</property>
  19.         </named-config>
  20. </c3p0-config>
复制代码
Druid(德鲁伊)的使用

需要自行导入相关的jar包。
代码演示:
  1. package com.hspedu.jdbc.datasource;
  2. import com.alibaba.druid.pool.DruidDataSourceFactory;
  3. import org.junit.jupiter.api.Test;
  4. import javax.sql.DataSource;
  5. import java.io.FileInputStream;
  6. import java.sql.Connection;
  7. import java.util.Properties;
  8. public class Druid_ {
  9.     @Test
  10.     public void testDruid() throws Exception {
  11.         //1. 加入 Druid jar包
  12.         //2. 加入 配置文件 druid.properties,将该文件拷贝到项目的src目录
  13.         //3. 创建 Properties 对象
  14.         Properties properties = new Properties();
  15.         properties.load(new FileInputStream("src\\druid.properties"));
  16.         //4. 创建一个指定参数的数据库连接池
  17.         DataSource dataSource = DruidDataSourceFactory.createDataSource(properties);
  18.         long start = System.currentTimeMillis();
  19.         for (int i = 0; i < 500000; i++) {
  20.             Connection connection = dataSource.getConnection();
  21. //            System.out.println("连接成功");
  22.             connection.close();
  23.         }
  24.         long end = System.currentTimeMillis();
  25.         System.out.println("druid连接池, 连接500000次 耗时 = " + (end - start));//druid连接池, 连接500000次 耗时 = 549
  26.     }
  27. }
复制代码
配置文件 druid.properties:
  1. #key=value
  2. driverClassName=com.mysql.jdbc.Driver
  3. url=jdbc:mysql://localhost:3306/jdbc_learning?rewriteBatchedStatements=true
  4. username=root
  5. password=root
  6. #initial connection size
  7. initialSize=10
  8. #min idle connection size
  9. minIdle=5
  10. #max active connection size
  11. maxActive=50
  12. #max wait time (5000 mil seconds)
  13. maxWait=5000
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4