当我们手动运行mongod服务器时,它可以与数据库连接。但我想通过Java代码运行MongoDB服务器,有什么办法吗?
Mongo mongo = new Mongo("localhost", 27017);
DB db = mongo.getDB("@NEW_DB");
有一个独立于平台的包装器,它将下载并运行请求的MongoDB二进制文件:https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo
您需要对测试配置进行一些更改,但除此之外,这只是一个临时替换。它一直在为我们工作,没有任何问题。
在这种情况下,您需要一个在服务器上运行的应用程序,并从客户端应用程序获取启动mongodb服务器的命令。
如果服务器端没有"命令侦听器"应用程序,并且mongodb服务器关闭,则无法启动它
制作一个在服务器上运行并监听网络端口的应用程序。
客户端应用程序通过该端口发送命令。侦听器应用程序接收该命令并启动外部进程(mongodb服务器)。还要考虑添加一些安全措施,以防止从未经授权的来源获取此类命令。
要从java代码启动外部进程,请考虑ProcessBuilder类。
为此,我个人更喜欢使用Apache Commons Exec。
当本地机器上没有运行mongod
进程时,需要启动一个进程。从Java程序启动另一个程序有不同的方法。
最粗糙的方法是使用Runtime.exec(String)
,它执行一个命令,就好像它被输入到操作系统命令shell中一样。它返回一个Process
对象,该对象允许您检索启动的流程的输出,并使您能够对流程进行一些控制。
一种更复杂但也更详细的方法是使用类ProcessBuilder
。主要优点是流程生成器允许您编写更独立于操作系统的代码。
请记住,只有当mongodb与您的应用程序运行在同一服务器上时,这两种方法才有效。在通常的生产设置中,mongodb运行在多个专用服务器上,这些服务器与应用程序服务器物理分离。在另一台机器上启动一个过程并不是那么简单,原因很明显。有一些软件解决方案可以让您同时远程管理多台服务器上的多个进程(我们公司的服务器管理员如Control-M),但这属于服务器管理领域。
MongoDB不是用Java编写的,因此您需要启动一个外部进程,如前面的答案所示。
如果你想运行并关闭MongoDB进行集成测试,有一个测试框架可以做到这一点:https://github.com/lordofthejars/nosql-unit/.
在JUnit 4测试中:
import static com.lordofthejars.nosqlunit.mongodb.ManagedMongoDb.MongoServerRuleBuilder.newManagedMongoDbRule;
@ClassRule
public static ManagedMongoDb managedMongoDb = newManagedMongoDbRule().build();
IIRC,默认情况下,它将在localhost:27017下载并启动一个新的MongoDB实例。