数据库的良好编码实践:一个连接/查询与一个连接/所有查询

时间:2013-09-10 09:59:24

标签: c# sql sqlite

所以我发现自己在努力,这是最好的做法。这是我第一次编写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,因此连接只打开一次,而Database对象只使用相同的句柄,即使程序可以并且将创建许多数据库对象。

但是,这实际上是否必要?每次创建对象时,我应该只是在主数据库类中打开一个新连接吗?我发现有另一个网站和线程,显然,即使你为你维护一个连接池,.NET Framework的功能也是如此,所以即使你可能正在打开和处理多个连接,它们也不会真正关闭。这是真的如此,这是否适用于桌面和Windows 8应用程序?

2 个答案:

答案 0 :(得分:0)

建议保持连接打开'只要他们需要,只要工作单位需要。

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

如果您的应用程序是单线程的,那么您可能不会注意到池的发生,但是在有许多线程需要数据访问的情况下,更快的连接将返回到池中,然后它们可以更快地重新启动 - 由其他线程使用。

答案 1 :(得分:0)

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

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

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