Spring设置多数据库(接纳数据连接池管理)

打印 上一主题 下一主题

主题 989|帖子 989|积分 2967

一,媒介

大家在开发过程中,如果项目大一点就会遇到一种情况,同一个项目中大概会用到很多个数据源,那么这篇文章,博主为大家分享在spring应用中怎样接纳数据库连接池的方式设置设置多数据源。
本篇文章接纳大家用的最多也是最受欢迎的HikariCP进行树模。
二,数据库连接池

数据库连接池是一个管理数据库连接的工具,它答应应用程序通过连接池来获取数据库连接,而不是每次需要时都重新创建连接。连接池通过维护一组预先创建好的数据库连接,以及管理连接的分配和释放,可以提高应用程序对数据库的访问性能和效率。
我们可以利用数据库连接池取实现连接的细节化设置。如最大连接数,最大空闲时间,最大连接等待时间等,这些方便了我们操作数据库,更可以有效制止过长等待导致程序卡死的情况。
常见的数据库连接池包罗 HikariCP、Tomcat JDBC Pool、Apache Commons DBCP、C3P0、Druid等等。
三,实际应用

1,预备数据库以及表和根本数据

本文测试多库的情况,所以我们需要创建最少两个库进行测试。数据库sql我就不提供了,各位根据本身方便手动去创建吧。我这里简单创建两个库和三张表。如下图所示



2,根本框架预备(启动类就不展示了,有需要请看博主其它文档)

2.1 pom依赖

  1.     <dependency>
  2.       <groupId>org.springframework.boot</groupId>
  3.       <artifactId>spring-boot-starter-web</artifactId>
  4.       <version>2.5.4</version>
  5.       <exclusions>
  6.         <exclusion>
  7.           <groupId>org.springframework.boot</groupId>
  8.           <artifactId>spring-boot-starter-logging</artifactId>
  9.         </exclusion>
  10.       </exclusions>
  11.     </dependency>
  12.     <dependency>
  13.       <groupId>org.projectlombok</groupId>
  14.       <artifactId>lombok</artifactId>
  15.       <version>1.18.20</version>
  16.     </dependency>
  17.     <dependency>
  18.       <groupId>org.apache.commons</groupId>
  19.       <artifactId>commons-lang3</artifactId>
  20.       <version>3.12.0</version> <!-- 这里是最新版本 -->
  21.     </dependency>
  22. <!--    日志框架-->
  23.     <dependency>
  24.       <groupId>ch.qos.logback</groupId>
  25.       <artifactId>logback-classic</artifactId>
  26.       <version>1.2.5</version> <!-- 你可以替换为其他版本 -->
  27.     </dependency>
  28.     <!-- mysql 连接 -->
  29.     <dependency>
  30.       <groupId>org.springframework.boot</groupId>
  31.       <artifactId>spring-boot-starter-jdbc</artifactId>
  32.       <version>2.5.4</version>
  33.     </dependency>
  34.     <dependency>
  35.       <groupId>mysql</groupId>
  36.       <artifactId>mysql-connector-java</artifactId>
  37.       <version>8.0.17</version>
  38.     </dependency>
  39.     <dependency>
  40.       <groupId>org.mybatis.spring.boot</groupId>
  41.       <artifactId>mybatis-spring-boot-starter</artifactId>
  42.       <version>2.2.0</version>
  43.     </dependency>
复制代码
2.2 application.properties

这里密码接纳了加密的方式,运行时会自动解密,如果不知道怎么做的请查看SpringBoot启动自动解密加密设置项_springboot environment 设置项解密-CSDN博客
  1. spring.profiles.active=dev,database
  2. #mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
  3. spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  4. datasource1.url=jdbc:mysql://localhost:3306/rojertest?serverTimezone=Asia/Tokyo
  5. datasource1.username=root
  6. datasource1.password={decrypt}bGoxMDA0MDE4Mjc3
  7. datasource2.url=jdbc:mysql://localhost:3306/roejrtest?serverTimezone=Asia/Tokyo
  8. datasource2.username=root
  9. datasource2.password={decrypt}bGoxMDA0MDE4Mjc3
