DBD :: SQLite问题与挂载的文件系统上的I / O错误

时间:2012-10-30 12:48:01

标签: perl sqlite

考虑以下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造成的吗?

获取您的信息:

  • OS OS X 10.6.8
  • SQLite版本3.7.13
  • Perl 5.12.4
  • DBI 1.622
  • DBD :: SQLite 1.37

1 个答案:

答案 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数据源并通过它访问数据库。