我的混淆特别来自准备的语句和连接池。
在阅读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 @R_404_126@ 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的连接,该语句将“重新准备”。