【问题标题】:Good Coding Practice with Databases: One connection / query vs one connection / all queries良好的数据库编码实践:一个连接/查询与一个连接/所有查询
【发布时间】:2013-09-10 09:59:23
【问题描述】:

所以我发现自己在苦苦挣扎,这是最佳做法。这是我第一次编写 C# 代码,也是十年来第一次编写任何代码。当我担任 php / sql 程序员时,我们通常不赞成为每个查询打开一个新连接的想法,但我今天在 google 上研究这个问题越多,特别是 C# 和 sqlite,似乎很多人推荐做完全相反。

所以,我希望为你们中的一些人提出这个问题,他们显然在做这件事的时候不仅仅是眼睛。这是我的数据库类的一般设置:

class DatabaseController
{

    static private SQLiteConnection _sqlconn;
    static private string _uri;

    public static SQLiteConnection Sqlconn
    {
        get { return DatabaseController._sqlconn; }
        set { DatabaseController._sqlconn = value; }
    }

    public static string Uri
    {
        get { return DatabaseController._uri; }
        set { DatabaseController._uri = value; }
    }

}

第二个类,它是主要的数据库类,它处理实际运行的查询等。我有 DatabaseController 类的原因是因为我可以将打开的连接句柄存储到静态成员 _sqlconn ,因此连接只打开一次,并且数据库对象只需使用相同的句柄,即使程序可以并且将创建许多数据库对象。

但是,这真的有必要吗?每次创建对象时,我是否应该简单地在主数据库类中打开一个新连接?我发现另一个站点和线程显然,.NET Framework 所做的是即使您为您维护一个连接池,所以即使您可能打开和处理多个连接,它们并没有真正关闭。真的是这样吗?这是否适用于桌面和 Windows 8 应用程序?

【问题讨论】:

  • 打开和关闭连接会对系统造成负担。 IMO,我经常看到使用的池系统(您同时打开了多个连接,并从不同的线程(工作者)重用它们。

标签: c# sql sqlite


【解决方案1】:

建议仅在需要时保持连接“打开”,即只要工作单元需要。

正如您所建议的,当您“关闭”它们时,它们实际上并没有关闭,而只是返回到池中以供其他线程/应用程序重用。这适用于任何 ADO.NET 数据提供程序。

如果您的应用程序是单线程的,那么您可能不会注意到池的发生,但是在有许多线程需要数据访问的情况下,连接返回到池中的速度越快,它们被重新使用的速度就越快由其他线程。

【讨论】:

    【解决方案2】:

    使用 sqlite 时,您必须知道引擎是如何编译的。见这里http://sqlite.org/threadsafe.html。这很重要,因为 sqlite 的行为取决于所使用的线程模型。

    您可能需要在所有想要访问数据库的代码之间共享连接的逻辑。您可能还需要防止不同线程同时使用 Sqlite 数据库的代码。

    大多数其他 ADO.NET 提供程序支持连接池,这意味着当您调用 Close() 方法时,连接会被重用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-18
      • 1970-01-01
      • 2019-06-27
      • 1970-01-01
      • 2015-10-08
      • 2011-08-24
      • 1970-01-01
      • 2016-03-11
      相关资源
      最近更新 更多