2

我正在从 NHibernate 背景接近 MongoDB,我想知道在 Web 上下文中有效使用的最佳实践是什么。

使用 NHibernate,我为应用程序的生命周期创建了一个 ISessionFactory,然后为每个请求使用一个 ISession 实例。以下面的代码为例(我希望这是典型的,如果不理想请更正)。

我通常会为Mongo每个应用程序或每个请求提供一个类的单个实例吗?怎么样var db?或者我是否在需要数据库交互时使用下面的所有代码?

更新:我正在使用 mongodb-csharp(尽管如果存在,请提出更好的替代方案)

谢谢

using (var mongo = new Mongo())
{
    mongo.Connect();

    var db = mongo.GetDatabase("mydb");

    var mongoCollection = db.GetCollection("mycollection");

    var document = new Document(Guid.NewGuid().ToString(), new
                                                    {
                                                        x = 1,
                                                        y = 2
                                                    });

    mongoCollection.Insert(document);
}
4

2 回答 2

1

使用 mongodb-csharp 时,您会像对待 ADO 连接一样对待它。当你创建一个 Mongo 对象时,它会从池中借用一个连接,直到它被释放为止。因此,在 using 块之后,连接又回到了池中。创建 Mongo 对象既便宜又快速。

例子

for(var i=0;i<100;i++) 
{ 
        using(var mongo1 = new Mongo()) 
        using(var mongo2 = new Mongo()) 
        { 
                mongo1.Connect(); 
                mongo2.Connect(); 
        } 
} 

数据库日志6 月 2 日星期三
20:54:21 从 127.0.0.1:58214 #1 接受了
连接 6 月 02 日星期三 20:54:21 从 127.0.0.1:58215 #2 接受了连接 6月 2 日
星期三 20:54:21 MessagingPort recv() errno:0 没有错误 127.0.0.1:58214
6 月 2 日星期三 20:54:21 结束连接 127.0.0.1:58214
6 月 2 日星期三 20:54:21 MessagingPort recv() errno:0 没有错误 127.0.0.1:58215
6 月 2 日星期三20:54:21 结束连接 127.0.0.1:58215

请注意,它只打开了 2 个连接。

我使用 mongodb-csharp 论坛把它放在一起。 http://groups.google.com/group/mongodb-csharp/browse_thread/thread/867fa78d726b1d4

于 2010-11-05T15:48:34.213 回答
1

每个驱动程序通常都有某种形式的持久连接或连接池。我不确定您使用的是哪种语言/驱动程序,但请查看您的文档以了解连接池。

此外,在运行时,Mongo.connect()您通常会有连接字符串 ( mongodb://user:pwd@host:port/db),这将减少代码行并让您直接进入集合。

此外,您通常不需要使用 GUID。Mongo 驱动程序通常提供特定于 Mongo 的某种形式的“MongoID”。此外,如果您没有 ID,默认行为是为您创建一个 ID。

除此之外,我会详细查看您的驱动程序/库,因为它们略有不同。

于 2010-10-05T03:30:44.450 回答