spring boot整合mybatis+druid和多数据源外加druid监视sql执行时间

   日期:2020-06-05     浏览:278    评论:0    
核心提示:springboot整合mybatis+druid和多数据源单个数据源pom文件:application.properties文件配置内容单数据代码奉献上多个数据源整合MyBatis之前,先搭建一个基本的SpringBoot项目开启SpringBoot单个数据源pom文件:com.alibaba&l

spring boot整合mybatis+druid和多数据源

  • 单个数据源
    • pom文件:
    • application.properties文件配置内容
    • 单数据代码奉献上
  • 多个数据源
    • 目录结构
    • application.properties
    • 数据源1的配置
    • 数据源2的配置

整合MyBatis之前,先搭建一个基本的Spring Boot项目开启Spring Boot

单个数据源

pom文件:

<!--引入druid数据源 -->
     <dependency>
         <groupId>com.alibaba</groupId>
         <artifactId>druid</artifactId>
         <version>1.1.8</version>
     </dependency>
     <dependency>
         <groupId>org.springframework.boot</groupId>
         <artifactId>spring-boot-starter-jdbc</artifactId>
     </dependency>
     <!-- 数据库 -->
     <dependency>
         <groupId>mysql</groupId>
         <artifactId>mysql-connector-java</artifactId>
     </dependency>
     <!-- Mybatis -->
     <dependency>
         <groupId>org.mybatis.spring.boot</groupId>
         <artifactId>mybatis-spring-boot-starter</artifactId>
         <version>1.3.2</version>
     </dependency>

除Spring Boot外。在此免费赠送一套最新Java架构项目实战教程+大厂面试题库,有兴趣的 点击此处获取,没基础勿进!

application.properties文件配置内容

单数据源
#datasource1
spring.datasource.druid.type=com.alibaba.druid.pool.DataSource
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql:///myredis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=123456
#连接池配置
spring.datasource.initial-size=5
spring.datasource.min-idle=5
spring.datasource.max-active=20
#连接等待超时时间
spring.datasource.max-wait=30000
#配置检测可以关闭的空闲连接间隔时间
spring.datasource.time-between-eviction-runs-millis=60000
#配置连接在池中的最小生存时间
spring.datasource.min-evictable-idle-time-millis=300000
spring.datasource.validation-query=select '1' from dual
spring.datasource.test-while-idle=true
spring.datasource.test-on-borrow=false
spring.datasource.test-on-return=false
#打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.pool-prepared-statements=true
spring.datasource.max-open-prepared-statements=20
spring.datasource.max-pool-prepared-statement-per-connection-size=20

单数据代码奉献上

DemoController 控制层的代码

@RestController
public class DemoController {
    @Autowired
    public DemoService demoService;

    @RequestMapping("/demo")
    String getStringAll() {
        return demoService.getQueryAll().toString();
    }
}

service层

public interface DemoService {
    
    List<Teacher> getQueryAll();
}
@Service
public class DemoServiceImpl implements DemoService {
    @Autowired
    DemoQuery demoQuery;
    @Override
    public List<Teacher> getQueryAll() {
        return demoQuery.getQueryAll();
    }

dao 层我这里为了方便没有写.xml映射文件

@Component
@Mapper
public interface DemoQuery {
    
    @Select("select * from teacher")
    @Results(id = "teacher",value= {
            @Result(property = "sno", column = "sno", javaType = String.class),
            @Result(property = "name", column = "sname", javaType = String.class),
            @Result(property = "sex", column = "ssex", javaType = String.class)
    })
    List<Teacher> getQueryAll();

}

需要在启动类加上MapperScan 后面跟上要扫描的dao

@SpringBootApplication
@MapperScan("study.startspringboot.mapper")
public class StartSpringBootApplication {
    public static void main(String[] args) {
        SpringApplication.run(StartSpringBootApplication.class, args);
    }
}

sql语句

CREATE TABLE teacher (
    SNO VARCHAR(5),
    SNAME VARCHAR(9),
    SSEX CHAR(3) 
);

INSERT INTO teacher VALUES ('001', 'KangKang', 'M ');
INSERT INTO teacher VALUES ('002', 'Mike', 'M ');
INSERT INTO teacher VALUES ('003', 'Jane', 'F ');

到这里单个数据源就可以使用了,下面进入多个数据源模式

多个数据源

一般用于读写分离,或者分库来使用,有的教程会加上 @Primary表示主数据源,既然分开来说明有这个需求没有主次之分,这里我也使用这样的方式吧
pom文件和上面的单个数据源的!你们复制即可!然后从application.properties默认配置改成了注解方式来进行
@bean druidServlet这个是开启druid的sql时间监控的运行项目打开这个链接即可:http://localhost:8080/druid/login.html

目录结构

application.properties

#数据库访问配置,使用数据源
#datasource1
ds1.datasource.url=jdbc:mysql:///myredis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
ds1.datasource.username=root
ds1.datasource.password=123456
ds1.datasource.driverClassName=com.mysql.cj.jdbc.Driver
#datasource2
ds2.datasource.url=jdbc:mysql:///myredis?useUnicode=true&characterEncoding=utf-8&useSSL=false&serverTimezone=GMT%2B8
ds2.datasource.username=root
ds2.datasource.password=123456
ds2.datasource.driverClassName=com.mysql.cj.jdbc.Driver
##
datasource.initialSize=20
datasource.minIdle=20
datasource.maxActive=200
datasource.maxWait=-1
datasource.timeBetweenEvictionRunsMillis=60000
datasource.minEvictableIdleTimeMillis=300000
datasource.testWhileIdle=true
datasource.testOnBorrow=false
datasource.testOnReturn=false
datasource.poolPreparedStatements=true
datasource.maxPoolPreparedStatementPerConnectionSize=20
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
datasource.filters=stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
datasource.connectionProperties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
# 合并多个DruidDataSource的监控数据
datasource.useGlobalDataSourceStat=true

数据源1的配置

@Configuration
@MapperScan(basePackages = Datasource1Config.PACKAGE, sqlSessionFactoryRef = "ds1SqlSessionFactory")
public class Datasource1Config {
   
