数据库连接池(C3P0、Druid的使用)java

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 数据库连接池(C3P0、Druid的使用)java

数据库连接池(C3P0、Druid的使用)java


数据库连接池

项目中肯定会使用数据库连接池

项目中一般使用druid

C3P0

基本用法

package com.qfedu.c3p0;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class App {
  public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
//    test1();
    test2();
  }
  public static void test1() throws Exception {
    // 创建c3p0的数据库池连接对象
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    // 配置
    dataSource.setDriverClass("com.mysql.cj.jdbc.Driver");
    dataSource.setJdbcUrl("jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&useSSL=false");
    dataSource.setUser("root");
    dataSource.setPassword("root");
    // 初始连接数
    dataSource.setInitialPoolSize(3);
    // 最大连接数
    dataSource.setMaxPoolSize(10);
    // 最大空闲时间,单位毫秒
    dataSource.setMaxIdleTime(2000);
    // 通过连接池获取连接对象
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
    // 将连接对象还回连接池
    connection.close();
  }
  /**
   * 读取c3p0的配置文件
   * 正常的url jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&useSSL=false
   * &在xml中属于特殊符号,所以在xml中需要使用 实体符号 &替换
   * <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&amp;userSSL=false</property>
   * 
   * @throws Exception
   */
  public static void test2() throws Exception {
    // 自动读取src下的c3p0-config.xml
    // 默认加载<default-config>中的配置
    ComboPooledDataSource dataSource = new ComboPooledDataSource();
    // 获取连接对象
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
    // “关闭”连接对象,将连接对象还回连接池
    connection.close();
  }
}
<?xml version="1.0" encoding="UTF-8"?>
<c3p0-config>
  <default-config>
     <property name="driverClass">com.mysql.cj.jdbc.Driver</property>
     <property name="jdbcUrl">jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&amp;useSSL=false</property>
     <property name="user">root</property>
     <property name="password">root</property>
     <property name="initialPoolSize">3</property>
     <property name="maxPoolSize">6</property>
     <property name="maxIdleTime">2000</property>
  </default-config>
  <named-config name="myconfig">
     <property name="driverClass">com.mysql.jdbc.Driver</property>
     <property name="jdbcUrl">jdbc:mysql:///supermarket</property>
     <property name="user">root</property>
     <property name="password">root</property>
     <property name="initialPoolSize">3</property>
     <property name="maxPoolSize">6</property>
     <property name="maxIdleTime">2000</property>
  </named-config>
</c3p0-config>

结合DBUtils

package com.qfedu.utils;
import org.apache.commons.dbutils.QueryRunner;
import com.mchange.v2.c3p0.ComboPooledDataSource;
public class C3P0Utils {
  // ComboPooledDataSource 实现 jdbc中的DataSource接口
  private static ComboPooledDataSource dataSource = null;
  // 创建连接池对象
  static {
    dataSource = new ComboPooledDataSource();
  }
  public static QueryRunner getQueryRunner() {
    // javax.sql.DataSource
    // QueryRunner(DataSource ds)
    // 将DBUtils和数据库连接池产生了关联
    // QueryRunner内部维护连接对象
    return new QueryRunner(dataSource);
  }
}
public static void test2() throws Exception {
    QueryRunner qr = C3P0Utils.getQueryRunner();
    String sql = "select count(*) from t_person";
    // QueryRunner内部维护连接对象,调用query,不需要connection参数
    // 执行完,也不需要手动关闭connection对象
    Long count = qr.query(sql, new ScalarHandler<Long>());
    System.out.println(count);
  }

Druid

基本用法

