4

DBI と FreeTDS (Ubuntu 上) を使用して SQL Azure にデータを挿入する Perl で断続的な問題が発生しました。問題が発生し、一部の行が無視される可能性がありますが、問題なく再度実行できます。

脚本:

print "Importing File $file: to Staging Table\n";
    open my $info, $file or die "Could not open $file: $!";

$dbh->do("EXEC DWTOOLS.InitStage;") or die $DBI::errstr ; #truncates the table

    my $sth = $dbh->prepare("INSERT INTO DWSTAGE.CDRImport (LINE) VALUES(?);") or die $DBI::errstr ;
    my $counter = 0;
    while( my $line = <$info>)  {
            $line =~ s/\r?\n$//;
            $counter++;
    print "Loading line $counter: $line\n" ;
            my $rc = $sth->execute($line) or die $DBI::errstr ;
            print "Result: $rc\n";
    }
    close $info;


print "\nChecking Data Warehouse: $counter lines expected\n" ;
my $checksth = $dbh->prepare("EXEC DWTOOLS.CheckStage ?;") or die $DBI::errstr ;
    my $checkrc = $checksth->execute($counter) or die $DBI::errstr ;

my @row;
while ( @row = $checksth->fetchrow_array(  ) ) {
    print "Row: @row\n";
}

出力を与えます:

Importing File filename: to Staging Table
Loading line 1: data redacted
Result: 1
Loading line 2: data redacted
Result: 1
etc. etc. with no indication of errors
Loading line 165: data redacted
Result: 1
Loading line 166: data redacted
Result: 1

Checking Data Warehouse: 166 lines expected
Row: 35 166
Row: 35 166
Loading to Data Warehouse

したがって、テーブルを見ると、すべての最初の行が、動作を開始した特定の時点まで (確実に - 最後まで) 欠落していることがわかります。つまり、基本的に、ファイルの最後の 35 行が読み込まれ、1 から始まります。行 1 が実際には行 (166-35+1) などである 35 まで上がります。Azure のテーブルには PK、クラスター化された IDENTITY 列があり、これは 1 から始まり、ギャップがないため、最初のように多くの挿入がエラーの兆候なしに削除されました。これは、さまざまなファイル、さまざまなサイズ、およびファイル内のさまざまな場所で発生します。

ファイルはループで処理され、各ファイルが開かれ、処理され、閉じられます。これは、この奇妙な動作に関係がある場合に備えています。ステートメントはファイルごとに 1 回再準備されますが、問題が発生する可能性がある場合、SQL Azure 接続はプログラムの存続期間中維持されます。接続障害が発生した場合、プログラムが停止することは依然として予想されますが、実行から返されるエラー コードがないことから判断すると、エラーの兆候が得られるとは確信が持てません。

先に進んでプログラムを再実行すると、すべての行が表示され、すべて問題ありません。

どのような結論を導き出すかはわかりません。現時点での私の結論は、FreeTDS にはバグが多く、信頼性が低いということです。

4

1 に答える 1

0

切り捨てプロセスが完了する前に、DB が挿入を実行しているように見えます。これがストアド プロシージャである場合は、完了したことを示す何らかのフラグを追加し、先に進む前にこれを確認できます。または、データベース呼び出しのセット全体をトランザクションにラップすることをお勧めします。

于 2015-10-04T19:06:35.777 に答える