我的编程空间,编程开发者的网络收藏夹
学习永远不晚

数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?

短信预约 信息系统项目管理师 报名、考试、查分时间动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?

数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?

早期我们怎么进行数据库操作呢?

1、原理:一般来说,Java应用程序访问数据库的过程是:

  • 加载数据库驱动程序;
  • 通过jdbc建立数据库连接;
  • 访问数据库,执行SQL语句;
  • 断开数据库连接。

2、代码

 1 //查询所有用户
 2 Public void FindAllUsers(){
 3     //1、装载sqlserver驱动对象
 4     DriverManager.registerDriver(new SQLServerDriver());
 5     //2、通过JDBC建立数据库连接
 6     Connection con = DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer","sa","123");
 7     //3、创建状态
 8     Statement state = con.createStatement();
 9     //4、查询数据库并返回结果
10     ResultSet result = state.executeQuery("select * from users");
11     //5、输出查询结果
12     while(result.next()){
13         System.out.println(result.getString("email"));
14     }
15     //6、断开数据库连接
16     result.close();
17     state.close();
18     con.close();
19 }

 3、分析

程序开发过程中,存在很多问题:

  首先,每一次web请求都要建立一次数据库连接。建立连接是一个费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。这个时间对于一次或几次数据库操作,或许感觉不出系统有多大的开销。可是对于现在的web应用,尤其是大型电子商务网站,同时有几百人甚至上千人在线是很正常的事。在这种情况下,频繁的进行数据库连接操作势必占用很多的系统资源,网站的响应速度必定下降,严重的甚至会造成服务器的崩溃。不是危言耸听,这就是制约某些电子商务网站发展的技术瓶颈问题。

  其次,对于每一次数据库连接,使用完后都得断开。否则,如果程序出现异常而未能关闭,将会导致数据库系统中的内存泄露,最终将不得不重启数据库。还有,这种开发不能控制被创建的连接对象数,系统资源会被毫无顾忌的分配出去,如连接过多,也可能导致内存泄漏,服务器崩溃。

  通过上面的分析,我们可以看出,“数据库连接”是一种稀缺的资源,为了保障网站的正常使用,应该对其进行妥善管理,其实我们查询玩数据库后,如果不关闭连接,而是暂时存放起来,当别人使用时,把这个连接给他们使用。就避免了一次建立数据库链接和断开的操作时间消耗。原理如下:

技术演进出来的数据库连接池

  由上面的分析可以看出,问题的根源就在于对数据库连接资源的低效管理。我们知道,对于共享资源,有一个著名的设计模式:资源池设计模式。该模式正是为了解决资源的频繁分配、释放所造成的问题。为解决上述问题,可以采用数据库连接池技术。数据库连接池的基本系思想就是为数据库连接建立一个“缓冲池”。预先在缓冲池中放入一定数量的连接,当需要建立数据库连接时,只需从“缓冲池”中取出一个,使用完毕之后再放回去。我们可以通过设定连接池最大连接数来防止系统无尽地与数据库连接。更为重要的是我们可以通过连接池的管理机制监视数据库的连接的数量、使用情况,为系统开发、测试及性能调整提供依据。

  我们自己尝试开发一个连接池,来为上面的查询业务提供数据库连接服务:

    1)编写class实现DataSource接口;

    2)在class的构造器一次性创建10个连接,将连接保存在LinkedList中;

    3)实现getConnection,从LinkedList中返回一个连接;

    4)提供将连接放回连接池中的方法;

1、连接池代码

 1 Pubic class MyDataSource implements DataSource{
 2     //因为LinkedList是用链表实现的,对于增删实现起来比较容易
 3     LinkedList dataSources = new LinkedList();
 4     //初始化连接数量
 5     public MyDataSource(){
 6     //问题:每次new MyDataSource都会建立10个连接,可使用单例设计模式解决此问题。
 7         for(int i=0;i<10;i++){
 8             try{
 9                 //1、装载sqlserver驱动对象
10                 DriverManager.registerDriver(new SQLServerDriver())
11                 //2、通过JDBC建立数据库连接
12                 Connection con =DriverManager.getConnection("jdbc:sqlserver://192.168.2.6:1433;DatabaseName=customer","sa","123");
13                 //3、将连接加入连接池中
14                 dataSources.add(con);
15             }catch(Exception e){
16                 e.printStackTrace();
17             }
18         }
19     }
20     public Connection getConnection() throws SQLException{
21         //取出连接池中一个连接
22         final Connection conn = dataSources.removeFirst();//删除第一个连接返回
23         return conn;
24     }
25     //将连接放回连接池
26     public void releaseConnection(Connection conn){
27         dataSources.add(conn);
28     }
29 }

