springboot学习进阶(二)----配置数据源

    做Java开发的都知道,后台就是要跟数据库进行打交道的,什么增删改查什么排序分组索引,也不是本文的重点,就不详细述说了,但是怎么连接数据库这个在配置数据库的时候,是必须要清楚的。传统的数据库链接方式就是jdbc创建一个数据库连接,然后执行完sql操作之后再删除,到现在使用了数据库连接池,为什么使用数据库连接池这里也不再阐述,网上有很多文章都有。

    既然说到数据库连接池,那么就列举一下Java开发所常见的一些数据库连接池,并分别给出每一个连接池的优劣以及在spring boot中怎么配置连接的。

1、C3P0

开源的JDBC连接池,实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展。目前使用它的开源项目有Hibernate、Spring等。单线程,性能较差,适用于小型系统,代码600KB左右。

2、DBCP

由Apache开发的一个Java数据库连接池项目, Jakarta commons-pool对象池机制,Tomcat使用的连接池组件就是DBCP。单独使用dbcp需要3个包:common-dbcp.jar,common-pool.jar,common-collections.jar,预先将数据库连接放在内存中,应用程序需要建立数据库连接时直接到连接池中申请一个就行,用完再放回。单线程,并发量低,性能不好,适用于小型系统。

3、Tomcat jdbc pool

Tomcat在7.0以前都是使用common-dbcp做为连接池组件,但是dbcp是单线程,为保证线程安全会锁整个连接池,性能较差,dbcp有超过60个类,也相对复杂。Tomcat从7.0开始引入了新增连接池模块叫做Tomcat jdbc pool,基于Tomcat JULI,使用Tomcat日志框架,完全兼容dbcp,通过异步方式获取连接,支持高并发应用环境,超级简单核心文件只有8个,支持JMX,支持XA Connection。

4、BoneCP

官方说法BoneCP是一个高效、免费、开源的Java数据库连接池实现库。设计初衷就是为了提高数据库连接池性能,根据某些测试数据显示,BoneCP的速度是最快的,要比当时第二快速的连接池快25倍左右,完美集成到一些持久化产品如Hibernate和DataNucleus中。BoneCP特色:高度可扩展,快速;连接状态切换的回调机制;允许直接访问连接;自动化重置能力;JMX支持;懒加载能力;支持XML和属性文件配置方式;较好的Java代码组织,100%单元测试分支代码覆盖率;代码40KB左右。

5、Druid

Druid是Java语言中最好的数据库连接池,Druid能够提供强大的监控和扩展功能,是一个可用于大数据实时查询和分析的高容错、高性能的开源分布式系统,尤其是当发生代码部署、机器故障以及其他产品系统遇到宕机等情况时,Druid仍能够保持100%正常运行。主要特色:为分析监控设计;快速的交互式查询;高可用;可扩展;Druid是一个开源项目,源码托管在github上。

6、HikariCP

hikariCP是最近才开始接触到的一个数据库连接池,听说是在boneCP的基础上做了重新的优化。性能分析如下:

  • HikariCP通过优化(concurrentBag,fastStatementList )集合来提高并发的读写效率。

  • HikariCP使用threadlocal缓存连接及大量使用CAS的机制,最大限度的避免lock。单可能带来cpu使用率的上升。

  • 从字节码的维度优化代码。 (default inline threshold for a JVM running the server Hotspot compiler is 35 bytecodes )让方法尽量在35个字节码一下,来提升jvm的处理效率。

通过一张对比表格分析各个数据库连接池的特点:

功能C3P0DBCPTomcat jdbc poolBoneCPDruidHikariCP
线程同步单线程单线程多线程、异步多线程、异步多线程、异步多线程、异步
PSCache支持支持支持支持支持
LRU
ExceptionSorter
监控jmx、logjmxjmxjmxjmx、log、httpjmx
可扩展性较好
连接池管理队列

  LinkedBlockingDeque

  FIFO队列、FILO堆栈

