专栏首页猿天地spring-boot-starter-mongodb-pool

spring-boot-starter-mongodb-pool

在日常工作中,我们通过Spring Data Mongodb来操作Mongodb数据库,在Spring Boot中只需要引入spring-boot-starter-data-mongodb即可。

很多时候我们往往需要操作多个数据库(微服务架构下一个服务一个独立的库),最简单的方式就是在项目中为每个数据库配置下,比如:

@Bean 
@Primary
public MongoDbFactory mongoDbFactory() throws Exception {
    // 省略...
   return new SimpleMongoDbFactory(mongoClient, "db1");
}

@Bean
@Primary
public MongoTemplate mongoTemplate() throws Exception {
    //省略...
    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);
    return mongoTemplate;
}

@Bean 
@Qualifier("mongoDbFactory2")
public MongoDbFactory mongoDbFactory2()hrows Exception {
    // 省略...
   return new SimpleMongoDbFactory(mongoClient, "db2);
}

@Bean
@Qualifier("mongoTemplate2")
public MongoTemplate mongoTemplate2() hrows Exception {
    //省略...
    MongoTemplate mongoTemplate = new MongoTemplate(mongoDbFactory(), converter);
    return mongoTemplate;
}

配置完成后注入使用的地方使用Qualifier注入即可使用对应的数据源,比如:

@Autowired
@Qualifier("mongoTemplate2")
private MongoTemplate seaweedMongoTemplate;

上面是直接在项目中配置多数据源的方式,接下来我们讲下一个问题,数据库连接池的问题,Mongodb的驱动中自带了连接池,但是Spring Boot Starter中却没有对连接池的配置,往往我们也需要通过代码的方式去配置,比如:

 @Bean
 public MongoClientOptions mongoClientOptions() {
     return new MongoClientOptions.Builder()
          //省略...
          .minConnectionsPerHost(...).build();
 }

虽然上面这些方式也都比较简单,但是在多个项目使用的时候都要去配置,重复代码比较严重,既然作为Starter按理来说是越简单越好,直接通过在属性文件中 配置就可以搞定,但是却不行,为此我封装了这个Pool Starter。

主要功能

  • 可以配置多个数据源
  • 支持连接池参数配置
  • 支持去掉_class的配置

不支持的功能

  • 多数据源配置后不支持Repository接口方式的使用
  • 不支持uri配置连接信息

配置方式

配置采用spring.data.mongodb.mongoTemplate名称.属性名=值

spring.data.mongodb.testMongoTemplate.host=localhost
spring.data.mongodb.testMongoTemplate.port=27017
spring.data.mongodb.testMongoTemplate.database=backup
spring.data.mongodb.testMongoTemplate.showClass=false
spring.data.mongodb.testMongoTemplate.gridFsTemplateName=gridFsTemplate
spring.data.mongodb.logsMongoTemplate.host=localhost
spring.data.mongodb.logsMongoTemplate.port=27017
spring.data.mongodb.logsMongoTemplate.database=logs
spring.data.mongodb.logsMongoTemplate.gridFsTemplateName=logsGridFsTemplate

testMongoTemplate和logsMongoTemplate就是每个数据源对应的MongoTemplate

同样的如果我们要操作GridFS的话也可以通过gridFsTemplateName属性来配置gridFsTemplate的名称

配置完之后就可以使用了,使用代码如下:

@Autowired
@Qualifier("testMongoTemplate")
private MongoTemplate testMongoTemplate;

@Autowired
@Qualifier("logsMongoTemplate")
private MongoTemplate logsMongoTemplate;

完整的使用案列请参考:https://github.com/yinjihuan/spring-boot-starter-mongodb-pool/tree/master/spring-boot-starter-mongodb-pool-example

完整的属性配置请参考:https://github.com/yinjihuan/spring-boot-starter-mongodb-pool/blob/master/spring-boot-starter-mongodb-pool/src/main/java/com/cxytiandi/mongodb/MongoPoolProperties.java

@Data
public class MongoPoolProperties {
    private String mongoTemplateName = "mongoTemplate";
    private String gridFsTemplateName = "gridFsTemplate";
    /**
     * 存储时是否保存_class
     */
    private boolean showClass = true;
    private String host;
    private Integer port = 27017;
    private String database;
    private String authenticationDatabase;
    private String gridFsDatabase;
    private String username;
    private char[] password;
    private int minConnectionsPerHost;
    private int maxConnectionsPerHost = 100;
    private int threadsAllowedToBlockForConnectionMultiplier = 5;
    private int serverSelectionTimeout = 1000 * 30;
    private int maxWaitTime = 1000 * 60 * 2;
    private int maxConnectionIdleTime;
    private int maxConnectionLifeTime;
    private int connectTimeout = 1000 * 10;
    private int socketTimeout = 0;
    private boolean socketKeepAlive = false;
    private boolean sslEnabled = false;
    private boolean sslInvalidHostNameAllowed = false;
    private boolean alwaysUseMBeans = false;
    private int heartbeatFrequency = 10000;
    private int minHeartbeatFrequency = 500;
    private int heartbeatConnectTimeout = 20000;
    private int heartbeatSocketTimeout = 20000;
    private int localThreshold = 15;
}

去掉_class

Spring Data Mongodb在保存数据的时候会自动增加一个_class字段用来关联这条数据的Document实体类,大数据量下会浪费存储空间,我们可以通过下面的配置禁用掉:

spring.data.mongodb.testMongoTemplate.showClass=false

GitHub地址:https://github.com/yinjihuan/spring-boot-starter-mongodb-pool

本文分享自微信公众号 - 猿天地(cxytiandi),作者:尹吉欢

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-04-23

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 线上服务CPU使用率百分百,注册中心却看不到该服务

    线上某服务一直运行很稳定,最近突然就cpu百分百,rpc远程调用全部失败,并走了mock逻辑。重启后,一个小时后问题又重现。于是dump线程栈信息,但不仔细看也...

    猿天地
  • spring mvc开发的mongodb网页版客户端

    项目介绍 相信大家都用过mongodb的一些客户端工具,如mongovue等等这些工具,这些是直接安装在电脑上的,当我们在生产环境中的数据库,为了安全我们是不允...

    猿天地
  • 务实优化:将本地单元测试Spring启动速度从1分半优化到16秒,全流程详解

    某个平凡熟悉的早上,传来测试同学的一阵哀嚎:那个谁!你提测的代码连运行都不能运行,苦涩。

    猿天地
  • Android-可旋转、平移的饼状图(PieChartView)

    code_horse
  • MediaCodec硬编码pcm2aac

    MediaCodec是Android(api>=16)提供的一个多媒体硬解编码库,能实现音视频的编解码。

    曾大稳
  • Mac下安装配置Android Studio并让多版本共存以及配置使用adb

    SeanDepp
  • 将Chrome设置为Jupyter_notebook的默认浏览器

    我们知道jupyter_notebook是在浏览器中打开的,这里建议大家都使用Chrome浏览器打开,因为其他浏览器可能会出现一些不兼容的问题。如果你电脑上有C...

    张俊红
  • 令人心寒的不是Github突然断供,而是CEO对此表示无能为力

    关于 Github 账户/开源项目是否会受到美国出口管理条例的管制,曾在国内掀起热烈的讨论,但过去由于缺乏相应的制裁案例,且 Github 平台协议也存在一定的...

    AI科技评论
  • java常见面试题之sql基础调优

    数据库在面试中也会经常遇到,这篇推文整理一些sql优化的一些语句,希望能帮助到有需要的朋友,有补充的可以留言

    爱敲代码的猫
  • 【XSS漏洞】通过XSS实现网页挂马

    前面也写了两期XSS相关的内容,今天就来点高大上的(并不是!),我们来通过XSS实现网页挂马~

    一名白帽的成长史

扫码关注云+社区

领取腾讯云代金券