2019年7月4日更新:
今天和同事聊到这个话题,我说不用调.close(),但是和他看到的博客里写的示例代码不太一样,就觉得是不是我们的代码里写错了,一时词穷,便翻翻以前的博客找证据。
当时我写这篇的理由是看到官方文档里说sqlite为什么能够比文件系统快。但是今日再读好像并不能支持我的观点不必调用.close()。搜索引擎找一番,终于看到实锤的证据了,原作者站台,非常可靠,感谢FMDB。
以下是原文:
是否需要在每次使用数据库的时候都去调用DB.close()?
SQLite是文件数据库,这比一般用于异地部署的数据库(比如Mysql)相对简单些,它的性能最大的消耗在IO操作,除了读写文件之外,在打开和关闭文件的时候也是比较吃资源的操作,为什么SQLite比一般文件快,就是因为一般情况下它的打开和关闭只要做一次,这样在多次访问数据库的情况下,打开/关闭数据库的消耗处于一个边际成本非常低的态势,所以SQLite比一般文件快。(当然,对于数据库来说,更大的优势在于它对与结构化数据的优化处理,不过这里不讨论这个)。
那么为什么SQLite不用频繁关闭就更快呢?这里有个基本原理作支撑,了解一点算法的同学都知道这么一句话:“以空间换时间”。SQLite就是这样干的,通过把已经打开的数据库实例保存在内存中,这样在下一次访问时可以直接使用,而不用再次去初始化数据库实例(这里指打开数据库)。
还有一个地方用到Close(), 那就是我们在查询的时候,但是这里我们得到的指示确是需要及时调用rs.close()
。这是因为:
- rs作为查询结果集,它本身不具有很强的复用性,如果缓存起来很不经济(浪费内存,缓存命中率还低的可怜)
- rs会占用数据库连接,而数据库连接是有效的,当异步线程在同时访问相同数据库连接时,会造成数据库异常,这时可能会导致程序闪退。可以读一下这篇文章学习更多。