Chinaunix首页 | 论坛 | 博客
  • 博客访问: 8106345
  • 博文数量: 159
  • 博客积分: 10424
  • 博客等级: 少将
  • 技术积分: 14615
  • 用 户 组: 普通用户
  • 注册时间: 2010-07-14 12:45
个人简介

啦啦啦~~~

文章分类
文章存档

2015年(5)

2014年(1)

2013年(5)

2012年(10)

2011年(116)

2010年(22)

分类: 数据库开发技术

2010-07-14 13:05:05

本文的copyleft归gfree.wind@gmail.com所有,使用GPL发布,可以自由拷贝,转载。但转载请保持文档的完整性,注明原作者及原链接,严禁用于任何商业用途。
作者:gfree.wind@gmail.com
博客:linuxfocus.blog.chinaunix.net
    
 

Sqlite是一个轻量级的数据库,每一个数据库对应一个文件。Sqlite使用文件读写锁来处理同步问题。在Unix/Linux平台上,它使用fcntl来锁住文件。

这种文件锁有两个问题:

1. 不同的Unix/Linux平台,线程间有可能override前一个锁;

2. 当进程关闭任一一个指向该文件的文件句柄时,所有的文件锁就无效了;

为了处理第1个问题,sqlite会检测运行的平台,如果该平台线程间会override前一个锁,那么sqlite会使用内部逻辑来禁止这种情况。

对于第二个问题,当关闭数据库时,sqlite会检测是否该进程还有其他线程在锁住这个文件,如果有,那么并不关闭这个文件句柄,直到所有的锁都释放完毕。

因为这样的处理,在多线程的环境下,就有可能造成该数据库文件始终被一个线程锁住,而无法释放文件锁。

但是当文件句柄到达1024,也就是系统的最大限制时,其他线程将无法打开这个数据库文件,只剩下一个线程可以打开数据库。

那么即使线程间竞争再激烈,那个唯一打开数据库的线程也会有机会释放掉所有的文件句柄。

除非有某个线程block住了

所以,当你发现你因为文件句柄满了而无法打开数据库。就可以从两方面查看这个问题。

1.检查是否有文件句柄在某些情况下确实没有关闭,如出错处理等等;

2..检查是否有死锁,或者死循环导致线程阻塞,使该线程始终拥有一把数据库锁;

阅读(4121) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~