FairBlockingQueue堆栈

数组、

CopyOnWriteArrayList

threadloacl、

CopyOnWriteArrayList

代码复杂度复杂中等,超过60个类简单,8个核心类简单,40kb中等简单
更新维护
开源项目集成

spring、

hibernate

tomcat组件Tomcat7以后

hibernate、

DataNucleus

Druid

  

LRU

LRU是一个性能关键指标,特别Oracle,每个Connection对应数据库端的一个进程,如果数据库连接池遵从LRU,有助于数据库服务器优化,这是重要的指标。在测试中,Druid、DBCP、Proxool、JBoss是遵守LRU的。BoneCP、C3P0则不是。BoneCP在mock环境下性能可能好,但在真实环境中则就不好了。

PSCache

PSCache是数据库连接池的关键指标。在Oracle中,类似SELECT NAME FROM USER WHERE ID = ?这样的SQL,启用PSCache和不启用PSCache的性能可能是相差一个数量级的。Proxool是不支持PSCache的数据库连接池,如果你使用Oracle、SQL Server、DB2、Sybase这样支持游标的数据库,那你就完全不用考虑Proxool。

ExceptionSorter

ExceptionSorter是一个很重要的容错特性,如果一个连接产生了一个不可恢复的错误,必须立刻从连接池中去掉,否则会连续产生大量错误。这个特性,目前只有JBossDataSource和Druid实现。Druid的实现参考自JBossDataSource。

监控

DruidDataSource自身提供有NotEmptyWaitCount、PSCahcheHitCount等有用的监控属性,通过配置StatFilter能够监控SQL的执行情况。

 

    在了解了常用的数据库连接池之后,我们再来研究一下,spring boot怎么集成这些数据库连接池的。(注:因几个连接池已经不再更新维护,而Tomcat Jdbc Pool一般不会用于Java项目连接池,因此此处我们只做druid跟HikariCP连接池的配置使用)

 

一、使用druid连接mysql

在项目的pom文件中添加mysql及druid的相关依赖(mysql依赖添加的时候,需要注意一下跟自己的版本匹配)

    <!-- druid连接池 -->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.1.12</version>
    </dependency>

    <!-- mysql -->
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.17</version>
    </dependency>

在spring boot中添加相关properties配置

# mysql

spring.datasource.type=com.alibaba.druid.pool.DruidDataSource

spring.datasource.url=jdbc:mysql://127.0.0.1:3306/boot?useUnicode=true&characterEncoding=UTF-8&useSSL=false

spring.datasource.driverClassName=com.mysql.jdbc.Driver

spring.datasource.username=root

spring.datasource.password=123456



# DataSource

spring.datasource.initialSize=1

spring.datasource.minIdle=1

spring.datasource.maxActive=20

spring.datasource.maxWait=60000

spring.datasource.validationQuery=SELECT 1 FROM DUAL

spring.datasource.testOnBorrow=false

spring.datasource.testOnReturn=false

spring.datasource.testWhileIdle=true

spring.datasource.minEvictableIdleTimeMillis=25200000

spring.datasource.timeBetweenEvictionRunsMillis=60000

spring.datasource.removeAbandoned=true

spring.datasource.removeAbandonedTimeout=1800

spring.datasource.poolPreparedStatements=true

spring.datasource.maxPoolPreparedStatementPerConnectionSize=20

spring.datasource.logAbandoned=true

spring.datasource.filters=stat,wall

​

启动项目,然后访问http://localhost:9000/druid/index.html,druid连接池就配置好了

 

二、使用HikariCP连接池

因为spring boot2默认使用的是hikariCP作为连接池,所以版本在2以上的可以省略maven依赖,直接在配置文件中加入如下配置信息即可