复制代码
2.3 HikariCP设置

  1. #HikariCP 配置信息
  2. #连接超时时间,指连接数据库时最大等待时间,单位是毫秒
  3. spring.datasource.hikari.connection-timeout=3000
  4. #连接空闲超时时间,指连接在连接池中保持空闲状态的最大时间,超过此时间连接将被释放,单位是毫秒
  5. spring.datasource.hikari.idle-timeout=3000
  6. #连接池的最大连接数,指连接池中允许的最大连接数量
  7. spring.datasource.hikari.maximum-pool-size=10
  8. #连接池的最小空闲连接数,指连接池中保持的最小空闲连接数量。
  9. spring.datasource.hikari.minimum-idle=5
  10. #设置连接的事务隔离级别
  11. #1,DEFAULT:使用数据库系统的默认隔离级别。
  12. #2,READ_UNCOMMITTED:允许事务读取未提交的数据更改。这是最低的隔离级别,它允许事务读取未提交的更改,可能会导致脏读、不可重复读和幻读等问题。
  13. #3,READ_COMMITTED:确保一个事务只能读取到已经提交的数据更改。在这个级别下,事务不会读取到其他事务未提交的更改,可以避免脏读,但仍可能存在不可重复读和幻读的问题。
  14. #4,REPEATABLE_READ:确保一个事务可以多次读取相同的数据而不受其他事务的影响。在这个级别下,事务不会读取到其他事务已提交的更改,可以避免脏读和不可重复读,但仍可能存在幻读的问题。
  15. #5,SERIALIZABLE:最高的隔离级别,确保事务之间完全隔离,每个事务都像是在独立运行。在这个级别下,事务不会读取到其他事务已提交或未提交的更改,可以避免脏读、不可重复读和幻读,但是会降低并发性能。
  16. spring.datasource.hikari.transaction-isolation=DEFAULT
  17. #连接验证超时时间,指连接在被取出后最大等待数据库验证的时间,单位是毫秒
  18. spring.datasource.hikari.validation-timeout=3000
  19. #用于测试连接的 SQL 查询语句
  20. spring.datasource.hikari.connection-test-query=SHOW TABLES
复制代码
2.3 日志输出设置

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <configuration>
  3.     <!-- 定义输出到控制台的日志记录器 -->
  4.     <appender name="CONSOLE" class="ch.qos.logback.core.ConsoleAppender">
  5.         <encoder>
  6.             <!-- 设置日志输出格式 -->
  7.             <pattern>%d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n</pattern>
  8.         </encoder>
  9.     </appender>
  10.     <!--打印数据库连接池日志信息-->
  11.     <logger name="com.zaxxer.hikari" level="DEBUG"/>
  12.     <!--打印sql信息-->
  13.     <logger name="com.luojie.dao" level="DEBUG"/>
  14.     <!-- 设置根日志级别为 INFO -->
  15.     <root level="INFO">
  16.         <appender-ref ref="CONSOLE"/> <!-- 将日志输出到控制台 -->
  17.     </root>
  18. </configuration>
