SQLite并发访问出现The database file is locked , database is
发布时间:2020-12-12 19:53:04 所属栏目:百科 来源:网络整理
导读:在站点服务端使用SQlite存储一些临时数据,但是在多人并发的时候Sqlite会抛出异常:The database file is locked,database is locked Sqlite的特点: 简单(simple):SQLite是一个非常轻量级自包含(lightweight and self-contained)的DBMS:一个头文件,一个
在站点服务端使用SQlite存储一些临时数据,但是在多人并发的时候Sqlite会抛出异常:The database file is locked,database is locked
Sqlite的特点:
SQLite只支持库级锁,库级锁意味着什么?——意味着同时只能允许一个写操作,也就是说,即事务T1在A表插入一条数据,事务T2在B表中插入一条数据,这两个操作不能同时进行,即使你的机器有100个CPU,也无法同时进行,而只能顺序进行。表级都不能并行,更别说元组级了——这就是库级锁。但是,SQLite尽量延迟申请X锁,直到数据块真正写盘时才申请X锁,这是非常巧妙而有效的。 Sqlite不支持并发执行写入操作,即使是不同的表,只支持库级锁,而且这个Sqlite本身没有实现,必须自己实现这个库级锁。 综上所述,对于库级锁的数据库,可以定义一个全局的锁变量,在所有需要发起事务的操作中使用同步机制访问数据库。 class PublicationEventHandler implements JobEventHandler { public static final Object SQLITE_DBLEVEL_LOCK = new Object(); @Override public void onCompleted(JobEvent event) { synchronized (SQLITE_DBLEVEL_LOCK) { ServiceLocator.getJobNotificationService().markJobNotified(event.getJobCommand().getIdentity(),JobStatusDefinition.COMPLETE); } } @Override public void onCancelled(JobEvent event) { synchronized (SQLITE_DBLEVEL_LOCK) { ServiceLocator.getJobNotificationService().markJobNotified(event.getJobCommand().getIdentity(),JobStatusDefinition.CANCEL); } } @Override public void onFailed(JobEvent event) { synchronized (SQLITE_DBLEVEL_LOCK) { ServiceLocator.getJobNotificationService().markJobNotified(event.getJobCommand().getIdentity(),JobStatusDefinition.FAIL); } } @Override public void onStart(JobEvent event) { synchronized (SQLITE_DBLEVEL_LOCK) { ServiceLocator.getJobNotificationService().addJobNotification(event.getJobCommand().getIdentity()); } } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |