我一直在花一些时间阅读数据库和 SQLite 的不同最佳实践。在阅读时,我发现我做了很多我不应该做的事情,当我试图解决这些问题时,当我想到将 SQLite 与它的 ADO 实现一起使用的一些更精细的细节时,我变得困惑。
我的困惑特别源于准备好的语句和连接池。
在阅读http://msdn.microsoft.com/en-us/library/ms971481.aspx时,我发现只能为事务打开连接。事务完成后,应关闭连接。我不知道为什么会这样,但我一直在假设作者比我更了解。我理解当连接关闭时并不意味着它实际上已经被关闭。它只是意味着它已被放回池中。
现在为了改进我的查询和插入,我阅读了有关使用准备好的语句的信息。在 SQLite 中,准备好的语句真的能提高性能吗?和http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.html似乎都表明在执行查询时,将执行多次准备好的语句是要走的路。我还读过准备好的语句是特定于连接的,一旦连接关闭,准备好的语句就会丢失。
我的困惑是这样的。如果我正在打开和关闭我的连接(这可能意味着也可能不意味着由于线程池而关闭了连接),那么我真的从准备好的语句中得到了多少用处?我可以理解,如果我有 1000 个对象,我需要保存在一个事务中,准备好的语句可以提供很大帮助。但是,我不相信我会看到在事务中保存单个对象的好处,因为一旦我关闭连接,从第一个对象生成的准备好的语句现在就丢失了。这是一个真实的说法吗?
我相信准备好的语句与我的 SQLiteCommand 对象的范围相关联,这进一步加剧了我的困惑。
如果我创建一个代表我将经常执行的查询的 SQLiteCommand,我是否需要将该 SQLiteCommand 保留在内存中以使准备好的语句保持活动状态?
如果我使用相同的 SQLite 语句创建一个新的 SQLiteCommand,它是否认识到新的 SQLiteCommand 与以前的相同,因此有一个可以使用的准备好的语句?
如果我在内存中保留一个 SQLiteCommand 并在我打开和关闭不同事务的连接时更改它的参数和连接,我是否实质上在不同的连接之间保持了准备好的语句?
在这一点上,我很可能会过度思考,但我希望你能帮助我更好地理解这些事情是如何相互作用的,这样我就可以从中获得最大的收益。