数据库的良好编码实践:一个连接/查询与一个连接/所有查询
本文关键字:一个 连接 查询 数据库 编码 | 更新日期: 2023-09-27 18:30:43
所以我发现自己在挣扎,这是最好的做法。这是我第一次编写 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 的行为因所使用的线程模型而异。
您可能必须具有在想要访问 databse 的所有代码之间共享连接的逻辑。您可能还需要防止不同线程同时使用 Sqlite 数据库的代码。
大多数其他 ADO.NET 提供程序都支持连接池,这意味着在调用 Close()
方法时将重用连接。