2012-01-31 22 views
1

私は、午前12時(午前12時)に新しいログファイルを作成し、その日の終わりまで変更があったときはいつでもログファイルを更新するマシンを持っています。SQL Server 2008データベースにテキストファイルをインポートする

  1. SQL Serverデータベースにリアルタイムでデータをインポートするには(30秒、1分、または変更がある場合はいつでも)?
  2. SQL Server 2008はアクティブなログファイルにアクセスできますか?そうでない場合は、更新があるたびに私のマシンに新しいログファイルを作成させる方が簡単でしょうか?しかしそうであれば、リアルタイムで名前の異なる非常に多くのログファイルをどのようにインポートするのですか?あなたが逆のタイムスタンプ付き各新しい行をログに記録することができます

Thxをたくさん

答えて

1

(私は複数のマシンへのソリューションをスケールアップすることができなければなりません)。

ファイルが変更されたときにのみログを記録する必要があるので、ファイルから読み込んでデータを格納するインメモリキュー を実装できます。 次に、プロデューサコンシューマモデルを実装します。ここでは、1つのスレッドがキューからデータを読み込み、コンシューマログをデータベースに読み込みます。 Windowsサービスは、キューからの読み取りを維持してSQL Serverにログを記録できます。 (プロデューサのコンシューマであるため、キューが空の場合に待機することがありません)

どのような場合でも、すべてのログが作成されるたびにプロデューサスレッドに通知する必要があります。これは、ロギングを行っているコードにアクセスできる場合に備えて、Sockets /その他の方法で行うことができます。

+0

ロギングを行っているコードにアクセスできない場合はどうすればいいですか?機械は第三者によって維持管理されています – user1179728

0

SQL ServerスケジュールジョブによってSSISパッケージが呼び出されるのはどうですか?

1

ファイルを生成しているアプリケーションを制御できない場合は、ファイルをポーリングするしかありません。ファイルを定期的にポーリングし、デルタをデータベースに書き込むアプリケーションを作成します。アプリケーションは最後に読んだ最高水準点を記録する必要があります。

アプリケーションが書き込みの間にファイルを閉じないと、最後にアクセスされたタイムスタンプが更新されない可能性があるため、ファイルの有効期間のチェックが信頼できない可能性があります。この場合、あなたはこのプロセスのようなものを実装する必要があります。

  • を開き、ログファイル
  • があなたの最後に記録EOF位置にシークを
  • あなたが得るまで、プロセス
  • 成功した場合、新しいデータを読み込む試してみてください新しいEOFに追加します。
  • 永続EOF位置
  • を更新するには、バイト数は、ファイルとの整合がシーク位置を読むことを確認する必要がありますファイル

を閉じます。ログファイルがユニコードの場合、バイトと文字の間に1:1のマッピングがない可能性があります。バイナリモードでファイルのチャンクを読み込み、バッファから文字への変換を行う必要があるかもしれません。

ログファイルのエントリを解析したら、データを挿入するか、より大きなデータボリュームにSQLBulkCopyを使用するだけです。

遅延制約を緩和することができ、ログファイルが十分小さい場合、ログファイルをステージング領域にコピーして定期的にリロードするプロセスを実装できます。

関連する問題