-
2020-07-23 17:51:04
一、什么是连接池?
数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;
释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏。
———以上参考《百度百科》
二、为什么使用数据连接池
建立一个数据库连接是一件非常耗时(消耗时间)耗力(消耗资源)的事情。之所以会这样,是因为连接到数据库服务器需要经历几个漫长的过程:建立物理通道(例如套接字或命名管道),与服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证,运行检查以便在当前事务中登记等等。
连接池就是这样一个容器:它存放了一定数量的与数据库服务器的物理连接。因此,当我们需要连接数据库服务器的时候,只需去池(容器)中取出一条空闲的连接,而不是新建一条连接。这样的话,我们就可以大大减少连接数据库的开销,从而提高了应用程序的性能。
三、数据库连接池的工作原理
连接池的工作原理主要由三部分组成,分别为
- 连接池的建立
- 连接池中连接的使用管理
- 连接池的关闭
第一、连接池的建立。
一般在系统初始化时,连接池会根据系统配置建立,并在池中创建了几个连接对象,以便使用时能从连接池中获取。连接池中的连接不能随意创建和关闭,这样避免了连接随意建立和关闭造成的系统开销。Java中提供了很多容器类可以方便的构建连接池,例如Vector、Stack等。
第二、连接池的管理。
连接池管理策略是连接池机制的核心,连接池内连接的分配和释放对系统的性能有很大的影响。其管理策略是:当客户请求数据库连接时,
- 1)如果池中有空闲连接可用,返回该连接。
- 2)如果没有空闲连接,池中连接都已用完,创建一个新连接添加到池中。
- 3)如果池中连接已达到最大连接数,请求按设定的最大等待时间进入等待队列直到有空闲连接可用。
- 4)如果超出最大等待时间,则抛出异常给客户。
当客户释放数据库连接时,先判断该连接的引用次数是否超过了规定值,如果超过就从连接池中删除该连接,否则保留为其他客户服务。
该策略保证了数据库连接的有效复用,避免频繁的建立、释放连接所带来的系统资源开销。
如果连接长时间空闲,或检测到与服务器的连接已断开,连接池管理器也会将该连接从池中移除。
第三、连接池的关闭。
当应用程序退出时,关闭连接池中所有的连接,释放连接池相关的资源,该过程正好与创建相反。四、连接池需要注意的点
1、并发问题
为了使连接管理服务具有最大的通用性,必须考虑多线程环境,即并发问题。
这个问题相对比较好解决,因为各个语言自身提供了对并发管理的支持像java,c#等等,使用synchronized(java)lock(C#)关键字即可确保线程是同步的。
2、事务处理
我们知道,事务具有原子性,此时要求对数据库的操作符合“ALL-OR-NOTHING”原则,即对于一组SQL语句要么全做,要么全不做。
我们知道当2个线程共用一个连接Connection对象,而且各自都有自己的事务要处理时候,对于连接池是一个很头疼的问题,因为即使Connection类提供了相应的事务支持,可是我们仍然不能确定那个数据库操作是对应那个事务的,这是由于我们有2个线程都在进行事务操作而引起的。
为此我们可以使用每一个事务独占一个连接来实现,虽然这种方法有点浪费连接池资源但是可以大大降低事务管理的复杂性。
3、连接池的分配与释放
连接池的分配与释放,对系统的性能有很大的影响。合理的分配与释放,可以提高连接的复用度,从而降低建立新连接的开销,同时还可以加快用户的访问速度。
对于连接的管理可使用一个List。即把已经创建的连接都放入List中去统一管理。每当用户请求一个连接时,系统检查这个List中有没有可以分配的连接。如果有就把那个最合适的连接分配给他,如果没有就抛出一个异常给用户。
4、连接池的配置与维护
连接池中到底应该放置多少连接,才能使系统的性能最佳?
系统可采取设置**最小连接数(minConnection)和最大连接数(maxConnection)**等参数来控制连接池中的连接。
比方说,最小连接数是系统启动时连接池所创建的连接数。如果创建过多,则系统启动就慢,但创建后系统的响应速度会很快;如果创建过少,则系统启动的很快,响应起来却慢。这样,可以在开发时,设置较小的最小连接数,开发起来会快,而在系统实际使用时设置较大的,因为这样对访问客户来说速度会快些。
最大连接数是连接池中允许连接的最大数目,具体设置多少,要看系统的访问量,可通过软件需求上得到。
如何确保连接池中的最小连接数呢?
有动态和静态两种策略。
动态即每隔一定时间就对连接池进行检测,如果发现连接数量小于最小连接数,则补充相应数量的新连接,以保证连接池的正常运转。静态是发现空闲连接不够时再去检查。更多相关内容 -
Qt 多线程连接数据库——数据库连接池
2020-09-07 20:48:28* 数据库连接池特点: * 获取连接时不需要了解连接的名字,连接池内部维护连接的名字 * 支持多线程,保证获取到的连接一定是没有被其他线程正在使用 * 按需创建连接,可以创建多个连接,可以控制连接的数量 * 连接... -
Java中常用的数据库连接池_动力节点Java学院整理
2020-08-29 19:21:32数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个;释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接而引起的数据库连接遗漏 -
防止数据库连接池耗尽的超时时间设置
2021-01-19 14:51:53防止数据库连接池耗尽的超时时间设置中文社区 (MOSC)中间件 (MOSC)0 RepliesLast updated on March 27, 20151 WebLogic Server自动回收使用超时的连接WebLogic Server 数据源的配置项: Admin Console ->...防止数据库连接池耗尽的超时时间设置
中文社区 (MOSC)
中间件 (MOSC)
0 Replies
Last updated on March 27, 2015
1 WebLogic Server自动回收使用超时的连接
WebLogic Server 数据源的配置项: Admin Console -> JDBC Data Source: Configuration: Connection Pool -> "Inactive Connection Timeout"
设置为大于0的秒数。WebLogic Server 将自动检测出使用时间过长的连接并强制收回, 输出警告信息到日志文件:BEA-001153: Forcibly releasing inactive connection. 占用时间过长的连接分为两种情形: 一是应用程序有bug, 没有调用javax.sql.Connection.close()归还连接, 另一种是长时间执行SQL一直没有完成。
2 设置 JDBC SQL Statement Timeout
WebLogic Server 数据源的配置项: Admin Console -> JDBC Data Source: Configuration: Connection Pool -> "Statement Timeout"
设置为大于0的秒数。当SQL语句执行时间过长, 超过这个时间时Oracle JDBC驱动程序会抛出java.sql.SQLException: ORA-01013: user requested cancel of current operation. 这个特性依赖于JDBC驱动程序如何实现java.sql.Statement.setQueryTimeout()方法。
3 JDBC driver Socket Timeout
WebLogic Server 数据源的配置项: Admin Console -> JDBC Data Source: Configuration: Connection Pool, 在"Properties"输入框输入属性名字和值,每行一个。例如 Oracle JDBC driver 支持的:
oracle.net.READ_TIMEOUT=30000
oracle.jdbc.ReadTimeout=30000
当 Socket 操作因为网络问题或者数据库服务器端没有回应导致超过这个时间, Oracle JDBC driver 会抛出 java.sql.SQLRecoverableException:To view full details, sign in with your My Oracle Support Community account.
Don't have a My Oracle Support
Community account? Click to get started!
My Oracle Support provides customers with access to over a million knowledge articles and a vibrant support community of peers and Oracle experts.
Oracle offers a comprehensive and fully integrated stack of cloud applications and platform services. For more information about Oracle (NYSE:ORCL), visit oracle.com. © Oracle | Contact and Chat | Support | Communities | Connect with us
| Legal Notices | Terms of Use
-
数据库连接池
2022-02-11 16:48:34什么是数据库连接池 数据库连接池(connection pool)是程序启动时建立多个数据库连接,并将这些连接组成一...对于业务请求而言,直接利用连接池中的可用连接,避免了数据库连接的创建和释放,从而缩减了系统整体响应时间什么是数据库连接池
数据库连接池(connection pool)是程序启动时建立多个数据库连接,并将这些连接组成一个连接池,统一进行管理,由程序动态地对池中的链接进行申请,使用,释放。
为什么使用连接池
- 资源复用
数据库连接得到复用,避免了频繁的创建、释放连接带来的性能开销,减少内存碎片。
- 更快的系统相应速度
数据库连接池初始化时,已经创建多个数据库连接置于池中备用。此时连接的初始化工作已经完成。对于业务请求而言,直接利用连接池中的可用连接,避免了数据库连接的创建和释放,从而缩减了系统整体响应时间。
- 统一的连接管理,避免数据库连接泄露
数据库连接由连接池统一管理,最后由连接池统一对连接进行析构,防止有连接没有析构,导致资源泄露
- 避免多个线程同时使用一个连接
数据库连接并不是线程安全的,连接池可以防止多个线程同时使用一个连接。
那可不可以一个线程绑定一个线程呢?
这样肯定是可以的,但是如果这样的话,代码的耦合性太高。使用连接池的方式,耦合性低,可修改性更好。
数据库连接的生命周期
-
TCP三次握手
-
Mysql认证三次握手
-
SQL执行
-
Mysql的关闭
-
TCP四次挥手
所以数据库连接一般使用的是长连接,如果每次执行SQL都要新建连接的话,连接和释放的代价太大。
数据库连接池使用的也是长连接。
数据库连接池运行机制
从连接池获取或创建可用连接;
使用完毕后,把连接返回给连接池;
在系统关闭前,断开所有连接并释放连接占用的系统资源;
连接池和线程池的关系
连接池和线程池的区别
- 线程池:主动调用任务,当任务队列不为空的时候从队列取任务执行。
- 连接池:被动被任务使用。当某个任务需要操作数据库时,从连接池中取出一个连接对象,当任务使用完该连接对象后,将该连接对象返还给连接池。
连接池可以和线程池一起使用,一般连接池连接数量和线程池线程数量一致。
连接池设计
连接池CDBPool设计
构造函数
初始化
获取连接
归还连接
线程池析构
析构连接池的时候,需要注意析构的顺序:
- 先销毁线程池,确保所有任务都已经执行完退出,已经归还了数据库连接;
- 再去销毁连接池
数据库重连机制
Mysql和redis
Mysql重连机制
设置启用自动重连
my_bool reconnect = true;
mysql_options(m_mysql, MYSQL_OPT_RECONNECT, &reconnect); // 配合mysql_ping实现自动重连
检测连接是否正常
int STDCALL mysql_ping(MYSQL *mysql);
描述:
检查与服务端的连接是否正常。连接断开时,如果自动重新连接功能未被禁用,则尝试重新连接服务
器。该函数可被客户端用来检测闲置许久以后,与服务端的连接是否关闭,如有需要,则重新连接。
返回值:
连接正常,返回0;如有错误发生,则返回非0值。返回非0值并不意味着服务器本身关闭掉,也有可能
是网络原因导致网络不通。
Redis重连机制
-
使用之前检测连接是否可用
-
使用过程中出现连接异常则释放异常
-
下一次使用该连接的时候如果发现连接不可用则重新初始化
连接池连接数量设置
连接数设置成多少比较合适?
一般经验公式,如果CPU核数是N
- 对于计算密集型,连接数和线程数设置成N + 1;
- 对于io密集型,设置成 2 * N + 2。
- 对于计算+io密集型,可以算一下计算时间占总的任务时间的比例,最后算出单个CPU的饱和线程数量,同个这个来设置线程数和连接数。
执行同一个任务:
- 计算时间,不调用设计io的函数
- 计算时间+io时间 = 总的任务时间。
单个CPU的饱和线程数 = 1 / (计算时间 / 总的任务时间)
最终线程数 = 单个CPU的饱和线程数 * CPU核数
上面的这些,仅仅是经验公式,最终还是要根据具体业务结合在一起,经过大量测试,设置适合的参数。
-
SpringBoot笔记 —— 数据库连接池
2021-11-12 23:48:48首先写一个测试类,来看一下连接池的运行过程 package com.demo.spring.test; import org.apache.commons.dbcp2.BasicDataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java....在这之前,我们使用的都是JDBCUtil工具类来获取数据库的连接,但是实际上是每次执行方法都新建一条连接(一般的方法流程是建立连接,执行sql,释放连接)。频繁的创建连接,和断开连接不仅麻烦,而且需要消耗的资源也很大。
我们可以使用连接池,来避免每个方法执行时都新建一条连接。连接池中有着多条已经建立好并且不会断开的连接,当方法或者说客户需要数据库连接时,就从连接池中获取一条连接,然后使用,使用完成后调用close方法。这里的close方法的作用不是关闭连接,而是将连接放回连接池,让其他客户使用。
连接池的原理是:
- 事先创建一个类似于JDBCUtil一样的工具类,这个工具类里面存放着连接池的信息。这些信息包括一个连接池的实例DataSource,连接池的大小,也就是最多可以存放多少条连接,以及连接数据库的各项信息。最后有一个方法,让外界可以调用这个方法从而获取连接池里面的连接。
- 当客户需要数据库连接时,先向连接池进行请求
(1)连接池中有空闲连接,则分配给客户使用,并将该连接置为“正在使用”状态
(2)连接池中没有空闲连接,则查看连接池的连接数是否超过最大值
————(a)如果没超过,则创建一条新的连接,并返回给客户使用,并将该连接置为“正在使用”状态
————(b)如果已经超过,则客户进入等待状态,超出等待时间则返回异常信息
(3)客户使用连接完毕后,调用close方法,将连接从“正在使用状态”置为“空闲状态”,从而让其他客户使用
使用连接池还有一个好处,如果在使用过程中,mysql数据库突然离线,那么以前的JDBCUtil数据库只会进行一次连接,连接断开也不会重新连接。而客户获取连接池中的连接时,如果连接断开,就会选择另外一条连接,并且尝试重新建立数据库的连接。
首先写一个测试类,来看一下连接池的运行过程
package com.demo.spring.test; import org.apache.commons.dbcp2.BasicDataSource; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class DBCPTest { public static void main(String[] args) throws SQLException { // 创建连接池 BasicDataSource bds = new BasicDataSource(); // 配置连接池大小,这里数字为5说明连接池中最多有5条连接 bds.setInitialSize(5); //配置连接信息 bds.setUrl("jdbc:mysql://master:3306/show1"); bds.setDriverClassName("com.mysql.jdbc.Driver"); bds.setUsername("root"); bds.setPassword("123456"); //获取连接 Connection connection = bds.getConnection(); PreparedStatement statement = connection.prepareStatement("select * from userInfo"); ResultSet resultSet = statement.executeQuery(); while (resultSet.next()){ System.out.println(resultSet.getString("username")); } // 关闭连接 等于重新放回连接池 connection.close(); } }
结果是正确的,成功获取了userInfo表里面的数据写一个连接池的工具类,并且用这个工具类来修改Dao层的代码
package com.demo.spring.util; import org.apache.commons.dbcp2.BasicDataSource; import java.sql.Connection; import java.sql.SQLException; public class DBCPUtil { private static BasicDataSource bds; static { System.out.println("创建连接池"); bds = new BasicDataSource(); // 配置连接池大小 bds.setInitialSize(5); //配置连接信息 bds.setUrl("jdbc:mysql://master:3306/show1"); bds.setDriverClassName("com.mysql.jdbc.Driver"); bds.setUsername("root"); bds.setPassword("123456"); } public static Connection getConn(){ System.out.println("获取连接"); try { return bds.getConnection(); } catch (SQLException e) { e.printStackTrace(); } return null; } }
package com.demo.spring.mvc.dao; import com.demo.spring.mvc.bean.User; import com.demo.spring.util.DBCPUtil; import com.demo.spring.util.JDBCUtil; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class UserDao { public User loginDao(String username){ User user = null; try{ Connection conn = DBCPUtil.getConn(); String sql = "select * from userInfo where username=?"; PreparedStatement ps = conn.prepareStatement(sql); ps.setString(1,username); ResultSet rs = ps.executeQuery(); if(rs.next()){ user=new User(); user.setId("id"); user.setUsername(rs.getString("username")); user.setPassword(rs.getString("password")); } rs.close(); ps.close(); conn.close(); }catch (Exception e){ e.printStackTrace(); } return user; } }
其余部分的代码与之前的博客里面写的一样,这里只需要用连接池改造Dao层的代码即可,
博客地址是SpringBoot笔记 —— 使用MVC和三层架构模拟网站用户登录检查
可以成功进行登录信息检查之后每一次在浏览器的地址栏修改username和password,都会导致重新获取一次连接池中的连接
-
SpringBoot-设置数据库连接池
2022-03-01 16:59:30SpringBoot-设置数据库连接池 介绍 功能 dbcp druid c3p0 tomcat-jdbc HikariCP 是否支持PSCache 是 是 是 否 否 监控 jmx jmx/log/http jmx/log jmx jmx 扩展性 弱 好 弱 弱 弱 sql拦截及解析 无 ... -
数据库连接池——基本原理
2021-06-09 15:26:06数据库连接池——基本原理 1.数据库连接池是什么? 数据库连接池是负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。 2.为什么要使用连接池? 数据库连接是一种... -
阿里巴巴主流数据库连接池Druid入门
2022-04-09 09:45:36数据库连接池的必要性 (一).传统数据库连接模式的的步骤 1.在主程序中创建连接 2.进行sql操作 3.关闭数据库连接 (二).传统数据库连接模式存在的问题 1.浪费时间:每次连接时都要验证登录和将conn加载到内存... -
Android中的数据库连接池
2019-11-02 20:19:14最近在看数据库相关的三方库的时候,我发现在Android应用开发的时候是可以并行操作数据库的读写,但Android默认的数据连接池中只有一个数据库链接。一个数据库连接能实现并发么?要是一个数据库链接可以实现并发,... -
三种数据库连接池的配置
2021-01-18 22:17:29三种数据库连接池的配置及...而采用数据库连接池后,数据库连接请求可以直接通过连接池满足而不需要为该请求重新连接、认证到数据库服务器,这样就节省了时间。缺点数据库连接池中可能存在着多个没有被使用的连接... -
Java 数据库连接池
2022-03-11 11:16:02一、关于数据库连接池 一个普通的 java 程序,要查询数据库的数据,基本流程是这样的: 可以看到,进行一次查询,要进行很多次网络交互,这样的缺点是: 网络IO多; 响应时间长,导致QPS降低; 频繁创建连接和关闭... -
项目——C++实现数据库连接池
2022-03-26 15:04:46为了提高Mysql数据库的访问瓶颈,常用的方法有如下两个: 在服务器端增加缓存服务器缓存常用的数据(例如redis) 增加连接池,来提高MYsql Server的访问效率,在高并发的情况下,每一个用户大量的TCP三次握手。... -
Golang 侧数据库连接池原理和参数调优
2020-01-13 11:17:40文章目录Golang 侧数据库连接池原理和参数调优数据库连接池数据库连接池的设计Go 的数据库连接池Go 数据库连接池的设计建立连接释放连接清理连接配置 sql.DB 以获得更好的性能maxOpenmaxIdlemaxLifeTime在实践和压测... -
Druid(德鲁伊)数据库连接池
2021-12-27 17:45:13数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy... -
Swoole数据库连接池分析及实现
2021-04-26 11:17:51使用PHP swoole 由于其内存常驻及协程特性,一般是需要使用数据库链接池来减少链接创建的开支的,一个连接池的实现难点在哪,下面分析 1:如何判断是否该获取新的链接? A:默认规则一个协程对应一个数据库连接,同一个... -
JDBC——数据库连接池
2021-12-17 15:24:16JDBC概述及数据库连接方式、JDBC增删改 查操作,今天我们继续学习JDBC中的数据库连接池。 一、为什么要使用数据库连接池 我们先回忆一下,在开发基于数据库的Web项目时,传统的步骤应该是: 1.在主程序中建立... -
数据库连接池原理之(一):通俗易懂的数据库连接池原理以及实现机制讲解
2018-12-21 11:45:02本篇内容综合广大网友提供内容,笔者经过整理,对数据库连接池原理和实现过程做个很系统的并且通俗易懂的分析讲解,以及手写一个连接池实现过程作为演示。 一、早期通过JDBC方式操作数据库 我们先来看早期使用JDBC... -
JAVA之JDBC数据库连接池(超详细介绍)
2020-07-09 16:34:50JDBC数据库连接池一、JDBC数据库连接池的必要性二、数据库连接池技术三、多种开源的数据库连接池3.1 C3P0数据库连接池3.2 DBCP数据库连接池3.3 Druid(德鲁伊)数据库连接池 一、JDBC数据库连接池的必要性 1、在使用... -
hikari数据库连接池
2021-05-10 18:35:33myHikaricp # 此属性控制池中连接的最长生命周期,值0表示无限生命周期,默认1800000即30分钟,为了防止连接雪崩,通常设置的比数据库的闲置时间小几秒 #max-lifetime: 1800000 # 连接mysql最大超时时间 #connection-... -
数据库连接池大小到底多少合适?
2020-06-09 11:59:22基本上来说,大部分项目都需要跟数据库做交互,那么,数据库连接池的大小设置成多大合适呢? 一些开发老鸟可能还会告诉你:没关系,尽量设置的大些,比如设置成 200,这样数据库性能会高些,吞吐量也会大些! 你也许... -
Spring boot 数据库连接池
2021-04-12 09:07:45文章目录Spring boot 数据库连接池上一节 Spring boot jdbcTemplate源码Spring boot 数据库连接池默认数据库 Hikarialibaba Druid 数据库连接池pom 依赖配置连接池信息durid 的监控配置Filter开启监控UI页面 ... -
Srping JPA 数据库连接池的连接何时申请和释放,与Open Session In View的关系
2022-03-24 16:17:35在使用Spring JPA data访问数据库时, 我们要清楚何时业务线程从数据库连接池获取连接,何时释放。 简单说,当Open Session In View 启用时(spring默认配置),在整个http request处理期间,一个JPA session都会... -
数据库连接池很简单,项目没使用框架亦可使用
2020-04-08 10:38:25数据连接池可不是一项高端技术,JDBC早已实现对其的支持,还不快点来了解下。 -
数据库连接池(常用的德鲁伊)
2020-05-16 22:58:21总结了常用的数据库连接池及其详细介绍和只用,以及对前面的数据工具类的再增强 -
数据库连接池配置参考
2019-10-08 13:50:31这个故障《其实对这种和数据库交互的应用,现在的程序中,大多都用了数据库连接池,无论用的开源,还是自研的,无非都是想通过连接池,更方便、更高效地和数据库交互,因此一定程度上...