程序员们你需要知道的数据库连接池的信息
yuyutoo 2024-10-12 00:47 4 浏览 0 评论
数据库连接池的信息
数据库连接池是用来保持与数据库的连接,从而便于复用。
首先我们需要知道程序与数据库是一个非常耗费资源的事情,尤其是程序与数据库不在同一台机器上时,必须要开启网络的连接,以及双方的互相验证等等。如果没有连接池的话,那么每次查询都要进行连接、验证、关闭等操作,会非常的耗时耗力,连接池能够保持连接,从而避免了多次建立连接的损耗。
上图就是一个简单的连接池的图示信息,每次程序取得连接时其实是从连接池中取得连接,然后每次关闭的时候将此连接放入连接池中,然后连接池会自己根据一些规则定义连接在池子中保持多少、保持多久。
所以从上面描述我们可以知道在连接池中重要的就是③⑥两个步骤了,什么时候真正建立连接和什么时候真正的关闭连接。
其实我们也能够自己实现一个非常简单的连接池。简单的只需要几步即可
public class MyDataSource implements DataSource { private LinkedList<Connection> dataSources = new LinkedList<>(); public MyDataSource(){ //一次性创建10个连接 for(int i = 0; i < 10; i++) { try { createConnection(); } catch (Exception e) { e.printStackTrace(); } } } public Connection createConnection(){ Connection con = null; //1、加载Mysql连接 try { Class.forName("com.mysql.jdbc.Driver"); //2、通过JDBC建立数据库连接 con = DriverManager.getConnection( "jdbc:mysql://localhost:3306/sys", "账号", "密码"); } catch (Exception e) { e.printStackTrace(); } return con; } @Override public Connection getConnection(){ if (dataSources.size()>0){ return dataSources.removeFirst(); }else { return createConnection(); } } public void releaseConnection(Connection connection){ dataSources.add(connection); } }
当然了这只是非常简单的一个连接池实现,完整的连接池要考虑的非常多。例如常用的连接池配置中的几个参数,最大连接数量、空闲连接的数量、使用连接前验证连接是否可用等等。
接下来我们用一个常见的异常来回顾一下常见的数据库连接池的一些配置信息。
错误回顾
之前在开发过程中碰到一个异常,随机出现的,异常信息如下
org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is java.sql.SQLRecoverableException: Closed Connection at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:296) at org.springframework.jdbc.support.JdbcUtils.extractDatabaseMetaData(JdbcUtils.java:320) at org.springframework.jdbc.support.SQLErrorCodesFactory.getErrorCodes(SQLErrorCodesFactory.java:214)
我们的项目使用的连接时DBCP,配置如下
<Resource auth="Container" driverClassName="oracle.jdbc.OracleDriver" factory="org.apache.commons.dbcp.BasicDataSourceFactory" maxActive="100" maxIdle="30" maxWait="5000" name="jdbc/riskDs" password="password" type="javax.sql.DataSource" url="jdbc:oracle:thin:@ip:xxx:xxx" username="username"/>
经过网上查询知道出现这个错误的原因是:程序要使用数据库连接时会从线程池中拿出线程,但是此时连接池中从空闲连接中取出的线程在数据库端被断开了,在程序端并不知道此连接被断开,所以会爆此错误。当然被断开的原因有许多,例如数据库端防火墙控制会清除连接了多久的空闲连接。
所以只需要在配置文件中加入validationQuery="select 1 from dual"这个参数即可,这个参数是在每次使用时都会验证是否是有效连接。
或者也可以加上minEvictableIdleTimeMillis="3000000"此参数,表示空闲多久的连接会被在连接池中丢弃掉。此参数常常小于数据库端防火墙配置的清除空闲连接的时间。
如果在DBCP中配置了minEvictableIdleTimeMillis参数,也要配置testWhileIdle="true"参数,此参数是开启异步Evict的TimerTask定时线程进行控制。
常用的参数如下
作者:不学无数的程序员
链接:https://juejin.im/post/5cdcdd57f265da03a54c4285
相关推荐
- 深度解读Spring框架的核心原理
-
深度解读Spring框架的核心原理在Java开发的世界里,提到Spring框架,就像提起一位久经沙场的老将,它几乎成了企业级应用开发的代名词。那么,这个被无数开发者膜拜的框架究竟有何独特之处?今天,我...
- 「Spring认证」Spring 框架概述
-
Spring是最流行的企业Java应用程序开发框架。全球数以百万计的开发人员使用SpringFramework来创建高性能、易于测试和可重用的代码。Spring框架是一个开源的Java...
- 学习Spring框架 这一篇就够了
-
1.spring概述1.1Spring是什么(理解)...
- Spring框架双核解析:IOC与AOP的本质与实战
-
#Spring核心#IOC容器#AOP编程#Java框架设计...
- Spring Boot与传统Spring框架的对比:探索Java开发的新境界
-
SpringBoot与传统Spring框架的对比:探索Java开发的新境界在Java生态系统中,Spring框架无疑是一个里程碑式的存在。从最初的简单依赖注入容器,到如今覆盖企业级开发方方面面的庞大...
- Spring MVC框架源码深度剖析:从入门到精通
-
SpringMVC框架源码深度剖析:从入门到精通SpringMVC框架简介SpringMVC作为Spring框架的一部分,为构建Web应用程序提供了强大且灵活的支持。它遵循MVC(Model-V...
- Spring框架入门
-
一.spring是什么?Spring是分层...
- 程序员必知必会技能之Spring框架基础——面向切面编程!
-
面向切面编程AOP(AspectOrientedProgramming)与OOP(ObjectOrientedProgramming,面向对象编程)相辅相成。AOP提供了与OOP不同的抽象软件结...
- Spring Security安全框架深度解读:为你的应用穿上“钢铁铠甲”
-
SpringSecurity安全框架深度解读:为你的应用穿上“钢铁铠甲”在现代网络世界里,保护我们的应用程序免受各种威胁攻击至关重要。而在这个过程中,SpringSecurity框架无疑是我们最可...
- Spring框架的设计哲学与实现:打造轻量级的企业级Java应用
-
Spring框架的设计哲学与实现:打造轻量级的企业级Java应用Spring框架自2003年诞生以来,已成为企业级Java应用开发的代名词。它不仅仅是一个框架,更是一种设计理念和哲学的体现。本文将带你...
- Spring框架深度解析:从核心原理到底层实现的全方位避坑指南
-
一、Spring框架核心概念解析1.控制反转(IoC)与依赖注入(DI)Spring的核心思想是通过IoC容器管理对象的生命周期和依赖关系。传统开发中,对象通过new主动创建依赖对象,导致高耦合;而S...
- Java框架 —— Spring简介
-
简介一般来说,Spring指的是SpringFramework,它提供了很多功能,例如:控制反转(IOC)、依赖注入...
- Spring 框架概述,模块划分
-
Spring框架以控制反转(InversionofControl,IoC)和面向切面编程(Aspect-OrientedProgramming,AOP)为核心,旨在简化企业级应用开发,使开发者...
- spring框架怎么实现依赖注入?
-
依赖注入的作用就是在使用Spring框架创建对象时,动态的将其所依赖的对象注入到Bean组件中,其实现方式通常有两种,一种是属性setter方法注入,另一种是构造方法注入。具体介绍如下:●属性set...
- Spring框架详解
-
Spring是一种开放源码框架,旨在解决企业应用程序开发的复杂性。一个主要优点就是它的分层体系结构,层次结构让你可以选择要用的组件,同时也为J2EE应用程序开发提供了集成框架。 Spring特征...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
推荐7个模板代码和其他游戏源码下载的网址
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
【开源分享】2024PHP在线客服系统源码(搭建教程+终身使用)
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)