   static final String PACKAGE = "study.startspringboot.mapper.datasource2";
   
   static final String MAPPER_LOCATION = "classpath*:mapper/datasource1dao
   static final String PACKAGE = "study.startspringboot.mapper.datasource2";
   
   static final String MAPPER_LOCATION = "classpath*:mapper/datasource2dao/*.xml";

   @Value("${ds1.datasource.url}")
   private String url;
   @Value("${ds1.datasource.username}")
   private String user;
   @Value("${ds1.datasource.password}")
   private String password;
   @Value("${ds1.datasource.driverClassName}")
   private String driverClass;
   
   @Value("${datasource.maxActive}")
   private Integer maxActive;
   @Value("${datasource.minIdle}")
   private Integer minIdle;
   @Value("${datasource.initialSize}")
   private Integer initialSize;
   @Value("${datasource.maxWait}")
   private Long maxWait;
   @Value("${datasource.timeBetweenEvictionRunsMillis}")
   private Long timeBetweenEvictionRunsMillis;
   @Value("${datasource.minEvictableIdleTimeMillis}")
   private Long minEvictableIdleTimeMillis;
   @Value("${datasource.testWhileIdle}")
   private Boolean testWhileIdle;
   @Value("${datasource.testWhileIdle}")
   private Boolean testOnBorrow;
   @Value("${datasource.testOnBorrow}")
   private Boolean testOnReturn;
   @Value("${datasource.poolPreparedStatements}")
   private boolean poolPreparedStatements;
   @Value("${datasource.maxPoolPreparedStatementPerConnectionSize}")
   private int maxPoolPreparedStatementPerConnectionSize;
   @Value("${datasource.filters}")
   private String filters;
   @Value("${datasource.connectionProperties}")
   private String connectionProperties;
   @Value("${datasource.useGlobalDataSourceStat}")
   private boolean useGlobalDataSourceStat;

   @Bean(name = "ds2DataSource")
   public DataSource ds2DataSource() {
       DruidDataSource datasource = new DruidDataSource();
       datasource.setUrl(url);
       datasource.setUsername(user);
       datasource.setPassword(password);
       datasource.setDriverClassName(driverClass);
       datasource.setInitialSize(initialSize);
       datasource.setMinIdle(minIdle);
       datasource.setMaxActive(maxActive);
       datasource.setMaxWait(maxWait);
       datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);
       datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);
       datasource.setValidationQuery("SELECT 'x'");
       datasource.setTestWhileIdle(testWhileIdle);
       datasource.setTestOnBorrow(testOnBorrow);
       datasource.setTestOnReturn(testOnReturn);
       datasource.setPoolPreparedStatements(poolPreparedStatements);
       datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);
       try {
           datasource.setFilters(filters);
       } catch (SQLException e) {
           System.err.println("druid configuration initialization filter: " + e);
       }
       datasource.setConnectionProperties(connectionProperties);
       datasource.setUseGlobalDataSourceStat(useGlobalDataSourceStat);
       return datasource;

   }

   @Bean(name = "ds2TransactionManager")
   public DataSourceTransactionManager ds2TransactionManager() {
       return new DataSourceTransactionManager(ds2DataSource());
   }
   @Bean(name = "ds2SqlSessionFactory")
   public SqlSessionFactory ds2SqlSessionFactory(@Qualifier("ds2DataSource") DataSource ds2DataSource)
           throws Exception {
       final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
       sessionFactory.setDataSource(ds2DataSource);
       sessionFactory.setTypeAliasesPackage("com.uchat.entity");
       sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
               .getResources(Datasource2Config.MAPPER_LOCATION));
       return sessionFactory.getObject();
   }


}

除Spring Boot外。在此免费赠送一套最新Java架构项目实战教程+大厂面试题库,有兴趣的 点击此处获取,没基础勿进!
有什么问题不懂得评论我会解答!
我把代码放在了git上:https://github.com/aloneoneself/springStudy
记得给星星呀,不会Git的我会把源文件上传到附件的!!!!

 
打赏
 本文转载自:网络 
所有权利归属于原作者,如文章来源标示错误或侵犯了您的权利请联系微信13520258486
更多>最近资讯中心
更多>最新资讯中心
更多>相关资讯中心
0相关评论

推荐图文
推荐资讯中心
点击排行
最新信息
新手指南
采购商服务
供应商服务
交易安全
关注我们
手机网站:
新浪微博:
微信关注:

13520258486

周一至周五 9:00-18:00
(其他时间联系在线客服)

24小时在线客服