tro*_*our 2 database sqlite perl
许多客户端在 sqlite 数据库上查询时的众所周知的问题:数据库被锁定
我想增加在 Linux 上等待锁定释放的延迟(以毫秒为单位),以消除此错误。
从 sqlite-command 中,我可以使用例如(4 秒):
sqlite> .timeout 4000
sqlite>
Run Code Online (Sandbox Code Playgroud)
我已经启动了许多进行选择/插入/删除的进程,如果我不使用 sqlite-command 设置此值,我有时会得到:
sqlite> select * from items where code like '%30';
Error: database is locked
sqlite>
Run Code Online (Sandbox Code Playgroud)
那么 .timeout 的默认值是多少?
在 Perl 5.10 程序中,我有时也会遇到此错误,尽管默认值似乎是 30.000(所以 30 秒,未记录)。
程序在出现此错误之前实际上等待了 30 秒吗?如果是,这看起来很疯狂,即使该数据库上正在运行许多其他进程,数据库至少有一段时间是空闲的
my $dbh = DBI->connect($database,"","") or die "cannot connect $DBI::errstr";
my $to = $dbh->sqlite_busy_timeout(); # $to get the value 30000
Run Code Online (Sandbox Code Playgroud)
谢谢!
默认繁忙超时DBD::Sqlite定义为dbdimp.h30000 毫秒。您可以使用 更改它$dbh->sqlite_busy_timeout($ms);。
命令sqlite3行 shell 的正常 Sqlite 默认值为 0;也就是说,没有超时。如果数据库被锁定,它会立即出错。.timeout ms您可以使用或进行更改pragma busy_timeout=ms;。
超时的工作原理如下:
处理程序将多次休眠,直到累积至少“ms”毫秒的休眠时间。休眠至少“ms”毫秒后,处理程序返回 0,这会导致
sqlite3_step()returnSQLITE_BUSY。
如果即使有 30 秒的超时,您也遇到数据库繁忙错误,那么您只是运气不好,因为尝试在频繁使用的数据库文件上获取锁定(或者某些东西正在运行非常慢的查询)。如果还没有使用WAL 模式,您可以考虑一下。