考虑以下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 ", 0x202, 0x1A4) = 3 0
fcntl(0x3, 0x1, 0x0) = 0 0
fcntl(0x3, 0x2, 0x1) = 0 0
我知道网络锁定是有问题的,但是当交互式运行'sqlite3'二进制时,是否会出现同样的问题?目前,当我这样做时,我可以在文件上工作。
这是DBI引起的吗?
以获取您的信息:
- OS OS X 10.6.8
- sqlite版本3.7.13
- Perl 5.12.4
- DBI 1.622
- dbd :: sqlite 1.37
sqlite允许多个进程使数据库文件打开 一次,以及多个过程一次读取数据库。什么时候 任何过程都想写,它必须锁定整个数据库文件 更新的持续时间。但这通常只需要几个 毫秒。其他过程只等待作者完成 继续他们的业务。其他嵌入式SQL数据库引擎 通常只允许一个过程连接到数据库 一次。
您可以尝试一下,它可能会有所帮助:
my $dbh = DBI->connect("dbi:SQLite:dbname=$filename","","", "", "", {
sqlite_use_immediate_transaction => 1,
});
问题是CIFS驱动程序可以配置为荣誉/允许锁定。如果该部分未正确配置,则锁定将不起作用。
您可以尝试更改桑巴岛中的锁定设置:http://oreilly.com/openbook/samba/samba/book/ch05_05.html
尝试一下的最佳候选人:" fake oplocks = yes"
如果它不起作用,您可以尝试在Windows计算机上设置ODBC数据源并通过该数据库访问数据库。