复制代码
2.4 datasourceConfig 编写(紧张)

  1. package com.luojie.config;
  2. import com.zaxxer.hikari.HikariDataSource;
  3. import org.apache.ibatis.session.SqlSessionFactory;
  4. import org.mybatis.spring.SqlSessionFactoryBean;
  5. import org.mybatis.spring.annotation.MapperScan;
  6. import org.springframework.beans.factory.annotation.Qualifier;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.boot.jdbc.DataSourceBuilder;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  12. import javax.sql.DataSource;
  13. @Configuration
  14. @MapperScan(basePackages = "com.luojie.dao.mapper1", sqlSessionFactoryRef = "sqlSessionFactory1")
  15. public class DataSource1Config {
  16.     @Value("${datasource1.url}")
  17.     private String url;
  18.     @Value("${datasource1.username}")
  19.     private String username;
  20.     @Value("${datasource1.password}")
  21.     private String password;
  22.     @Bean(name = "dataSource1")
  23.     public DataSource dataSource1() {
  24.         return DataSourceBuilder.create()
  25.                 .url(url)
  26.                 .username(username)
  27.                 .password(password)
  28.                 // 使用HikariCP数据连接池管理
  29.                 .type(HikariDataSource.class)
  30.                 .build();
  31.     }
  32.     @Bean(name = "sqlSessionFactory1")
  33.     public SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
  34.         SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
  35.         sessionFactoryBean.setDataSource(dataSource);
  36.         sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:rojerTestMapper/mapper1/*.xml"));
  37.         return sessionFactoryBean.getObject();
  38.     }
  39. }
复制代码
  1. package com.luojie.config;
  2. import com.zaxxer.hikari.HikariDataSource;
  3. import org.apache.ibatis.session.SqlSessionFactory;
  4. import org.mybatis.spring.SqlSessionFactoryBean;
  5. import org.mybatis.spring.annotation.MapperScan;
  6. import org.springframework.beans.factory.annotation.Qualifier;
  7. import org.springframework.beans.factory.annotation.Value;
  8. import org.springframework.boot.jdbc.DataSourceBuilder;
  9. import org.springframework.context.annotation.Bean;
  10. import org.springframework.context.annotation.Configuration;
  11. import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
  12. import javax.sql.DataSource;
  13. @Configuration
  14. @MapperScan(basePackages = "com.luojie.dao.mapper2", sqlSessionFactoryRef = "sqlSessionFactory2")
  15. public class DataSource2Config {
  16.     @Value("${datasource2.url}")
  17.     private String url;
  18.     @Value("${datasource2.username}")
  19.     private String username;
  20.     @Value("${datasource2.password}")
  21.     private String password;
  22.     @Bean(name = "dataSource2")
  23.     public DataSource dataSource1() {
  24.         return DataSourceBuilder.create()
  25.                 .url(url)
  26.                 .username(username)
  27.                 .password(password)
  28.                 // 使用HikariCP数据连接池管理
  29.                 .type(HikariDataSource.class)
  30.                 .build();
  31.     }
  32.     @Bean(name = "sqlSessionFactory2")
  33.     public SqlSessionFactory sqlSessionFactory1(@Qualifier("dataSource2") DataSource dataSource) throws Exception {
  34.         SqlSessionFactoryBean sessionFactoryBean = new SqlSessionFactoryBean();
  35.         sessionFactoryBean.setDataSource(dataSource);
  36.         sessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:rojerTestMapper/mapper2/*.xml"));
  37.         return sessionFactoryBean.getObject();
  38.     }
  39. }
复制代码
3. 业务代码编写

3.1 controller 

  1. package com.luojie.controller;
  2. import com.luojie.controImpl.DatabaseTestImpl;
  3. import org.springframework.beans.factory.annotation.Autowired;
  4. import org.springframework.web.bind.annotation.GetMapping;
  5. import org.springframework.web.bind.annotation.RestController;
  6. @RestController
  7. public class DatabaseTestController {
  8.     @Autowired
  9.     DatabaseTestImpl test;
  10.     @GetMapping("/database/test")
  11.     public void test1() {
  12.         test.add();
  13.     }
  14. }
复制代码
3.2 impl

  1. package com.luojie.controImpl;
  2. import com.luojie.dao.mapper1.Mapper1;
  3. import com.luojie.dao.mapper2.Mapper2;
  4. import com.luojie.moudle.LibraryModel;
  5. import com.luojie.moudle.UserModel;
  6. import org.springframework.beans.factory.annotation.Autowired;
  7. import org.springframework.stereotype.Service;
  8. @Service
  9. public class DatabaseTestImpl {
  10.     @Autowired
  11.     private Mapper1 mapper1;
  12.     @Autowired
  13.     private Mapper2 mapper2;
  14.     public void add() {
  15.         UserModel userModel = new UserModel();
  16.         userModel.setUsername("Rojer");
  17.         userModel.setSex("男");
  18.         userModel.setUserid("007");
  19.         userModel.setRoles("admin,member");
  20.         userModel.setMoney("10");
  21.         LibraryModel libraryModel = new LibraryModel();
  22.         libraryModel.setId(1);
  23.         libraryModel.setAmount(1);
  24.         mapper2.addLibrary(libraryModel);
  25.         mapper2.addUserBalance(userModel);
  26.         mapper1.addUser(userModel);
  27.     }
  28. }
复制代码
3.3 model文件

  1. package com.luojie.moudle;
  2. import lombok.Data;
  3. @Data
  4. public class UserModel {
  5.     private String username;
  6.     private String money;
  7.     private String sex;
  8.     private String roles;
  9.     private String userid;
  10. }
复制代码
  1. package com.luojie.moudle;
  2. import lombok.Data;
  3. import java.math.BigDecimal;
  4. @Data
  5. public class LibraryModel {
  6.     private String name;
  7.     private BigDecimal price;
  8.     private int amount;
  9.     private int id;
  10. }
复制代码
3.4 mapper接口

注意这里放的位置一定要与前面config中设置的一致
  1. package com.luojie.dao.mapper1;
  2. import com.luojie.moudle.UserModel;
  3. import org.apache.ibatis.annotations.Mapper;
  4. @Mapper
  5. public interface Mapper1 {
  6.     void addUser(UserModel userModel);
  7. }
复制代码
  1. package com.luojie.dao.mapper2;
  2. import com.luojie.moudle.LibraryModel;
  3. import com.luojie.moudle.UserModel;
  4. import org.apache.ibatis.annotations.Mapper;
  5. @Mapper
  6. public interface Mapper2 {
  7.     void addUserBalance(UserModel model);
  8.     void addLibrary(LibraryModel model);
  9. }
复制代码
3.5 mapper.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <!--<mapper> 标签用于定义 Mapper XML 文件。-->
  4. <!--namespace 属性指定了该 Mapper XML 文件对应的 Mapper 接口的类路径。-->
  5. <mapper namespace="com.luojie.dao.mapper1.Mapper1">
  6.     <select id="addUser">
  7.         insert into userpro (`userid`, `roles`, `username`) values (#{userid}, #{roles}, #{username})
  8.     </select>
  9. </mapper>
复制代码
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
  3. <!--<mapper> 标签用于定义 Mapper XML 文件。-->
  4. <!--namespace 属性指定了该 Mapper XML 文件对应的 Mapper 接口的类路径。-->
  5. <mapper namespace="com.luojie.dao.mapper2.Mapper2">
  6.     <update id="addUserBalance" parameterType="com.luojie.moudle.UserModel">
  7.         update user set money = money + #{money} where userid = #{userid}
  8.     </update>
  9.     <update id="addLibrary" parameterType="com.luojie.moudle.LibraryModel">
  10.         update library set amount = amount + #{amount} where id = #{id}
  11.     </update>
  12. </mapper>
复制代码
四,代码测试


sql和连接池都是正常打印日志的

整体执行ok


希望对各位大佬有资助。麻烦加个关注点个赞谢谢!


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

兜兜零元

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表