SQLite/C#连接池和准备语句混乱

前端之家收集整理的这篇文章主要介绍了SQLite/C#连接池和准备语句混乱前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我一直在花一些时间阅读不同的数据库sqlite的最佳实践。在阅读时,我发现我在做许多事情,我不应该做,当试图解决这些问题时,我想到了一些更细致的使用sqlite与它的ADO实现的细节时困惑。

我的混淆特别来自准备的语句和连接池。

在阅读http://msdn.microsoft.com/en-us/library/ms971481.aspx时,我发现连接只应该为一个事务打开。一旦事务完成,则应关闭连接。我没有一个确切的把握,为什么是这种情况,但我一直在努力的假设,作者知道更好的我。我明白,当一个连接被关闭,这并不意味着它实际上已关闭。它只是意味着它已被放回池中。

现在改进我的查询和插入我阅读关于使用准备语句。 In SQLite,do prepared statements really improve performance?http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.html都似乎表明,当执行一个将要做多次准备的语句的查询是要走的路。我还读了一个准备的语句是特定于一个连接,并且一旦连接关闭,准备的语句丢失。

我的困惑是这样的。如果我打开和关闭我的连接(这可能或可能不意味着连接正在关闭,由于线程池),那么我真正从准备语句多少使用?我可以理解,如果我有1000个对象,我需要保存在单个事务,准备语句可以帮助很多。然而,我不相信我会看到从一个事务中保存单个对象的好处,因为一旦我关闭连接,从第一个对象生成的准备语句现在丢失。这是真的吗?

我的困惑进一步的事实,我相信一个准备的语句链接到我的sqliteCommand对象的范围。

如果我创建一个sqliteCommand代表一个我将要执行的查询,我需要保持sqliteCommand在内存中准备语句保持活动?

如果我创建一个新的sqliteCommand与相同的sqlite语句是它承认新的sqliteCommand是相同的前一个,因此有一个准备的语句,可以使用?

如果我在内存中保留一个sqliteCommand,并改变它的参数和连接,因为我打开和关闭不同事务的连接,我基本上保持准备语句活着在不同的连接之间?

我很可能在这一点上思考的事情,但我希望你可以帮助我更好地了解这些东西如何互动,所以我可以从他们中获得最大的收益。

它有助于记住连接池和准备(编译)语句只是工具,有他们的限制,没有办法可以同样适用于所有可能的情况。考虑到这一点,让我们记住什么时候可能想使用连接池和准备语句。

使用连接池的可能原因

当连接昂贵时,连接池很有用,例如:

>建立连接(与sql Server或Oracle DB的网络连接)需要大量时间,并且有助于“缓存”打开的连接以尝试提高系统性能
>连接在应用程序(来自服务多个并发请求的Web应用程序的连接)中或在应用程序之间共享,因此必须尽快发布以允许其他客户端继续。

使用准备语句的可能原因

准备语句仅仅是为了通过减少语法分析时间来提高可重用查询性能

sqlite:什么是最好的选择?

答案取决于您的应用程序要求。个人而言,我不确定sqlite连接池是否一定是一个不错的选择。如果您的应用程序是单线程的,最好使用到sqlite DB的单个永久连接,这可能比池更快,并允许您使用预准备语句。这不同于sql Server,其中连接池是一个非常合理的默认值。

如果性能很重要,您应该确定应用程序的配置文件,以查看sqlite连接池是否有益于您的方案。

具体问题

大多数答案与当前System.Data.sqlite提供程序source有关。

If I am opening and closing my connection (which may or may not mean
the connection is being closed due to the thread pool) then how much
use am I really getting from a prepared statement?

一般来说,你应该将一个从池中出来的连接视为新的连接,即你不应该期望从先前准备的语句中获得任何好处。该语句将“重新准备”,除非您同时保留命令和连接。

However I don’t believe I would see a benefit from saving a single
object in a transaction because once I close the connection the
prepared statement that was generated from the first object is now
lost. Is this a true statement?

这是一个真实的陈述。

If I create a sqliteCommand that represents a query that I will be
executing often do I need to keep that sqliteCommand in memory for the
prepared statement to stay active?

是的,你需要保持它。 sqliteCommand持有对预准备语句的引用。

If I create a new sqliteCommand with the same sqlite statement is it
recognized that the new sqliteCommand is the same as the prevIoUs and
thus has a prepared statement that can be used?

我不认为它是支持

If I keep a sqliteCommand in memory and change it’s parameters and
connection as I open and close the connection for different
transactions am I essentially keeping a prepared statement alive
between different connections?

如果更改sqliteCommand的连接,该语句将“重新准备”。

猜你在找的Sqlite相关文章