详解Java数据库连接池
作者:香菜聊游戏 发布时间:2024-01-12 16:06:38
一、什么是数据库连接池
就是一个容器持有多个数据库连接
,当程序需要操作数据库的时候直接从池中取出连接,使用完之后再还回去,和线程池一个道理。
二、为什么需要连接池,好处是什么?
1.节省资源,如果每次访问数据库都创建新的连接,创建和销毁都浪费系统资源
2.响应性更好,省去了创建的时间,响应性更好。
3.统一管理数据库连接,避免因为业务的膨胀导致数据库连接的无限增多。
4.便于监控。
三、都有哪些连接池方案
数据库连接池的方案有不少,我接触过的连接池方案有:
1.C3p0
这个连接池我很久之前看到过,但是当时自己还很弱小,并没有很好的理解,现在用的也很少了,爷爷级的连接池,可以忽略
2.DBCP (Database Connection Pool)
这个名字很直白,数据库连接池,从Tomcat 5.5开始,Tomcat 内置了DBCP的数据源实现,所以可以非常方便地配置DBCP数据源。
3.Druid
阿里开源的数据源,这个也是前公司使用的数据源,Druid能够提供强大的监控和扩展功能,强项在于监控。
4.HiKariCP
号称最快的数据库连接池,springboot2.0 也已经把默认的数据源改为了HikariCP,强于性能。
四、连接池需要关注的参数
看下Druid 的数据库连接池的配置:
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
<property name="driverClassName" value="${db.driverClassName}"/>
<property name="url" value="${db.url}"/>
<property name="username" value="${db.username}"/>
<property name="password" value="${db.password}"/>
<property name="initialSize" value="5"/>
<property name="maxIdle" value="10"/>
<property name="minIdle" value="5"/>
<property name="maxActive" value="15"/>
<property name="removeAbandoned" value="true"/>
<property name="removeAbandonedTimeout" value="180"/>
<property name="maxWait" value="3000"/>
<property name="validationQuery">
<value>SELECT 1</value>
</property>
<property name="testOnBorrow">
<value>true</value>
</property>
</bean>
1.driverClassName 使用的JDBC驱动的完整有效的Java类名,如连接 mysql com.mysql.cj.jdbc.Driver
2.jdbcUrl 数据库的连接。如 jdbc:mysql://127.0.0.1:3306/mydatabase
3.username 你懂的,数据库的用户名,如 root
4.password 太直白了 ,数据库的用户密码,如 p123456
5.initialSize 连接池创建的时候,自动创建的数据库连接数量,建议 10-50足够
6.maxIdle 最大空闲连接:连接池中允许保持空闲状态的最大连接数量,超过的空闲连接将被释放,如果设置为负数表示不限制,建议设置和 与initialSize相同,减少释放和创建的性能损耗。
7.minIdle 最小空闲连接:连接池中容许保持空闲状态的最小连接数量,低于这个数量将创建新的连接,如果设置为0则不创建
8.maxActive 最大同时激活的连接数量。
9.maxWait 如果连接池中没有可用的连接,最大的等待时间,超时则没有可用连接,单位毫秒,设置-1时表示无限等待,建议设置为100毫秒
10.testxxx 在对连接进行操作时,是否检测连接的有效性,如 testOnBorrow 在申请连接的时候会先检测连接的有效性,执行validationQuery ,建议线上的把此配置设置为false,因为会影响性能。
11.validationQuery 检查池中的连接是否仍可用的 SQL 语句,drui会连接到数据库执行该SQL, 如果正常返回,则表示连接可用,否则表示连接不可用,建议 select 1 from dual
五、怎么创建连接池,show me the code
5.1 pom.xml 加入依赖
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.2.6</version>
</dependency>
5.2 配置文件
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
<!-- 基本属性 url、user、password -->
<property name="driverClassName" value="${jdbc.driver}" />
<property name="url" value="${jdbc_url}" />
<property name="username" value="${jdbc_user}" />
<property name="password" value="${jdbc_password}" />
<!-- 配置监控统计拦截的filters -->
<property name="filters" value="stat" />
<!-- 配置初始化大小、最小、最大 -->
<property name="maxActive" value="20" />
<property name="initialSize" value="1" />
<property name="minIdle" value="1" />
<!-- 配置获取连接等待超时的时间 -->
<property name="maxWait" value="60000" />
<!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
<property name="timeBetweenEvictionRunsMillis" value="60000" />
<!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
<property name="minEvictableIdleTimeMillis" value="300000" />
<property name="testWhileIdle" value="true" />
<property name="testOnBorrow" value="false" />
<property name="testOnReturn" value="false" />
<!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
<property name="poolPreparedStatements" value="true" />
<property name="maxOpenPreparedStatements" value="20" />
</bean>
<!--配置jdbcTemplate,如果userDao没有extends JdbcDaoSupport-->
<<bean id="jdbcTemplate" class="com.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="userDao" class="com.caraway.dao.UserDao">
<property name="dataSource" ref="jdbcTemplate"/>
</bean>
5.3 调用
public static void main(String[] args) {
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
UserDao userDao = (UserDao) context.getBean("userDao");
User user = new User();
user.setUsername("香菜");
user.setPassowrd("root");
userDao.saveUser(user);
}
六、总结
连接池和线程池的道理是一样的,池化资源,降低生成和销毁的损耗,提高系统的响应。
今天的重点还是要理解线程池的原理,并且记住大部分的配置参数,各个线程池虽然实现的细节不同,但是道理是相通的,掌握一个就掌握了所有,举一反三。
来源:https://blog.csdn.net/perfect2011/article/details/117649104


