当前位置: 首页 > 面试题库 >

Spring-data-mongodb在一个Mongo实例中连接到多个数据库

严言
2023-03-14
问题内容

我正在使用最新的spring-data-
mongodb(1.1.0.M2)和最新的Mongo驱动程序(2.9.0-RC1)。我遇到这样的情况,我有多个客户端连接到我的应用程序,并且我想在同一台Mongo服务器中为每个客户端提供自己的“模式/数据库”。如果我直接使用驱动程序,这并不是一件很难的事情:

Mongo mongo = new Mongo( new DBAddress( "localhost", 127017 ) );

DB client1DB = mongo.getDB( "client1" );
DBCollection client1TTestCollection = client1DB.getCollection( "test" );
long client1TestCollectionCount = client1TTestCollection.count();

DB client2DB = mongo.getDB( "client2" );
DBCollection client2TTestCollection = client2DB.getCollection( "test" );
long client2TestCollectionCount = client2TTestCollection.count();

看,容易。但是spring-data-
mongodb不允许使用简单的方法来使用多个数据库。建立连接的首选方法Mongo是扩展AbstractMongoConfiguration类:

您将看到您重写了以下方法:

getDatabaseName()

因此,它迫使您使用一个数据库名称。然后,您构建的存储库接口在传递给SimpleMongoRepository该类的MongoTemplate中使用该数据库名称。

我将在哪里粘贴多个数据库名称?我必须创建多个数据库名称,多个MongoTempates(每个数据库名称一个)和多个其他配置类。但这仍然无法使我的存储库接口使用正确的模板。如果有人尝试过这种事情,请告诉我。如果我知道了,我会在这里发布答案。

谢谢。


问题答案:

因此,经过大量研究和实验,我得出的结论是,当前spring-data- mongodb项目尚不可能做到这一点。我在上面尝试了baja的方法,遇到了一个特殊的障碍。在MongoTemplate运行其ensureIndexes()从它的构造函数中的方法。此方法调出数据库以确保数据库中存在带注释的索引。启动时MongoTemplate会调用for的构造函数,Spring因此我什至没有机会设置ThreadLocal变量。我必须在Spring启动时已经设置好默认值,然后在请求进入时进行更改。这是不允许的,因为我既不需要也不拥有默认数据库。

虽然一切都没有丢失。我们最初的计划是让每个客户端都在其自己的应用程序服务器上运行,并指向服务器上自己的MongoDB数据库MongoDB。然后,我们可以提供一个-Dprovider=系统变量,并且每个服务器仅指向一个数据库运行。

我们被指示要有一个多租户应用程序,因此尝试使用该ThreadLocal变量。但是由于它不起作用,因此我们能够按照最初设计的方式运行该应用程序。

我相信,虽然有一种方法可以使所有这些工作正常进行,但所需的时间比其他帖子中所述的更多。你必须自己做RepositoryFactoryBean。这是Spring
Data MongoDB参考文档中
的示例。您仍然需要自己实现MongoTemplate并延迟或删除ensureIndexes()呼叫。但是,您将不得不重写一些类以确保MongoTemplate调用了而不是Spring's。换句话说,很多工作。我没有时间去做,甚至想做的工作。

感谢您的答复。



 类似资料:
  • 我需要连接到我的项目中的两个数据库。所以我创建了两个配置文件。 和 我配置了我的文件格式, 但是当我运行应用程序时,抛出了以下异常。 我无法确定错误是什么。我有两个模块。一个数据库的和类位于一个模块中,另一个数据库的类位于另一个模块中。这是问题的根源吗? 编辑 我的

  • 我试图与一个springboot应用程序连接到2个不同的redis实例:一个用作数据库,一个只用作缓存。我添加了不同的连接工厂和不同名称的redis模板,我使用@Qualifer来链接它们。我试图禁用从自动配置类RedisAutoConfiguration,但没有工作。 我总是收到这个错误: 包装人:org。springframework。豆。工厂UnsatifiedPendencyExcepti

  • 问题内容: 我有2个Mongodb数据库通过2个MongoTemplate-s连接到Spring Boot应用程序: mongoTemplate (默认的bean名称,连接到默认的db) mongoAppTemplate (在运行时连接到另一个数据库) 我有很多使用mongoTemplate的MongoRepository-,但我也想创建一些使用mongoAppTemplate的东西。 如何配置2

  • 我有两个Mongodb数据库连接到一个Spring Boot应用程序,其中有两个MongoTemplate-s: mongoTemplate(默认的bean名称,连接到默认的db) mongoAppTemplate(在运行时连接到另一个数据库) 我有很多使用mongoTemplate的MongoRepository,但我也想创建一些使用mongoAppTemplate的。 如何配置2 MongoR

  • 我必须将属于多个实体的数据存储在一个集合中。但是当我查询然后返回时,我不希望结果中出现不需要的记录。我们如何使用Spring实现这一点?以下是我迄今为止所做的。 1.我在实体中给出相同的集合名称,如下所示。 2、我创建独立的mongoRepository接口 3.问题是 当我做animalRepo的时候。芬德尔或humanRepo。芬德尔,我收集了所有的记录。 4.我所期望的 AnimalRepo

  • Spring-Data-MongoDB。我如何使用spring-data-mongodb库在mongo中动态创建数据库? 我试图使用Spring-Mongodb-Data模块对Mongo数据库进行CRUD操作,通过示例和文章,我的假设是在定义MongoTemplate bean时应该在spring上下文xml中预定义databasename。 请帮帮我. 谢谢-RK