浅析数据库连接池(二)

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



总目录:

-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-阻塞系数),阻塞系数也应该根据我们具体情况来分析。

一般线程数为核心数的几倍。



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

时间: 2024-10-05 05:12:03

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

浅析数据库连接池(一)

由于近期项目要用到数据库连接池,所以今天简单的聊聊~, 这个话题的引起是由于我在写mysql数据库部分时产生了一个疑问,一般后台处理数据部分.服务端是创建一个connection连接到数据库,然后全部的请求通过这一个connection来訪问数据库,还是每一个连接创建一个connction?这个连接须要维持多久?-接下来一起看看 首先文件夹1,2是为了引出以下的连接池,由于一般我们仅仅是使用数据库,而忽略了一些内在的东西.这就可能会出现一些效率方面的问题. 4,5连接池的使用和最优连接池配置选择

[数据库连接池二]Java数据库连接池--C3P0和JDNI.

前言:上一篇文章中讲了DBCP的用法以及实现原理, 这一篇再来说下C3P0和JDNI的用法. 1.1.C3P0数据源 C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展.目前使用它的开源项目有Hibernate,Spring等.C3P0数据源在项目开发中使用得比较多. c3p0与dbcp区别 dbcp没有自动回收空闲连接的功能 c3p0有自动回收空闲连接功能 1.2.在应用程序中加入C3P0连接池 1.导入相关jar包    c3p0-0.

c++ 实现数据库连接池

c++ 实现数据库连接池 自己尝试用c++ 新标准实现了数据库连接池,代码简化了很多. 思路: 将数据库的连接当作一个对象添加进list队列中,在连接池创建的时候就建立好队列,并添加自定义大小的连接对象,连接对象用智能指针来管理(现代c++中不应该出现delete语句),避免类似内存泄漏等内存问题,智能指针上用lambda表达式注册了delete删除函数来释放连接资源,及时归还,(其中用了std::move来转移list中的对象所有权到函数里的临时智能指针对象,当离开作用域时,自动释放.) 关于

[数据库连接池] Java数据库连接池--DBCP浅析.

前言对于数据库连接池, 想必大家都已经不再陌生, 这里仅仅设计Java中的两个常用数据库连接池: DBCP和C3P0(后续会更新). 一. 为何要使用数据库连接池假设网站一天有很大的访问量,数据库服务器就需要为每次连接创建一次数据库连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.拓机.数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性能指标.数据库连接池正式针对这个问题提

数据库连接池浅析

简介 我从事的所有项目都用到了数据库连接池,这样做自然有它的理由.有时我们可能忘记了使用设计模式或者某种特定技术的理由,这时就值得我们反思为什么要使用它.每项技术或者每个技术决策都有它的优势和不足,如果不了解其缺点,你需要知道你失去了什么. 数据库连接池生命周期 数据库每个读写操作需要一个连接.数据库连接调用流如下图: 调用流程为: 应用数据层向DataSource请求数据库连接 DataSource使用数据库Driver打开数据库连接 创建数据库连接,打开TCP socket 应用读/写数据库

几种常见数据库连接池的使用比较

感觉在介绍之前有必要阐述一下连接池的几个概念,有助于后边一些文字的理解. 最原始的数据库使用就是打开一个连接并进行使用,使用过后一定要关闭连接释放资源.由于频繁的打开和关闭连接对jvm包括数据库都有一定的资源负荷,尤其应用压力较大时资源占用比较多容易产生性能问题.由此使用连接池的作用就显现出来,他的原理其实不复杂:先打开一定数量的数据库连接,当使用的时候分配给调用者,调用完毕后返回给连接池,注意返回给连接池后这些连接并不会关闭,而是准备给下一个调用者进行分配.由此可以看出连接池节省了大量的数据库

数据库连接池的理解和使用

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

javaweb学习总结(三十九)——数据库连接池

一.应用程序直接获取数据库连接的缺点 用户每次请求都需要向数据库获得链接,而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.拓机.如下图所示: 二.使用数据库连接池优化程序性能 2.1.数据库连接池的基本概念 数据库连接是一种关键的有限的昂贵的资源,这一点在多用户的网页应用程序中体现的尤为突出.对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性,影响到程序的性

01_数据库连接池,数据源,ResultSetMetaData,jdbc优化

 一.数据库连接池 1. 什么是连接池 传统的开发模式下,Servlet处理用户的请求,找Dao查询数据,dao会创建与数据库之间的连接,完成数据查询后会关闭数据库的链接. 这样的方式会导致用户每次请求都要向数据库建立链接而数据库创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库的资源,并且极易造成数据库服务器内存溢出.宕机. 解决方案就是数据库连接池 连接池就是数据库连接对象的一个缓冲池 我们可以先创建10个数