我的困惑主要来自准备好的语句和连接池。
在阅读 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保留在内存中,以使准备好的语句保持活动状态吗?
如果我创建一个具有相同SQLite语句的新SQLiteCommand,是否会认识到新的SQLiteCommand与先前的SQLiteCommand相同,从而可以使用准备好的语句?
如果我在打开并关闭不同事务的连接时,在内存中保留一个SQLiteCommand并更改它的参数和连接,那么我是否在不同连接之间保持了一个准备好的语句?
我现在可能想太多了,但我希望你能帮助我更好地理解这些要点,以便我可以从中获得最大的效益。