纯净、安全、绿色的下载网站

首页|软件分类|下载排行|最新软件|IT学院

当前位置:首页IT学院IT技术

数据库连接池 详解Java数据库连接池

香菜聊游戏   2021-06-08 我要评论
想了解详解Java数据库连接池的相关内容吗香菜聊游戏在本文为您仔细讲解数据库连接池的相关知识和一些Code实例欢迎阅读和指正我们先划重点:java数据库连接池,java操作数据库下面大家一起来学习吧。

一、什么是数据库连接池

就是一个容器持有多个数据库连接当程序需要操作数据库的时候直接从池中取出连接使用完之后再还回去和线程池一个道理。

二、为什么需要连接池好处是什么?

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);
  }

六、总结

连接池和线程池的道理是一样的池化资源降低生成和销毁的损耗提高系统的响应。

今天的重点还是要理解线程池的原理并且记住大部分的配置参数各个线程池虽然实现的细节不同但是道理是相通的掌握一个就掌握了所有举一反三。


相关文章

猜您喜欢

网友评论

Copyright 2020 www.Shellfishsoft.com 【贝软下载站】 版权所有 软件发布

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 点此查看联系方式