1

3つの異なるシステム間のファイル移動を監視するためのWebアプリケーションを作成しています。各システムは、以下の形式のログファイルを生成します。

Folder, Filename, DataTime, Filesize

要件は、で生成されたファイルSystem1がに正常に転送されたかどうかを識別すること3rd Systemです。また、失敗したポイントを特定します。

SQLite失敗したファイルの情報を7日間保持する必要があるため、データベースを使用しています。

データベース設計:

Folder, Filename, DateTime, FileSize, FileSource

FileSourceSystem1、、、System2にすることができますSystem3

このようにして一括挿入を行うことはできますが、失敗したファイルの識別が遅くなります。誰かが失敗したファイルを識別するための適切なSQLを作成するのを手伝ってくれますか。

例:サンプルデータ

folder1, file1, 2012-29-08 23:01:02, 10, S1
folder1, file1, 2012-29-08 23:03:02, 10, S2

上記のexデータは、S2からS3へのfolder1/file1転送が失敗したことを意味します。

注:1日あたり1万を超えるファイルが転送されます。

4

2 に答える 2

0

ここから行けるかわかりません。実際に転送を実行するプログラムからのエラーコードを記録したほうがよい場合があります。

あなたが今持っているテーブルにはいくつかの問題があります。

CREATE TABLE filelog (
  folder text, 
  filename text, 
  datatime timestamp, 
  filesize integer, 
  filesource text);

-- Your failed transfer . . .
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
-- . . . and a duplicate of it.
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');

私のテーブル名を置き換えて、あなたのクエリは

select folder, filename, count() 
from filelog group by folder, filename having count() < 3;

上記のデータでは、2つの失敗があったとしても、クエリは行を返しません。(または1つの障害の2つのコピー。)それを修正する最初のステップは、防御可能な主キーを宣言することです。

CREATE TABLE filelog (
  folder text, 
  filename text, 
  datatime timestamp, 
  filesize integer, 
  filesource text,
  primary key (folder, filename, datatime)
);

その主キーの制約により、1回の転送を2回入力することはできなくなります。同じファイルを1日に複数回転送できます。これは、最初の転送が失敗したときに意味がある場合があります。

-- Your failed transfer . . .
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-29 23:03:02',10,'S2');
-- . . . and an earlier transfer that also failed.
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-23 23:01:02',10,'S1');
INSERT INTO "filelog" VALUES('folder1','file1','2012-08-23 23:03:02',10,'S2');

クエリは再び行を返しません。転送の成功と失敗をより適切に定義する必要があります。

転送の成功にはこれらの特徴があるようです。

  • これには、S1、S2、およびS3の3つのソースすべてが含まれます。
  • これは単一のパス名用です。パス名はフォルダ+ディレクトリ区切り文字+ファイル名を意味します。
  • タイムスタンプはファイルソースの順序に従います。つまり、S1の「datatime」はS2の「datatime」の前にあり、S2の「datatime」はS3の「datatime」の前にあります。
  • 一意の{folder、filename、datatime}の場合、バイト数は3つのファイルソースすべてで同じです。

そして*大きくて面倒な特徴。。。

  • 単一のファイル転送の3つの行はすべて、単一の「バッチ」に属している必要があります(より適切な単語がないため)。つまり、タイムスタンプが正しい順序で転送されたバイトが正しい場合でも、クエリグループを下の最初の2行(転送の失敗)と下の最後の行(転送の成功の一部)にまとめてはなりません。 。

    folder1  file1  2012-08-29 23:01:02  10  S1
    folder1  file1  2012-08-29 23:03:02  10  S2
    folder1  file1  2012-08-29 23:45:02  10  S1
    folder1  file1  2012-08-29 23:48:02  10  S2
    folder1  file1  2012-08-29 23:53:02  10  S3
    

これやや複雑になります。そして、私はあなたの転送成功の基準を完全に誤解したかもしれません。

(おそらく、「datatime」列のより適切な名前を思い付くことができます。)

于 2012-08-29T17:07:16.417 に答える
0

あなたは私のシナリオを完全に誤解しています

CREATE TABLE filelog (
   folder       text, 
   filename     text, 
   transferTime     timestamp, 
   filesize     integer, -- what time the transfer occurs at this filesource 
   filesource   text,
   primary key (folder, filename, filesource)
   );

各ソースは、転送または処理するファイルを含むログ ファイルを生成します。

ケース: file1.txt が S1 のログ ファイルにあり、S2 のログ ファイルにない場合、これは S1 と S2 の間の転送が失敗したことを意味します。

file1.txt が S1 と S2 の両方のログ ファイルにあり、S3 ログ ファイルにない場合、S2 と S3 の間でファイル転送が失敗したか、S3 がファイルを処理しませんでした。

このクエリを使用すると、S2 または S3 で見つからないファイルを見つけることができます。

select folder, filename, filesource, count(*) 
from filelog 
group by folder, filename, filesource
having count() < 3;

あなたに返信している間に、count が 1 の場合は S1 と S3 で転送が失敗したことを意味し、count が 2 の場合は S2 と S3 の間で転送が失敗したことを意味します。

お返事をありがとうございます。@catcall

于 2012-08-29T19:31:27.183 に答える