数据库连接池的理解和使用方法_为什么要使用数据库连接池

数据库连接池的理解和使用方法_为什么要使用数据库连接池一、什么是数据库连接池?官方:数据库连接池(Connectionpooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。二…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

一、什么是数据库连接池?

官方:数据库连接池(Connection pooling)是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态地对池中的连接进行申请,使用,释放。
个人理解:创建数据库连接是一个很耗时的操作,也容易对数据库造成安全隐患。所以,在程序初始化的时候,集中创建多个数据库连接,并把他们集中管理,供程序使用,可以保证较快的数据库读写速度,还更加安全可靠。

二、数据库连接池的运行机制

(1) 程序初始化时创建连接池
(2) 使用时向连接池申请可用连接
(3) 使用完毕,将连接返还给连接池
(4) 程序退出时,断开所有连接,并释放资源

数据库连接池的理解和使用方法_为什么要使用数据库连接池

三、数据库连接池的使用

作为开源的数据库连接池,C3P0是一个优秀的连接池,性能也十分可靠。

首先到http://sourceforge.net/projects/c3p0/下载相应的jar包,总共三个,如下图所示。

 

数据库连接池的理解和使用方法_为什么要使用数据库连接池

其次将jar包导入到工程当中,然后就可以使用cp30了。

示例代码如下:

package com.zww.server;

import java.beans.PropertyVetoException;
import java.sql.Connection;
import java.sql.SQLException;
import com.mchange.v2.c3p0.ComboPooledDataSource;

public final class ConnectionManager {
	//使用单利模式创建数据库连接池
    private static ConnectionManager instance;
    private static ComboPooledDataSource dataSource;

    private ConnectionManager() throws SQLException, PropertyVetoException {
        dataSource = new ComboPooledDataSource();

        dataSource.setUser("root");		//用户名
        dataSource.setPassword("123456"); //密码
        dataSource.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/zww");//数据库地址
        dataSource.setDriverClass("com.mysql.jdbc.Driver");
        dataSource.setInitialPoolSize(5); //初始化连接数
        dataSource.setMinPoolSize(1);//最小连接数
        dataSource.setMaxPoolSize(10);//最大连接数
        dataSource.setMaxStatements(50);//最长等待时间
        dataSource.setMaxIdleTime(60);//最大空闲时间,单位毫秒
    }

    public static final ConnectionManager getInstance() {
        if (instance == null) {
            try {
                instance = new ConnectionManager();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return instance;
    }

    public synchronized final Connection getConnection() {
        Connection conn = null;
        try {
            conn = dataSource.getConnection();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return conn;
    }
}

下面是测试代码:

package com.zww.server;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.mysql.jdbc.jdbc2.optional.MysqlDataSource;


public class ConnectionDemo {

    public static void main(String[] args) throws SQLException {
        System.out.println("使用连接池................................");
        for (int i = 0; i < 20; i++) {
            long beginTime = System.currentTimeMillis();
            Connection conn = ConnectionManager.getInstance().getConnection();
            try {
                PreparedStatement pstmt = conn.prepareStatement("select * from event");
                ResultSet rs = pstmt.executeQuery();
                while (rs.next()) {
                	 // do nothing...
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }

            long endTime = System.currentTimeMillis();
            System.out.println("第" + (i + 1) + "次执行花费时间为:" + (endTime - beginTime));
        }

        System.out.println("不使用连接池................................");
        for (int i = 0; i < 20; i++) {
            long beginTime = System.currentTimeMillis();
           	MysqlDataSource mds = new MysqlDataSource();
           	mds.setURL("jdbc:mysql://localhost:3306/zww");
            mds.setUser("root");
            mds.setPassword("123456");
            Connection conn = mds.getConnection();
            try {
                PreparedStatement pstmt = conn.prepareStatement("select * from event");
                ResultSet rs = pstmt.executeQuery();
                while (rs.next()) {
                                    // do nothing...
                }
            } catch (SQLException e) {
                e.printStackTrace();
            } finally {
                try {
                    conn.close();
                } catch (SQLException e) {
                    e.printStackTrace();
                }
            }
            long endTime = System.currentTimeMillis();
            System.out.println("第" + (i + 1) + "次执行花费时间为:"
                                + (endTime - beginTime));
        }

    }

运行结果如下图所示:

数据库连接池的理解和使用方法_为什么要使用数据库连接池数据库连接池的理解和使用方法_为什么要使用数据库连接池

测试结果表明,在使用连接池时,只在第一次初始化时,比较耗时,完成初始化之后,使用连接池进行数据库操作明显比不使用连接池花费的时间少。

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/192511.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向

    [安全攻防进阶篇] 一.什么是逆向分析、逆向分析应用及经典扫雷游戏逆向安全攻防进阶篇将更加深入的去研究恶意样本分析、逆向分析、内网渗透、网络攻防实战等。第一篇文章先带领大家学习什么是逆向分析,然后详细讲解逆向分析的典型应用,接着通过OllyDbg工具逆向分析经典的游戏扫雷,再通过CheatEngine工具复制内存地址获取,实现一个自动扫雷程序。基础性文章,西电UI您有所帮助~

    2022年6月19日
    28
  • 漫步数理统计二十六——多元正态分布

    漫步数理统计二十六——多元正态分布本片博文介绍多元正态分布,我们以nn维随机变量为主,但给出n=2n=2时二元情况的一些实例。与上篇文章一样,我们首先介绍标准情况然后扩展到一般情况,当然这里会用到向量与矩阵符号。考虑随机向量Z=(Z1,…,Zn)′\mathbf{Z}=(Z_1,\ldots,Z_n)^\prime,其中Z1,…,ZnZ_1,\ldots,Z_n是独立同分布的N(0,1)N(0,1)随机变量,那么对z∈Rn,Z\ma

    2022年10月25日
    0
  • java 下载文件

    java 下载文件阅读原文1.以流的方式下载.publicHttpServletResponsedownload(Stringpath,HttpServletResponseresponse){try

    2022年6月30日
    21
  • 第 三 十 八 天:Apache 选 项 和 模 块 问 题 附:php

    第 三 十 八 天:Apache 选 项 和 模 块 问 题 附:php

    2021年9月10日
    41
  • uart 时序_8080接口时序

    uart 时序_8080接口时序数据传送速率用波特率来表示,指单位时间内载波参数变化的次数,或每秒钟传送的二进制位数  如每秒钟传送240个字符,而每个字符包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为2400Bd  传输时序如下图    在UART中,信号线上共有两种状态,分别用逻辑1(高电平)和逻辑0(低电平)来区分  在空闲时,数据线应该保持在逻辑高电平状态  其中…

    2022年9月14日
    0
  • findIndex()方法[通俗易懂]

    findIndex()方法[通俗易懂]findIndex()方法返回数组中通过测试的第一个元素的索引(作为函数提供)。findIndex()方法对数组中存在的每个元素执行一次函数:如果找到函数返回true值的数组元素,则findIndex()返回该数组元素的索引(并且不检查剩余值)否则返回-1注释:findIndex()不会为没有值的数组元素执行函数。注释:findIndex()不会改变原始数组。获取数组中第一个值等于或大于18的元素的索引:varages=[3,10,18,20];funct

    2022年10月26日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号