浅析数据库连接池(二)

2023-11-19

上一篇博客,主要是简单的介绍了普通数据库连接的过程以及耗费的资源,并且简单的谈了下连接池,这篇我们主要来看看数据库连接池的使用以及它最优的配置。


总目录:
-1.数据库连接过程是怎样的?
-2.连接所占用的资源有哪些?
-3.连接池简介
-4.连接池的使用
-5.最优连接池配置选择

今天主要看看4和5。


4.连接池的使用

这里我使用的是c3p0数据库连接池
简单的介绍一下c3p0:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate,Spring等。

连接池的种类也有很多,而且每种也有不同的适用场景,所以选择适合自己的连接池也是一方面~


先放不使用连接池和使用连接池的数据对比。
循环连接10次,图片为测试的第10组数据。

不使用连接池
这里写图片描述


使用连接池
红色为连接池部分配置信息
这里写图片描述


从图片我们可以明显的看出,连接池的速度要快于普通连接很多,这里很多不是指的二者差多少毫秒,而是倍数的差别。


java连接池代码:

import com.mchange.v2.c3p0.ComboPooledDataSource;

import java.awt.color.ProfileDataException;
import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ResourceBundle;

/**
 * Created by wwh on 15-6-10.
 */
public class DBPollClass {
    private static DBPollClass dbPoll;
    private ComboPooledDataSource dbSource;

    //静态代码块,一开始我们就执行构造函数加载配置信息
    static {
        dbPoll = new DBPollClass();
    }

    public DBPollClass(){
        //设置配置信息
        try{
            dbSource = new ComboPooledDataSource();
            dbSource.setUser("root");
            dbSource.setPassword("123456789");
            dbSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/XL_db?user=root&password=123456789&useUnicode=true");
            dbSource.setDriverClass("com.mysql.jdbc.Driver");
            dbSource.setInitialPoolSize(1);
            dbSource.setMinPoolSize(2);
            dbSource.setMaxPoolSize(10);
            dbSource.setMaxStatements(50);
            dbSource.setMaxIdleTime(60);
        }catch (PropertyVetoException e){
            throw new RuntimeException(e);
        }
    }

    //获得连接
    public final static DBPollClass getInstance(){
        return dbPoll;
    }

    public final Connection getConnection(){
        try{
            return dbSource.getConnection();
        }catch (SQLException e){
            throw new RuntimeException("无法获取连接", e);
        }
    }

    public static void main(String[] args) throws SQLException {
        for(int i = 0; i < 10; i++) {
            long begintime = System.currentTimeMillis();
            Connection con = null;
            try {
                //取得空闲连接
                con = dbPoll.getInstance().getConnection();
                //执行sql语句并返回查询结果
                //ResultSet rs = con.createStatement().executeQuery("SELECT * from UserInfo");
                //使用PreparedStatement而不使用Statement
                PreparedStatement pst = con.prepareStatement("SELECT * from UserInfo");
                ResultSet rs = pst.executeQuery();
                //输出查询结果
                while (rs.next()) {
                    System.out.println(rs.getObject(1) + " " + rs.getObject(2) + " " + rs.getObject(3) + " " + rs.getObject(4));
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (con != null) {
                    //归还空闲连接
                    con.close();
                }
            }
            long endtime = System.currentTimeMillis();
            System.out.println((i+1) + " time is:" + (endtime-begintime));
        }
    }
}

从代码我们可以和清晰的看出连接池的使用是非常简单的,代码中我将连接池的配置等信息写到了构造函数中,其实现实中使用我们一般写在c3p0-config.xml,数据库连接池的配置文件中,然后放到src目录下即可。
连接池的使用步骤和普通的JDBC连接数据库基本一样。参数也类似
只不过部分含义不同,连接池的connection,并不是创建连接,而是从数据库连接池中间找出一个空闲的连接,con.close()也不是断开连接,而是归还给连接池。
还有注意我们不仅仅要归还connection资源,还要归还Preparedstatement和ResultSet的资源
我们也需要养成良好的习惯使用Preparedstatement而不是statement,因为Preparedstatement里面包含了部分已经编译好的sql语句,可以提高执行速度。


5.最优连接池配置选择

使用和使用好两个词是截然不同的,我们的目的不仅仅是使用线程池或者数据库连接池,而是通过使用它们来发挥服务器最大威力以及效率达到最优。
这就要我们根据自己服务器配置信息来选择参数了~。
先看看代码中我们设定了哪些参数。

设置初始化连接池大小
dbSource.setInitialPoolSize(1);

设置连接池内最小连接数
dbSource.setMinPoolSize(2);

设置连接池内最大连接数
dbSource.setMaxPoolSize(10);

用来控制Preparedstatement的数量
dbSource.setMaxStatements(50);

最大空闲时间,60秒内未使用连接则被丢取,设置为0则永不丢弃
dbSource.setMaxIdleTime(60);
以上为常用和关键的参数。


关于最关键的参数设定
1.最小连接数
连接池一直保持的数据库连接。最小连接数的大小我们要根据实际的使用情况不断的测试来决定,如果设定大了就会有许多空闲的连接,浪费了资源。

2.最大连接数
连接池的连接上限,一般当连接值大于最小连接数时,连接池就会创建新的connection来接受连接,我们设定的超时时间就是针对新创建的连接的,当使用完最小连接数外的连接时,它们不会被立即释放,而是停留MaxIdleTime时间,如果在MaxIdleTime时间没有再次被连接,则释放。如果超过最大连接数,那么新到的连接会被加入到等待队列中。

3.最大空闲时间MaxIdleTime,这个要根据实际情况来调整设定了。

如果最小连接数和最大连接数相差很大,那么最先到的连接最获利,连接速度非常快,后到的会稍微慢点,因为要创建连接。

我们一般设定池的大小时,比如线程池,首先要确定是CPU密集型还是IO密集型,如果是CPU密集型,那么我们如果线程池设定应该和CPU核数几乎一致,因为此时大量的计算,如果线程数量设定过大,那么线程切换消耗的时间就是主要花费,如果是IO密集型,那么线程数量要大于CPU数量,因为线程可能阻塞在IO处,所以阻塞时要切换其他线程继续执行,效率会高。

那么访问数据库是IO密集型的,因为内部也是创建单独的线程来连接,所以类似线程池,线程池IO密集型线程数计算公式为:
线程数 = CPU核数 / (1-阻塞系数),阻塞系数也应该根据我们具体情况来分析。
一般线程数为核心数的几倍。


我就简单的介绍到这里,上面所说也是根据自己现有的知识和查询的资料来描述的,并不一定全部正确,希望大家带着审视的眼光来看,如果哪部分错了,还望指出,谢谢~

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

浅析数据库连接池(二) 的相关文章