2、使用连接池重构我们的用户查询函数

 1 //查询所有用户
 2 Public void FindAllUsers(){
 3     //1、使用连接池建立数据库连接
 4     MyDataSources dataSources = new MyDataSources();
 5     Connection conn = dataSources.getConnection();
 6     //2、创建状态
 7     Statement state = con.createStatement();
 8     //3、查询数据库并返回结果
 9     ResultSet result =state.executeQuery("select * from users");
10     //4、输出查询结果
11     while(result.next()){
12         System.out.println(result.getString("email"));
13     }
14     //5、断开数据库连接
15     result.close();
16     state.close();
17     //6、归还数据库链接给连接池
18     dataSources.releaseConnection(conn);
19 }

 连接池的工作原理:

 连接池的核心思想是连接的复用,通过建立一个数据库连接池以及一套连接使用、分配和管理策略,使得该连接池中的连接可以得到高效、安全的复用,避免了数据库连接频繁简历和关闭的开销。

 连接池的工作原理主要由三部分组成,分别为连接池的建立,连接池中连接的使用管理,连接池的关闭。

 第一、连接池的建立。一般在系统初始化时,连接池会根据系统配置建立,并在池中建立几个连接对象,以便使用时能从连接池中获取。Java中提供了很多容器类,可以方便的构建连接池,例如Vector(线程安全类)、linkedlist等。

 第二、连接池的管理。连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其策略是:

  当客户请求数据库链接时,首先查看连接池中是否有空闲连接,如果存在空闲连接,则将连接分配给用户使用并作相应处理(即标记该连接为正在使用,引用计数加1);如果没有空闲连接,则查看当前所开的连接数是否已经达到最大连接数,如果没有达到最大连接数,就重新创建一个连接给请求的用户;如果达到,就按设定的最大等待时间进行等待,如果超出最大等待时间,则抛出异常给客户。

  当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过了就从连接池中删除该链接,并判断当前连接池内总的连接数是否小于最小连接数,若小于就将连接池充满;如果没超过就将该连接标记为开放状态,可供再次复用。

 第三、连接池的关闭。当应用程序退出时,关闭连接池中所有的连接,释放连接池相关资源,该过程正好与创建相反。

连接池的主要优点:

  1)减少连接的创建时间。连接池中的连接是已准备好的,可以重复使用的,获取后可以直接访问数据库,因此减少了连接创建的次数和时间。

  2)更快的系统响应速度。数据库连接池在初始化过程中,往往已经创建了若干个数据库连接置于池中备用。此时连接的初始化工作均已完成。对于业务请求处理而言,直接利用现有可用连接,避免了数据库连接初始化和释放过程的时间开销,从而缩减了系统整体响应时间。

  3)统一的连接管理。如果不使用连接池,每次访问数据库都需要创建一个连接,这样系统的稳定性受系统的连接需求影响很大,很容易产生资源浪费和高负载异常。连接池能够使性能最大化,将资源利用控制在一定的水平之下。连接池能控制池中的连接数量,增强了系统在大量用户应用时的稳定性。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?

早期我们怎么进行数据库操作呢?1、原理:一般来说,Java应用程序访问数据库的过程是:加载数据库驱动程序;通过jdbc建立数据库连接;访问数据库,执行SQL语句;断开数据库连接。2、代码 1 //查询所有用户 2 Public void FindAllUser
数据库连接池的原理?连接池使用什么数据结构实现?实现连接池?
2015-09-26

C++怎么实现数据库连接池

本文小编为大家详细介绍“C++怎么实现数据库连接池”,内容详细,步骤清晰,细节处理妥当,希望这篇“C++怎么实现数据库连接池”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。项目背景为了提高Mysql数据库的访问瓶颈
2023-07-05

