DBD :: SQLITE问题与已安装文件系统上的I/O错误有关



考虑以下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数据源并通过该数据库访问数据库。

相关内容

最新更新