package com.qfedu.druid;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.ScalarHandler;
import com.alibaba.druid.pool.DruidDataSourceFactory;
import com.qfedu.utils.DruidUtils;
public class App {
  public static void main(String[] args) throws Exception {
    // TODO Auto-generated method stub
//    test1();
    test2();
  }
  public static void test1() throws Exception {
    // 通过Properties加载properties文件中内容
    FileInputStream inputStream = new FileInputStream("src/druid.properties");
    Properties prop = new Properties();
    prop.load(inputStream);
    // 获取连接池对象
    // javax.sql.DataSource
    DataSource dataSource = DruidDataSourceFactory.createDataSource(prop);
    Connection connection = dataSource.getConnection();
    System.out.println(connection);
    connection.close();
  }
  public static void test2() throws Exception {
    QueryRunner queryRunner = DruidUtils.getQueryRunner();
    String sql = "select count(*) from t_person";
    Long count = queryRunner.query(sql, new ScalarHandler<Long>());
    System.out.println(count);
  }
}
# \u6587\u4EF6\u540D druid.properties \u5B58\u50A8\u5728src\u76EE\u5F55\u4E0B
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/db2210?serverTimezone=Asia/Shanghai&useSSL=true
username=root
password=root
# \u521D\u59CB\u5316\u6570\u636E\u5E93\u8FDE\u63A5\u6C60\u4E2D\u8FDE\u63A5\u4E2A\u6570
initialSize=5
# \u6700\u5927\u4E2A\u6570
maxActive=20
# TimeOut \u7B49\u5F85\u8D85\u65F6\u65F6\u95F4
maxWait=2000

结合DButils

package com.qfedu.utils;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbutils.QueryRunner;
import com.alibaba.druid.pool.DruidDataSourceFactory;
public class DruidUtils {
  private static DataSource dataSource = null;
  static {
    try {
      FileInputStream inputStream = new FileInputStream("src/druid.properties");
      Properties prop = new Properties();
      prop.load(inputStream);
      // 创建连接池对象
      dataSource = DruidDataSourceFactory.createDataSource(prop);
    } catch (Exception e) {
      // TODO Auto-generated catch block
      e.printStackTrace();
    }
  }
  /**
   * 创建QueryRunner对象,一定要注意,参数使用连接池对象
   * @return
   */
  public static QueryRunner getQueryRunner() {
    return new QueryRunner(dataSource);
  }
}

Web服务器

C/S Client/Server

B/S Browser/Server 浏览器/服务端

借助Http协议

Http协议介绍 了解

请求-响应协议

浏览器端发送http请求,服务端根据请求,向浏览器端返回响应的数据

请求

请求行 请求头 请求体(post)

提交方式:主要get post

get方式将提交的数据放在url,不安全;post方式将提交的数据放在请求体中

get方法提交的数据大小有限制;post方式提交的数据,大小无限制

get方式相对快,缓存静态资源

get一般用于查询,post一般用于修改和添加

响应

响应行 响应头 响应体

响应状态:200 302 404 500

Tomcat基本介绍

更适合中小项目

使用tomcat,一定要配置 JAVA_HOME环境变量

验证:bin下面运行startup.bat ,启动tomcat服务器

浏览器中 http://localhost:8080 验证是否可以正常访问

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
4月前
|
监控 Java 数据库连接
Java中的数据库连接池详解
Java中的数据库连接池详解
|
24天前
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
46 2
|
4月前
|
SQL druid Java
线程池相关故障问题之Druid数据库连接池中,为何需要设置TransactionTimeout
线程池相关故障问题之Druid数据库连接池中,为何需要设置TransactionTimeout
135 0
|
1月前
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
50 15
|
4月前
|
Prometheus 监控 Cloud Native
如何优化Java中的数据库连接池配置?
如何优化Java中的数据库连接池配置?
|
1月前
|
Java 关系型数据库 MySQL
数据库的连接用Java
本文介绍了如何使用Java连接MySQL数据库,包括注册JDBC驱动、创建数据库连接URL、设置数据库用户和密码、建立连接以及关闭连接的完整代码示例。
30 0
数据库的连接用Java
|
1月前
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
145 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
3月前
|
Java 数据库连接 网络安全
JDBC数据库编程(java实训报告)
这篇文章是关于JDBC数据库编程的实训报告,涵盖了实验要求、实验环境、实验内容和总结。文中详细介绍了如何使用Java JDBC技术连接数据库,并进行增删改查等基本操作。实验内容包括建立数据库连接、查询、添加、删除和修改数据,每个部分都提供了相应的Java代码示例和操作测试结果截图。作者在总结中分享了在实验过程中遇到的问题和解决方案,以及对Java与数据库连接操作的掌握情况。
JDBC数据库编程(java实训报告)
|
3月前
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
353 0
|
4月前
|
NoSQL Java 数据库
数据库问题之使用jmap命令获取Java堆信息如何解决
数据库问题之使用jmap命令获取Java堆信息如何解决
34 0
下一篇
无影云桌面