2

所以我发现自己在苦苦挣扎,这是最好的做法。这是我第一次编写 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 应用程序?

4

2 回答 2

0

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

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

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

于 2013-09-10T10:10:33.357 回答
0

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

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

大多数其他 ADO.NET 提供程序都支持连接池,这意味着在调用该Close()方法时可以重用连接。

于 2013-09-10T10:11:27.107 回答