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

简介: 数据库连接池(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 验证是否可以正常访问

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
7月前
|
负载均衡 算法 关系型数据库
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
本文聚焦 MySQL 集群架构中的负载均衡算法,阐述其重要性。详细介绍轮询、加权轮询、最少连接、加权最少连接、随机、源地址哈希等常用算法,分析各自优缺点及适用场景。并提供 Java 语言代码实现示例,助力直观理解。文章结构清晰,语言通俗易懂,对理解和应用负载均衡算法具有实用价值和参考价值。
大数据大厂之MySQL数据库课程设计:揭秘MySQL集群架构负载均衡核心算法:从理论到Java代码实战,让你的数据库性能飙升!
|
9月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
10月前
|
人工智能 JavaScript 关系型数据库
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
393 14
【02】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-ui设计图figmaUI设计准备-figma汉化插件-mysql数据库设计-优雅草卓伊凡商业项目实战
|
10月前
|
人工智能 JavaScript 安全
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
497 13
【01】Java+若依+vue.js技术栈实现钱包积分管理系统项目-商业级电玩城积分系统商业项目实战-需求改为思维导图-设计数据库-确定基础架构和设计-优雅草卓伊凡商业项目实战
|
11月前
|
SQL 监控 druid
Java Druid 面试题
Java Druid 连接池相关基础面试题
227 2
|
Java 数据库连接 数据库
如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面
本文介绍了如何构建高效稳定的Java数据库连接池,涵盖连接池配置、并发控制和异常处理等方面。通过合理配置初始连接数、最大连接数和空闲连接超时时间,确保系统性能和稳定性。文章还探讨了同步阻塞、异步回调和信号量等并发控制策略,并提供了异常处理的最佳实践。最后,给出了一个简单的连接池示例代码,并推荐使用成熟的连接池框架(如HikariCP、C3P0)以简化开发。
335 2
|
Java 数据库
案例一:去掉数据库某列中的所有英文,利用java正则表达式去做,核心:去掉字符串中的英文
这篇文章介绍了如何使用Java正则表达式从数据库某列中去除所有英文字符。
302 15
|
Java 关系型数据库 MySQL
数据库的连接用Java
本文介绍了如何使用Java连接MySQL数据库,包括注册JDBC驱动、创建数据库连接URL、设置数据库用户和密码、建立连接以及关闭连接的完整代码示例。
357 0
数据库的连接用Java
|
安全 算法 Java
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
本文提供了在数据库中对密码等敏感信息进行加盐加密的详细教程,包括手写MD5加密算法和使用Spring Security的BCryptPasswordEncoder进行加密,并强调了使用BCryptPasswordEncoder时需要注意的Spring Security配置问题。
1061 0
数据库信息/密码加盐加密 —— Java代码手写+集成两种方式,手把手教学!保证能用!
|
druid Java 数据库连接
SpringBoot项目整合MybatisPlus持久层框架+Druid数据库连接池,以及实现增删改查功能
SpringBoot项目整合MybatisPlus和Druid数据库连接池,实现基本的增删改查功能。
1531 0

热门文章

最新文章