當我們手動運行mongod服務器時,它可以連接數據庫。但我想運行MongoDB服務器的Java代碼,那麼有沒有辦法做到這一點?有什麼辦法可以使用Java編程來運行MongoDB服務器嗎?
Mongo mongo = new Mongo("localhost", 27017);
DB db = mongo.getDB("@NEW_DB");
當我們手動運行mongod服務器時,它可以連接數據庫。但我想運行MongoDB服務器的Java代碼,那麼有沒有辦法做到這一點?有什麼辦法可以使用Java編程來運行MongoDB服務器嗎?
Mongo mongo = new Mongo("localhost", 27017);
DB db = mongo.getDB("@NEW_DB");
在這種情況下,你需要在服務器上運行,並從客戶端應用程序啓動蒙戈DB服務器獲取命令的應用程序。
如果服務器端沒有某個「命令監聽器」應用程序,並且mongodb服務器關閉,則無法啓動它。
製作一個application,它運行在服務器上並偵聽網絡端口。
您的客戶端應用程序通過此端口發送命令。 Listener應用程序接收這個命令並啓動一個外部進程(mongodb服務器)。另外考慮添加一些安全措施,以防止從未經授權的源獲取此類命令。
要從您的java代碼啓動外部進程,請考慮ProcessBuilder類。
我個人更喜歡用Apache Commons Exec來達到這個目的。
當沒有mongod
進程在本地機器上運行時,您需要啓動一個進程。有不同的方法從Java程序啓動另一個程序。
最粗糙的方法是使用Runtime.exec(String)
,它執行一個命令,就好像它被輸入到操作系統命令shell一樣。它返回一個Process
對象,該對象允許您檢索啓動過程的輸出併爲您提供對流程的一些控制。
更復雜但更詳細的方法是使用類ProcessBuilder
。主要優點是流程構建器允許您編寫更獨立於操作系統的代碼。
請記住,這兩種方法只有在mongodb與應用程序運行在同一服務器上時纔有效。在通常的生產環境中,mongodb運行在與應用程序服務器物理分離的多個專用服務器上。由於顯而易見的原因,在其他機器上啓動進程並不那麼簡單。有許多軟件解決方案可以讓您一次遠程管理多臺服務器上的多個進程(我們公司的服務器管理員像Control-M),但這是in the realm of server administrations。
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,它會下載並在本地主機推出一個新的MongoDB實例:默認爲27017。
有一個平臺獨立的包裝,將下載並運行所需的MongoDB的二進制:https://github.com/flapdoodle-oss/de.flapdoodle.embed.mongo
你需要作出一些改變你的測試配置,但除此之外,它是一個簡易替換。它一直在爲我們工作,沒有任何問題。
有辦法,但可能有更好的辦法。請解釋你想要完成的事情。 – chrylis 2014-09-01 08:28:40