  • 数仓相关知识点/笔记(OLTP和OLAP)

    现在实时数仓是一个非常火的趋势 最近开始逐渐了解一些数仓相关的东西 从基础的理论知识包括架构 算一个基础总结和学习记录吧 包括OLTP和OLAP 基础表和数据湖相关概念 不定期补充更新 联机事务处理OLTP和联机分析处理OLAP 关键词 日
  • 以太坊构建DApps系列教程(一):应用程序规则和区块链设置

    这将是一个如何使用以太坊区块链构建去中心化应用程序DApps的系列教程 第一篇教程重点介绍应用程序的规则和功能以及设置私有区块链 展示在使用或不使用DAO和应用程序的情况下如何构建自己自定义的以太坊代币 我们要构建3件事 自定义代币 使用代
  • maven如何引入第三方本地jar到项目,并打包部署?这篇文章给你答案

    应用场景 我对接农行的接口中 农行提供了一个openbank sdk java 1 3 1 jar 下载后令人头疼的事情就是怎么把这个jar引入到项目中呢 问题解决 maven如何将下载好的第三方库jar引入到项目中呢 1 在项目中创建一个

随机推荐

  • 408还是自主命题?计算机考研应该怎么选

    计算机考研一共考4科 政治 英语 数学 和专业课 专业课有两类选择 联考408和自主命题 联考408 408是教育部命题 不同的学校考试科目只要是408 就是相同的题目 历年真题在网络上都是公开的 公众号回复408即可获取408真题 学校也
  • 用Sublime写html,如何配置代码自动补全功能

    Sublime安装完成后 language设置中文 步骤一 下载汉化包 就是下图这个点击下载 步骤二 打开Sublime界面 点击菜单栏 gt preferences gt Browse Packages 点击后打开了一个文件夹 返回上一层
  • 2023年上半年BSP工程师年度总结报告

    尊敬的领导和团队成员 大家好 我是BSP工程师XXX 在这里向大家汇报2023年上半年的工作总结 在过去的半年里 我所负责的BSP工程师职责是支持和维护嵌入式系统的硬件和软件平台 我与团队密切合作 共同努力以确保我们的产品能够在各种嵌入式设
  • 怎样选择好的数字货币来进行投资?

    对区块链行业来说 2018年可以说是非常萧条的一年 因为许多投资者目睹并经历了非理性繁荣和泡沫破裂 对于普通投资者来说 投资数字现金通常面临两种风险 一是数字现金本身是否存在投机风险 二是数字现金交易平台存在的相关风险没有监管 数字货币自身
  • 碧蓝航线8.20服务器维护,碧蓝航线半人马来袭 8.20更新公告

