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的网络连接)需要大量时间,并且有助于“缓存”打开的连接以尝试提高系统性能。 使用准备语句的可能原因 准备语句仅仅是为了通过减少语法分析时间来提高可重用查询的性能。 SQLite:什么是最好的选择? 答案取决于您的应用程序要求。个人而言,我不确定SQLite连接池是否一定是一个不错的选择。如果您的应用程序是单线程的,最好使用到SQLite DB的单个永久连接,这可能比池更快,并允许您使用预准备语句。这不同于SQL Server,其中连接池是一个非常合理的默认值。 如果性能很重要,您应该确定应用程序的配置文件,以查看SQLite连接池是否有益于您的方案。 具体问题 大多数答案与当前System.Data.SQLite提供程序source有关。
一般来说,你应该将一个从池中出来的连接视为新的连接,即你不应该期望从先前准备的语句中获得任何好处。该语句将“重新准备”,除非您同时保留命令和连接。
这是一个真实的陈述。
是的,你需要保持它。 SQLiteCommand持有对预准备语句的引用。
我不认为它是支持。
如果更改SQLiteCommand的连接,该语句将“重新准备”。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |