繁体   English   中英

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

[英]Good Coding Practice with Databases: One connection / query vs one connection / all queries

所以我发现自己正在努力,这是最佳实践。 这是我十年来第一次编码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应用程序都适用吗?

建议仅在需要时(即在工作单位需要时)将连接保持“打开”状态。

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM