我一直花一些时间阅读数据库和SQLite的不同最佳实践。在阅读时,我发现自己做了很多事情,我不应该这样做,当试图解决这些问题时,在思考使用SQLite和ADO实现的一些细节时,我变得很困惑。SQLite/C#连接池和准备好的语句混淆
我的困惑主要来自准备好的语句和连接池。
在阅读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并改变它的参数和连接为我打开和关闭不同的交易连接我在本质上保持一份声明中不同的连接之间还活着吗?
我在这一点上最有可能在思考的事情,但我希望你能帮助我更好地理解如何将这些东西互动,所以我能获得最大的利益了出来。
我不太熟悉SQLite,但关于为什么一个人应该尽快关闭连接,你自己来接近自己回答:底层的物理连接没有关闭,你只需将连接返回到池。其含义是它可以被其他线程使用。很明显,如果你坚持连接但不实际使用它,那将限制最大可能的利用率。 (同样清楚的是:如果您处于单线程环境中,连接池并没有太多意义,尽管伤害不大。) –