Spring-data-mongodb在一个Mongo实例中连接到多个数据库
我正在使用最新的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中使用该数据库名称。
我将在哪里粘贴多个数据库名称?我必须创建多个数据库名称,多个MongoTempate
s(每个数据库名称一个)和多个其他配置类。但这仍然无法使我的存储库接口使用正确的模板。如果有人尝试过这种事情,请告诉我。如果我知道了,我会在这里发布答案。
谢谢。
回答:
因此,经过大量研究和实验,我得出的结论是,当前spring-data-
mongodb项目尚不可能做到这一点。我在上面尝试了baja的方法,遇到了一个特殊的障碍。在MongoTemplate
运行其ensureIndexes()
从它的构造函数中的方法。此方法调出数据库以确保数据库中存在带注释的索引。启动时MongoTemplate
会调用for的构造函数,Spring
因此我什至没有机会设置ThreadLocal
变量。我必须在Spring
启动时已经设置好默认值,然后在请求进入时进行更改。这是不允许的,因为我既不需要也不拥有默认数据库。
虽然一切都没有丢失。我们最初的计划是让每个客户端都在其自己的应用程序服务器上运行,并指向服务器上自己的MongoDB
数据库MongoDB
。然后,我们可以提供一个-Dprovider=
系统变量,并且每个服务器仅指向一个数据库运行。
我们被指示要有一个多租户应用程序,因此尝试使用该ThreadLocal
变量。但是由于它不起作用,因此我们能够按照最初设计的方式运行该应用程序。
我相信,虽然有一种方法可以使所有这些工作正常进行,但所需的时间比其他帖子中所述的更多。你必须自己做RepositoryFactoryBean
。这是Spring
Data MongoDB参考文档中的示例。您仍然需要自己实现MongoTemplate
并延迟或删除ensureIndexes()
呼叫。但是,您将不得不重写一些类以确保MongoTemplate
调用了而不是Spring's
。换句话说,很多工作。我没有时间去做,甚至想做的工作。
感谢您的答复。
以上是 Spring-data-mongodb在一个Mongo实例中连接到多个数据库 的全部内容, 来源链接: utcz.com/qa/417515.html