DBCP和C3P0-数据库连接池

10.9、数据库连接池

数据库连接--执行完毕--释放

连接到释放,十分浪费系统资源

池化技术:准备一些预先的资源,过来就连接预先准备好的

根据常用连接数来设定最小连接数

常用连接数:(假设)10个

核心①:最小连接数:10

核心②:最大连接数:15 业务最高承载上限

超出部分-->排队等待

核心③:等待超时:100ms

 

编写连接池,实现一个借口 DataSource

 

开源数据源实现

DBCP

C3P0

Druid(德鲁伊):阿里巴巴

 

使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接数据库的代码了

DBCP

需要用到的jar包:commons-dbcp-1.4.jar 、 commons-pool-1.6.jar(可百度下载)

 

在src目录下创建配置文件:dbcpconfig.properties

内容如下:

#连接设置
driverClassName=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&characterEncoding=utf8&useSSL=true
username=root
password=123456

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

#最大连接数量
maxActive=50

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

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

#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->
maxWait=60000
#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:【属性名=property;
#注意:"user" "password" 两个属性会被明确地传递,因此这里不需要包含他们。
connectionProperties=useUnicode=true;characterEncoding=UTF8

#指定由连接池所创建的连接的自动提交(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

编写测试类:

(如报错,配置文件中useSSL=true改成useSSL=false)

package com.kuang.lesson05;

import com.kuang.lesson02.utils.JdbcUtils;
import com.kuang.lesson05.utils.JdbcUtils_DBCP;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.util.Date;

public class TestDBCP {

   public static void main(String[] args) {

       Connection conn = null;
       PreparedStatement ps = null;
       try {
           conn = JdbcUtils_DBCP.getConnection();
           // 区别与Statement
           // 使用“?”占位符代替参数
           String sql = "INSERT INTO `users`(`id`,`NAME`,`PASSWORD`,`email`,`birthday`) values(?,?,?,?,?)";


           ps = conn.prepareStatement(sql); // 预编译SQL,先写SQL,然后不执行

           // 手动给参数赋值
           ps.setInt(1,4); // 给id赋值
           ps.setString(2,"kuangshen");
           ps.setString(3,"1232112");
           ps.setString(4,"1232112@qq.com");
           // 注意点:sql.Date(数据库用的) java.sql.Date()
           //       util.Date(Java用的) new Date().getTime() 获得时间戳
           ps.setDate(5,new java.sql.Date(new Date().getTime()));

           // 执行
           int i = ps.executeUpdate();
           if(i > 0){
               System.out.println("插入成功!");
          }
      } catch (SQLException e) {
           e.printStackTrace();
      }finally {
           JdbcUtils_DBCP.relase(conn,ps,null);
      }

  }

}

C3P0

需要用到的jar包:c3p0-0.9.5.5.jar 、 mchange-commons-java-0.2.19.jar(可百度下载)

在src目录下创建配置文件:c3p0-config.xml

内容如下(这里代码直接把两个jdbcURL的useSSL=true改成useSSL=false了,若直接复制使用请结合自身情况确定是否修改):

<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
   <!--
c3p0的缺省(默认)配置
如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource();"这样写就表示使用的是c3p0的缺省(默认)-->
   <default-config>
       <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
       <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC</property>
       <property name="user">root</property>
       <property name="password">123456</property>

       <property name="acquireIncrement">5</property>
       <property name="initialPoolSize">10</property>
       <property name="minPoolSize">5</property>
       <property name="maxPoolSize">20</property>
   </default-config>
   <!--
         c3p0的命名配置
       如果在代码中"ComboPooledDataSource ds=new ComboPooledDataSource("MySQL");"这样写就表示使用的是mysql的缺省(默认)-->
   <named-config name="MySQL">
       <property name="driverClass">com.mysql.jdbc.Driver</property>
       <property name="jdbcUrl">jdbc:mysql://localhost:3306/jdbcstudy?useUnicode=true&amp;characterEncoding=utf8&amp;useSSL=false&amp;serverTimezone=UTC</property>
       <property name="user">root</property>
       <property name="password">123456</property>

       <property name="acquireIncrement">5</property>
       <property name="initialPoolSize">10</property>
       <property name="minPoolSize">5</property>
       <property name="maxPoolSize">20</property>
   </named-config>
</c3p0-config>

结论

无论使用什么数据源,本质都是一样的,DataSource接口不会变,方法就不会变

 
posted @   家兴Java  阅读(85)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示