我正在使用以下代码连接到MongoDb:
def insert() = {
val mc = new com.mongodb.MongoClient("localhost", 27017);
val db = mc.getDatabase("MyDb");
//My insert code
mc.close();
} //> insert: ()Unit
我有各种打开和关闭连接的方法。可以的线:
val mc = new com.mongodb.MongoClient("localhost", 27017);
val db = mc.getDatabase("MyDb");
mc.close();
被提取,以便在方法的开始和结束时隐式调用它们。Scala隐式服务是否适合这种情况,还是需要反射?
一种常见的模式是使用按名称调用方法,您可以在其中传递一个接受aDB
并对其执行某些操作的函数。按名称调用方法可以促进客户端等的创建,并在其中执行代码。
def withDB[A](block: DB => A): A = {
val mc = new com.mongodb.MongoClient("localhost", 27017);
val db = mc.getDatabase("MyDb");
try block(db) finally mc.close()
}
并使用它:
def insert() = withDB { db =>
// do something with `db`
}
但是,查看文档说明:
具有内部连接池的MongoDB客户端。对于大多数应用程序,您应该为整个JVM使用一个MongoClient实例。
假设这是您正在使用的版本,那么使上述方法看起来不是一个好主意。我绝对可以看到尝试执行此操作并打开太多连接的一些并发问题。
但是,您可以遵循相同的模式,将创建的连接填充到单个对象中。但是,当您的应用程序关闭时,您将需要管理客户端的关闭。
object Mongo {
lazy val mc = new com.mongodb.MongoClient("localhost", 27017);
lazy val db = mc.getDatabase("MyDb");
def withDB[A](block: DB => A): A = block(db)
def close(): Unit = mc.close()
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句