当前位置: 首页 > 知识库问答 >
问题:

使用Mongodb版本4和副本配置flapdoodle嵌入式mongo

岳英锐
2023-03-14
         MongodConfigBuilder().version(Version.Main.DEVELOPMENT)
        .replication(new Storage(null, null, 0))
        .build();

我在这里读了很多与这个配置相关的问题,但没有一个与我的问题相关。例如如何使用spring boot和spring data配置两个mongodb实例

flapdoodle配置对此有一个实现,但我不确定如何访问它。

https://github.com/flapdoodle-oss/de.flapdoodle.embedd.mongo/blob/master/src/main/java/de/flapdoodle/embed/mongo/tests/mongossystemfortestfactory.java

在应用程序启动之前,有没有办法在我的测试类中配置它。谢谢

共有1个答案

唐阳飙
2023-03-14

在web集成测试中,我必须使用replicaset启动嵌入式mongo,下面的代码使用

@Configuration
public class MongoConfig {

    public static int mongodPort;
    public static String defaultHost = "localhost";
    static {
        try {
            mongodPort = Network.getFreeServerPort();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    @Bean
    public IMongodConfig prepareMongodConfig() throws IOException {
        IMongoCmdOptions cmdOptions = new MongoCmdOptionsBuilder()
                .useNoPrealloc(false)
                .useSmallFiles(false)
                .master(false)
                .verbose(false)
                .useNoJournal(false)
                .syncDelay(0)
                .build();

        IMongodConfig mongoConfigConfig = new MongodConfigBuilder()
                .version(Version.Main.PRODUCTION)
                .net(new Net(mongodPort, Network.localhostIsIPv6()))
                .replication(new Storage(null, "testRepSet", 5000))
                .configServer(false)
                .cmdOptions(cmdOptions)
                .build();
        return mongoConfigConfig;
    }

}

在调用控制器之前,我使用下面的代码启用了带有副本集的DB

 Public class ITtest {
    public  void  setSystemProperty() {
            System.setProperty("spring.data.mongodb.port", String.valueOf(MongoConfig.mongodPort));
            System.setProperty("spring.data.mongodb.host", MongoConfig.defaultHost);
        }

        public static boolean isReplicaSetRun = false;

        public static void setupMongoReplica() {
            if (! isReplicaSetRun) {
                System.out.println("Starting db on port: " +MongoConfig.mongodPort);
                MongoClient client = new MongoClient(MongoConfig.defaultHost, MongoConfig.mongodPort);
                client.getDatabase("admin").runCommand(new Document("replSetInitiate", new Document()));
                client.close();
                isReplicaSetRun = true;
            }
        }

        @Test
        @Order(1)
        public void testParallel() {
            setSystemProperty();
            setupMongoReplica();
            // call web controller
      }
   }

如果要运行application,则可以在ApplicationListener实现中启用replicaset

 类似资料:
  • 我想确保@Transactional注释工作,所以我写了一篇测试save and Publishing文章--我的kafka publisher是一个模拟,它会在任何调用上抛出异常。我想确保MongoDB回滚持久化的文章。 现在我的测试失败了,因为无法在MongoClient中启动会话 我还尝试创建一个自定义的IMongodConfig 并启动复制: 因此,我的问题是,是否有可能创建一个运行的复制

  • 目前移动统计iOS SDK默认统计的版本为AppStore中的版本号,即CFBundleShortVersionString的值。如果您有自己设置版本的需求,可以设置shortAppVersion属性的值。具体设置方法参见本文档基础配置部分。

  • 目前移动统计Android SDK默认统计的版本为AndroidManifest.xml中配置的版本号,即android:versionName="xxx"的值。 如果您希望自定义APP版本号,可以通过API StatService.setAppVersionName(Context context, String versionName)进行设置。一般建议无需此设置,除非特殊需要,比如对于SDK

  • 请考虑以下示例:https://logging.apache.org/log4j/2.x/manual/configuration.html 使用上面的示例,我得到了以下输出: 并且没有记录任何内容。 为了解决这个问题,我必须使用其他模式,比如: 这是唯一的工作方式和日志的东西。 顺便说一句,我正在使用以下maven依赖项导入:

  • 主程序的日志文件包含大量的getmore oplog查询-我猜主程序上的任何操作都会创建一个oplog查询。在我看来,这是太多的复制开销,但我没有任何关于MongoDB负载的经验,也没有任何关键数据。 由于安装程序将不得不容忍更多的生产负载,我的问题是,复制开销是否是预期的,即使是在次要服务器上,CPU负载增加这么高是否正常,还是我遗漏了什么?

  • 我正在建立Shared集群的过程中。 我还想在集群中配置读副本。 假设有一个3,1个主要和2个次要的碎片。写将转到碎片的主成员,但我可以将所有读发送到次成员吗?