当关闭数据库连接后脚本退出时,Perl崩溃。

问题描述 投票:1回答:1

我有一个Perl脚本,使用DBI打开与Oracle数据库的ODBC连接。选择了一些数据,做了一些工作,实际上没有数据被提交回数据库,但我无法判断这是否有什么不同。

END 脚本块的数据库被断开。

END
{
    $$db->disconnect() if defined $$db;    
    exit 0;
}

perl.exe不会退出,而是会因为Oracle DLL的故障而崩溃。

故障应用程序名称:perl.exe,版本:0.0.0.0,时间戳。0x5407ac11 故障模块名称:OraOCIICUS19.dll_unloaded,版本:19.6.0.0,时间戳:0x5e1181b2。0x5e1181b2 异常代码: 0xc0000005 0xc0000005 故障偏移量:0x0000000000df18b0

我试着添加了一个 commit() 方法调用前 disconnect()ing,但这并没有帮助。


编辑1: $$db 在整个脚本中,当调用对象上的方法时,都会用到DBI连接。我认为这是因为DBI连接是在一个模块方法中创建的。

my $db = MyModule::OpenDB();
my ( $foo, $bar ) = MyModule::GetFoo( $db );
my $rows = $$db->selectall_arrayref( $SQLStr, { Slice => {} } );

如果我试着在single$上调用一个方法,那么我得到的错误是 Can't call method "commit" on unblessed reference


编辑2:打开DBI连接的模块是这样做的。

sub OpenDB
{
    my ($params) = @_;

    my $db = DBI->connect( "dbi:ODBC:Driver={Oracle in instantclient_19_6};Dbq=MYDB", "MYUSER", "MYPASS", {AutoCommit => 0, RaiseError => 1, PrintError => 0, ShowErrorStatement => 1 } ) or croak $DBI::errstr;
    $db->{LongReadLen} = 20480;
    $db->{LongTruncOk} = 1;

    return \$db;
}

我已经尝试过切换 AutoCommit 开启和关闭,以防止出现任何奇怪的情况。

perl dbi
1个回答
-1
投票

你不需要在脚本退出时断开DB的连接。当DB-handle离开作用域时,Perl (DBI)会自动为你做这件事。

通常(如果$db是对$dbh-handle的 "非弱化 "引用),这种情况之前不应该发生,所以这样做不应该抛出任何错误,但我猜测这个错误源于你代码的其他部分。

总之--在端块中删除断开连接是安全的。


-1
投票

在整个脚本中,当调用对象上的方法时,都会使用$$db。我认为这是因为DBI连接是在一个模块方法中创建的。

你好。

mhh,如果你真的使用DBI,你也许应该看看你的模块.thats我是怎么做的。

sub mysql_connect($$$$) {
    my ($f_database, $f_host, $f_user, $f_password) = (shift, shift, shift, shift);
    my $f_handler = DBI->connect("DBI:mysql:database=$f_database;host=$f_host", $f_user, $f_password, {RaiseError=>0,PrintError=>1});
    return $f_handler;
};

my $dbh = mysql_connect($db, $host, $user, $pass);

my $sql = "SELECT X FROM Y.Z";
my $stmt = $dbh->prepare($sql);
my $response = $stmt->execute();
while(my $rowref = $stmt->fetchrow_hashref()){
    my %row = %$rowref;
    for(keys %row){
        print $_." => ".$row{$_}."\n";
    }
}

$dbh->disconnect();

EDIT:试试吧,但改变mysql到oracle。

connect('DBI:Oracle:XE',"us01","us01")
© www.soinside.com 2019 - 2024. All rights reserved.