    半人马来袭 碧蓝航线将于8月20日9 00 11 00对安卓 iOS全港区进行为期2小时的改造建设 维护后将开启限时活动 盛夏的半人马座 一起来看看吧 一 内容新增 1 开启限时活动 盛夏的半人马座 活动时间8月20日维护后 8月30日 完
  • List的size为1,没有内容,解决:stream过滤空值

    List
  • 精选

    作者 Joseph Rickert 翻译 黄小伟 先后从事游戏 社交及金融数据研究及应用 目前就职杭州有赞 9月份 共有126个R新包收录于CRAN 8月份收录R新包160个 增幅连续下降 当然 这是R包经历过数量上快速增长后的正常变化 本
  • pyg与graphgym

    一 配置问题 我用的显卡是ti3090 为驱动算力 cuda用11 0 软件环境是torch1 8 0 此时注意 graphgym需要安装版本为0 3 0 否则会由于版本过高 导致各种出错 如果要使用pyg 那么会容易遇到一个报错 File
  • Android usb通信 实现app与arduino通信demo

    Android usb通信 一 前言 二 开始 1 AndroidManifest xml清单文件 2 创建权限广播接收者 3 枚举usb设备 4 获取usb接口以及输入 输出端点 5 打开设备 6 设置波特率 7 创建接收数据的线程 8
  • 微信小程序如何将表单的数据发送到数据库,云开发,并实现将数据渲染到页面中

    一 表单数据发送到数据库 1 利用bindsubmit来写一个函数
  • 漏洞常规专业术语

    基础漏洞条例 VUL Vulnerability 漏洞 POC Proof of Concept 漏洞证明 漏洞报告中 通过一段描述或一个样例来证明漏洞确实存在 EXP Exploit 漏洞利用 某个漏洞存在EXP 意思就是该漏洞存在公开的
  • ubuntu 硬盘操作

    查看移动硬盘的文件系统名 以及空间使用情况 df hl 查看硬盘的格式类型 以及挂载位置 df T 挂载硬盘 fdisk l 查看磁盘信息 mount o rw dev sdb1 home test 挂载硬盘 o 指定挂载文件系统时的选项
  • 单选框互斥且可同时取消选中

    单选框互斥且可同时取消选中 div class b div
  • 你值得拥有——流星雨下的告白(Python实现)

    目录 1 前言 2 霍金说移民外太空 3 浪漫的流星雨展示 4 Python代码 1 前言 我们先给个小故事 提一下大家兴趣 然后我给出论据 得出结论 最后再浪漫的流星雨表白代码奉上 还有我自创的一首诗 开始啦 2 霍金说移民外太空 霍金说
  • 最新版FreeRTOS的移植------STM32F103c8t6

    系列文章目录 用FlyMcu和USB转TTL给stm32中烧录程序 stm32C8 C6 文章目录 系列文章目录 前言 一 先决条件 二 使用步骤 1 获取FreeRTOS源码 2 将freeRTOS相关文件移植进keil工程 3 修改相关
  • 如何在ubuntu上安装gcc

    首先查一下 有没有gcc 如下 然后准备安装gcc 1 sudo是授权 apt是一个应用管理工具 apt是本地存了一份软件包信息的列表 包括依赖 大小 vesion等 目的是为了在安装软件的时候快速检测依赖 并自动安装相关依赖 但在安装之前
  • 数据库原理及应用(MySQL版)MySQL实验指导参考答案(实验一到实验八)

    点赞 收藏 慢慢看 lt 一 gt 实验一 CREATE DATABASE STUDENTSDB USE STUDENTSDB CREATE TABLE STUDENT INFO 学号 CHAR 4 NOT NULL PRIMARY KEY
  • 百度文库免费复制word文档的纯文字

    2022年5月11日测试过 以下方法能正常使用 1 在页面中安F12或者从浏览器的设置中找到开发人员工具 2 切换到控制台 然后点击右上角图标进入更多设置 3 在设置 首选项中 找到 调试程序 然后勾选 禁用javascript 4 做完上
  • 微信支付的收款功能被限制了怎么办,收款受限制怎么解除?

    使用小程序做电商 商城的微信支付的收款功能会遇到被限制的情况 直接影响用户下单后的付款操作 其实也不单单是小程序 商城APP中也会冒出类似的提示 遇到这种事情不要慌 根据具体的异常提示给出不同的解决方案 微信支付被限制的错误提示 我们列举两
  • 浅析数据库连接池(二)

    上一篇博客 主要是简单的介绍了普通数据库连接的过程以及耗费的资源 并且简单的谈了下连接池 这篇我们主要来看看数据库连接池的使用以及它最优的配置 总目录 1 数据库连接过程是怎样的 2 连接所占用的资源有哪些 3 连接池简介 4 连接池的使用