# jdbc_config   datasource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&useSSL=false&zeroDateTimeBehavior=convertToNull
spring.datasource.username=root
spring.datasource.password=root
# Hikari will use the above plus the following to setup connection pooling
spring.datasource.type=com.zaxxer.hikari.HikariDataSource
spring.datasource.hikari.minimum-idle=5
spring.datasource.hikari.maximum-pool-size=15
spring.datasource.hikari.auto-commit=true
spring.datasource.hikari.idle-timeout=30000
spring.datasource.hikari.pool-name=DatebookHikariCP
spring.datasource.hikari.max-lifetime=1800000
spring.datasource.hikari.connection-timeout=30000
spring.datasource.hikari.connection-test-query=SELECT 1

 

本文参考网址:

1、https://www.toutiao.com/a6551532416505217539/?tt_from=mobile_qq&utm_campaign=client_share&timestamp=1526087841&app=news_article&utm_source=mobile_qq&iid=32174471432&utm_medium=toutiao_android

2、https://blog.csdn.net/a1178016652/article/details/45027619

3、https://blog.csdn.net/moshowgame/article/details/80304198

4、http://www.cnblogs.com/liaojie970/p/9106187.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用SpringBoot和Mybatis-plus配置数据源的步骤: 1. 首先,在pom.xml文件中添加Mybatis-plus和数据库驱动的依赖: ```xml <dependencies> <!-- Mybatis-plus依赖 --> <dependency> <groupId>com.baomidou</groupId> <artifactId>mybatis-plus-boot-starter</artifactId> <version>最新版本</version> </dependency> <!-- 数据库驱动依赖 --> <dependency> <groupId>数据库驱动的groupId</groupId> <artifactId>数据库驱动的artifactId</artifactId> <version>数据库驱动的版本</version> </dependency> </dependencies> ``` 2. 在application.yml或application.properties文件中配置数据源信息: ```yaml spring: datasource: # 主数据源配置 url: 主数据源的URL username: 主数据源的用户名 password: 主数据源的密码 driver-class-name: 主数据源的驱动类名 # 其他数据源配置 datasources: 数据源1的名称: url: 数据源1的URL username: 数据源1的用户名 password: 数据源1的密码 driver-class-name: 数据源1的驱动类名 数据源2的名称: url: 数据源2的URL username: 数据源2的用户名 password: 数据源2的密码 driver-class-name: 数据源2的驱动类名 ``` 3. 创建多数据源配置类,继承AbstractRoutingDataSource,并重写determineCurrentLookupKey方法,根据注解选择使用哪个数据源: ```java @Configuration public class MultipleDataSourceConfig extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { return DataSourceContextHolder.getDataSource(); } } ``` 4. 创建数据源上下文类,用于设置和获取当前使用的数据源: ```java public class DataSourceContextHolder { private static final ThreadLocal<String> contextHolder = new ThreadLocal<>(); public static void setDataSource(String dataSource) { contextHolder.set(dataSource); } public static String getDataSource() { return contextHolder.get(); } public static void clearDataSource() { contextHolder.remove(); } } ``` 5. 创建数据源切换注解,用于在方法或类上标注使用哪个数据源: ```java @Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented public @interface DataSource { String value() default "主数据源"; } ``` 6. 创建数据源切面类,用于根据注解切换数据源: ```java @Aspect @Component public class DataSourceAspect { @Before("@annotation(dataSource)") public void switchDataSource(JoinPoint joinPoint, DataSource dataSource) { String dataSourceName = dataSource.value(); DataSourceContextHolder.setDataSource(dataSourceName); } @After("@annotation(dataSource)") public void restoreDataSource(JoinPoint joinPoint, DataSource dataSource) { DataSourceContextHolder.clearDataSource(); } } ``` 7. 在需要使用多数据源的方法或类上使用@DataSource注解,指定使用哪个数据源: ```java @DataSource("数据源1的名称") public void method1() { // 使用数据源1执行操作 } @DataSource("数据源2的名称") public void method2() { // 使用数据源2执行操作 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值