我正在使用最新的 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(每个数据库名称一个),以及多个其他配置类。这仍然无法让我的存储库接口使用正确的模板。如果有人尝试过这样的事情,请告诉我。如果我弄明白了,我会在这里发布答案。
谢谢。
原文由 sbzoom 发布,翻译遵循 CC BY-SA 4.0 许可协议
因此,经过大量研究和实验,我得出结论,当前的
spring-data-mongodb
项目还不可能做到这一点。我尝试了上面 baja 的方法并遇到了一个特定的障碍。MongoTemplate
从其构造函数中运行其ensureIndexes()
方法。此方法调用数据库以确保数据库中存在带注释的索引。MongoTemplate
的构造函数在Spring
启动时被调用,所以我什至没有机会设置ThreadLocal
变量。我必须在Spring
启动时设置默认值,然后在收到请求时更改它。这是不允许的,因为我不想也没有默认数据库。一切都没有丢失。我们最初的计划是让每个客户端在自己的应用程序服务器上运行,指向自己的
MongoDB
MongoDB
服务器上的数据库。然后我们可以提供一个-Dprovider=
系统变量,每台服务器只指向一个数据库运行。我们被指示拥有一个多租户应用程序,因此尝试使用
ThreadLocal
变量。但由于它不起作用,我们能够按照我们最初设计的方式运行该应用程序。我相信有一种方法可以使这一切正常进行,只是需要比其他帖子中描述的更多。你必须自己制作
RepositoryFactoryBean
。这是 Spring Data MongoDB 参考文档 中的示例。您仍然需要实施自己的MongoTemplate
并延迟或删除ensureIndexes()
调用。但是您必须重写一些类以确保调用您的MongoTemplate
而不是Spring's
。换句话说,很多工作。我希望看到发生甚至去做的工作,我只是没有时间。感谢您的回复。