考虑以下Perl代码:
#!/usr/env/ perl
use strict;
use warnings;
use DBI;
my $filename = 'moo.sqlite';
my $dbh = DBI->connect("dbi:SQLite:dbname=$filename","","");
my $sql = 'INSERT into moo values (1)';
my $sth = $dbh->prepare( $sql );
my $rv = $sth->execute();
print $rv;
运行时产生此错误:
DBD::SQLite::db prepare failed: disk I/O error at test.pl line 16.
Can't call method "execute" on an undefined value at test.pl line 18.
SQLite文件位于SMBFS / CIFS网络安装的共享上。
我做了一些跟踪,看起来在尝试对文件进行锁定时发生了故障:
open("moo.sqlite\0", 0x202, 0x1A4) = 3 0
fcntl(0x3, 0x1, 0x0) = 0 0
fcntl(0x3, 0x2, 0x1) = 0 0
虽然我知道网络锁定存在问题,但在交互运行'sqlite3'二进制文件时会出现同样的问题吗?目前,我可以在没有问题的情况下处理文件。
这是DBI造成的吗?
获取您的信息:
答案 0 :(得分:2)
SQLite允许多个进程打开数据库文件 一次,并为多个进程一次读取数据库。什么时候 任何进程都想写,它必须锁定整个数据库文件 更新的持续时间。但这通常只需要几个 毫秒。其他进程只需等待编写器完成 继续他们的业务。其他嵌入式SQL数据库引擎 通常只允许单个进程连接到数据库 一次。
你可以试试这个,它可能会有所帮助:
my $dbh = DBI->connect("dbi:SQLite:dbname=$filename","","", "", "", {
sqlite_use_immediate_transaction => 1,
});
问题是CIFS驱动程序可以配置为兑现/允许锁定。如果未正确配置该部件,则锁定将不起作用。
您可以尝试更改samba中的锁定设置:http://oreilly.com/openbook/samba/book/ch05_05.html
尝试它的最佳人选:“假oplocks =是”
如果它不起作用,您可以尝试在Windows机器上设置ODBC数据源并通过它访问数据库。