猜你喜欢
- 工作中最常见的配置文件有四种:普通key=value的配置文件、Json格式的配置文件、HTML格式的配置文件以及YMAML配置文件。这其中
- 对于题目中提出的问题,可以拆分来一步步解决。在 MySQL 中 KEY 和 INDEX 是同义。那这个问题就可以简化为 PRIMARY KE
- 一、前端工具vscode1.1、概述前端开发是创建Web页面或app等前端界面呈现给用户的过程,通过HTML,CSS及JavaScript以
- 本文实例讲述了js实现类似iphone的网页滑屏解锁功能。分享给大家供大家参考,具体如下:iphone 的出现,打破了人们的用户体验,这一用
- 最近发现Python课器做很多事情,在监控服务器有其独特的优势,耗费资源少,开发周期短。首先我们做一个定时或者实时脚本timedtask.p
- 我们知道 Django Auth 应用一般用在用户的登录注册上,用于判断当前的用户是否合法,从而可以帮助开发者快速的构建用户系统,那么 Au
- Vue3 ref获取DOM元素<div ref="divBox">Hello</div>impo
- 下面直接记录下配置主从库的操作:(本文用的是mysql5.0以上)1.在主库建立要同步的数据库,建立主库的帐号和修改主库配置首先连接上数据库
- 看下文章前我想先说一个问题遇到问题不要盲目的搜索答案,先看看终端提示什么错误,下面我总结一下会出现jupyter notebook运行命令,
- selenium 介绍selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选 selenium ,因为它相比
- hello,大家好,我是Dream。最近有小伙伴私信我,说让我出一篇海龟画图,这其实我也不太能弄得明白,那在这里我和大家一块梳理一下!记得给
- 在上篇文章给大家介绍了BootstrapTable与KnockoutJS相结合实现增删改查功能【一】,介绍了下knockout.js的一些基
- 字典由多个键及与其对应的值构成的对组成(把键值对成为项),每个键和它的值之间用冒号(:)隔开,项之间用逗号(,)隔开,而整个字典由一对大括号
- 1. Redo日志的介绍Redo日志是物理日志,记录的是页面的变化。1.1 Redo日志的作用提升数据库写入效率保证数据库不丢数据,进行数据
- 本文深入分析了Symfony控制层。分享给大家供大家参考,具体如下:Symfony中控制层包含了连接业务逻辑与表现的代码,控制层为不同的使用
- ORACLE的这类错误在ORALCE的文档中有详细说明,但原因及措施说明不详细,本文当着重说明如何解决这类错误。1、ORA-12571、OR
- 一、format格式输出字符串使用 % 操作符对各种类型的数据进行格式化输出,这是早期 Python提供的方法。字符串类型(str)提供了
- django框架默认将session保存到数据库中,在高并发访问无疑会影响服务器性能,因此最好将session保存到redis中避免直接从数
- 如何同时处理数据库和页面错误? If Err.Number = 0 And ob
- 由于车票难抢,有时需要的车票已经售空,而我们需要捡漏,便可使用这个脚本。具体实现了,自动查询某一车票的余票数量,当数量产生变化时,将自动发送