JDBC数据库连接池 怎么实现

本篇内容介绍了“JDBC数据库连接池 怎么实现”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!什么情况下使用连接池?对于一个简单的数据库应用,
2023-06-02

Spring数据库连接池实现原理实例分析

这篇“Spring数据库连接池实现原理实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring数据库连接池实现原理
2023-07-04

java数据库连接池如何实现

Java数据库连接池可以通过以下步骤实现:1. 导入相应的依赖库:你需要导入数据库驱动程序和连接池的相关依赖库。一般来说,你需要使用特定数据库供应商提供的JDBC驱动程序,并选择一个连接池实现(如Apache Commons DBCP、Hi
2023-09-16

PHP数据库连接的进阶技巧:连接池和连接池管理

在 php 中,连接池是一种预先建立数据库连接并保存在池中的策略,当应用程序需要时可从池中获取连接,用完后归还。连接池的优点包括:减少开销提升性能可扩展性可以使用 doctrine dbal 库实现连接池:配置连接参数创建连接池连接使用连接
PHP数据库连接的进阶技巧:连接池和连接池管理
2024-05-21

Python中怎么实现数据库连接池

这篇文章将为大家详细讲解有关Python中怎么实现数据库连接池,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。示例:#-*-coding:utf-8-*- import threading,
2023-06-17

Scala数据库连接池的简单实现

本文主要介绍了Scala数据库连接池的简单实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
2023-02-09

Java操作数据库——使用连接池连接数据库

传统方式和连接池方式传统方式的步骤使用传统方式在Java中使用JDBC连接数据库,完成一次数据库的操作,一般有以下几个步骤:1. 加载驱动。2. 建立连接。3. 执行SQL语句。4. 释放连接。5. 传统方式的弊端每一次对数据库的操作都要建立一次连接,并且会将
Java操作数据库——使用连接池连接数据库
2014-08-26

python数据库连接池中数据库连接池技术的优点是什么

本篇文章给大家分享的是有关python数据库连接池中数据库连接池技术的优点是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。昨天测试了一下开500个线程去请求数据库,不过这个
2023-06-17

数据库连接池DBUtils使用

一、简介  DBUtils简单说python实现的线程化数据库连接(连接池),DBUtils支持所有遵循DP-API 2规范的数据库连接模块,例如:mysql、sqlserver、oracle、sqlite3等,更多请参考官网:https:
2023-01-30

数据库连接池是什么

数据库连接池是一种用于管理和分配数据库连接资源的技术,它可以有效地提高数据库的性能和可扩展性。在传统的数据库访问方式中,每次需要与数据库建立连接时都会消耗一定的时间和资源。而连接池技术可以将这些已经建立的连接保存起来,供其他需要访问数据库的
数据库连接池是什么
2024-02-22

jdbc连接池怎么实现数据库访问

JDBC连接池是一种管理数据库连接的技术,它可以提供可用的数据库连接给应用程序使用,从而提高数据库访问的性能和效率。以下是实现JDBC连接池的一般步骤:1. 导入相关的JDBC驱动程序:根据使用的数据库类型,需要导入相应的JDBC驱动程序。
2023-09-15

使用druid如何实现配置数据库连接池

本篇文章为大家展示了使用druid如何实现配置数据库连接池 ,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。druid的配置项如下配置缺省值说明name 配置这个属性的意义在于,如果存在多个数据源,监
2023-05-31

基于C++实现Mysql数据库连接池实例

目录项目技术点项目意义项目实现Connection设计ConnectionPool设计项目复杂接口细节刨析项目技术点C语言进行mysql数据库编程无锁单例基于STL队列加C++11新特性保证线程安全实现的生产者消费者模型C++11多线程编
2022-12-07

Python实现Mysql数据库连接池实例详解

python连接Mysql数据库:Python编程中可以使用MySQLdb进行数据库的连接及诸如查询/插入/更新等操作,但是每次连接MySQL数据库请求时,都是独立的去请求访问,相当浪费资源,而且访问数量达到一定数量时,对mysql的性能会
2022-06-04

编程热搜

目录