36

小規模なプロジェクトの場合、要件が非常に軽い単純なデータベースを利用する必要があります。テーブル数は少なく、合計レコード数は数千以下で、ユーザーは 2 人か 3 人です。私は.NET環境で作業しています。

この場合、データベース サーバー (これらの Express エディションでさえも) は非常に過剰に思えるため、非常に単純な MDB データベースでほとんどの要件を満たすことができます。ただし、同時実行性が心配です。私の考えは、.mdb ファイルをネットワーク共有に配置し、ユーザーが .NET ベースのクライアントからこのファイルにアクセスできるようにすることです。データベースは主に読み取り専用操作を目的としていますが、ユーザーはレコードを更新/削除する必要がある場合もあります。その時点でこれが不可能な場合 (データベースがロックされているなどの理由で)、クライアントで更新を保持し、後で処理することができます。

質問自体は次の点に沿っています。

  • MDB での同時読み取りはどのように処理されますか?
  • 同時更新/削除は MDB でどのように処理されますか?
  • ロックの概念はありますか? .NET アプリでどのように活用できますか?
  • MDB ファイルをネットワーク共有に配置することは良い考えですか、それとも恐ろしい考えですか?

私は .NET で作業しているので、同時実行の問題を検出して適切なアクションを実行する方法も知りたいです。つまり、どの例外をキャッチする必要があり、どのアクションを実行することをお勧めしますか?

編集:問題の私の悪い説明かもしれませんが、ほとんどの回答は本格的なDBサーバーを使用することを勧めているようです。私はサーバーをインストールすることの違いと利点を理解しており、実際に MSSQL と Oracle でかなりの数のプロジェクトを実装してきました。ただし、この質問では、Access とその同時実行の問題のみに関心があるため、db サーバーを提案しないでください。

ご協力いただきありがとうございます。

4

11 に答える 11

50

これは古い質問ですが、実際に答えた人はいません。質問は次のとおりです。

  1. MDB での同時読み取りはどのように処理されますか?
  2. 同時更新/削除は MDB でどのように処理されますか?
  3. ロックの概念はありますか? .NET アプリでどのように活用できますか?
  4. MDB ファイルをネットワーク共有に配置することは良い考えですか、それとも恐ろしい考えですか?

最初の 2 つの質問は、基本的に 1 つの説明で答えることができます。ここで重要な注意点が 1 つあります。ここでの回答は Jet MDB (およびその亜種) に固有のものであり、A2007 以降に導入された新しいファイル形式、つまり ACCDB 形式には完全には適用されません。ACE からの Jet ULS の削除の影響を十分に調査したわけではありません。以下のコメントの一部は、ボンネットの下に Jet ULS があると想定している可能性があります。ただし、多くの場合、「LDB ファイル」を「LACCDB ファイル」に置き換えることができ、結果は同じになります。

1-2) 同時読み取り/更新/削除

Jet データベース エンジンは、サーバー上のデータ ファイルの I/O を管理するサーバー側のデーモンが存在しないという点で、"ファイル サーバー" データベースと呼ばれることがよくあります。これは、Jet MDB を使用するすべてのクライアントがファイルを直接読み取っていることを意味します。

もちろん、ファイルへの同時アクセスを処理するためのメカニズムが組み込まれていない場合、これは災害のレシピです。

Jet はレコード ロック ファイルを使用します。MDB が「MyFile.MDB」の場合、レコード ロック ファイルは同じフォルダにあり、「MyFile.LDB」と呼ばれます。LDB ファイルには、どの Jet ULS ユーザーが MDB ファイルを開いているか、そのユーザーが接続しているワークステーションは何か、および同時実行の問題のネゴシエーションに必要なすべての情報が記録されます。

クライアント/サーバー データベース エンジンに慣れている人にとっては、これは原始的で危険に思えるかもしれませんが、Jet データベース エンジンが開発された時点では、その目的は小規模なワークグループ用のデスクトップ データベース エンジンとして使用することでした。は、xBase や Paradox などの他のデスクトップ db エンジンと競合していました。どちらも類似のロック ファイルを使用して、複数のクライアントからのデータ ファイルの同時使用を管理していました。

Jet データベース ファイル内では、ロックはデータ ページ (Jet 4 では 4K に増えましたが、Jet 3.x 以前では 2K でした)、またはデータ テーブルが最初に作成された場合はレコード レベルで適用されます。レコード レベルのロックを使用します。Jet 4 の初期の頃、レコード レベルのロックは非常に遅く、特にペシミスティック ロックを使用すると多くの人が発見したため、多くの Access 開発者はページ レベルのロック以外は何も使用しませんでした (@David Fenton が挙手!)。

実際、楽観的ロックを使用すると、悲観的ロックに伴う並行性の問題のほとんどを回避できます。

いくつかの注意事項:

  1. DAO からは、レコード レベルのロックは使用できず、ページ レベルのロックしか取得できません。

  2. DAO から、楽観的/悲観的ロックを制御するためのオプションが多数あります。特に、OpenRecordset メソッドの LockEdits 引数ですが、これは OpenRecordset Options 引数で指定された特定の設定とも相互作用します (たとえば、Option dbReadOnly は、 LockEdits)。ロックに加えて、一貫性/非一貫性の更新のオプションもあり、これらすべてがトランザクションと対話できます (たとえば、コミットされていないトランザクション内の変更は他のユーザーには表示されないため、競合することはありませんが、関連するテーブルに読み取り専用ロックをかけることができます)。

ADO/OLEDB から、これらの Jet 同時実行制御構造は、ADO/OLEDB にある関連する関数と引数にマップされます。私は Access からのみ Jet を使用するため、DAO を介してのみ対話します。そのため、ADO/OLEDB を使用してこれらを制御する方法についてアドバイスすることはできませんが、Jet データベース エンジンは、アクセス時にレコードのロックを制御できるということです。 (Access UI を使用するのではなく) プログラムで作成する場合は、より複雑になります。

3) ロックと .NET

OLEDB をデータ インターフェイスとして使用する可能性が高いということ以外は、ここでアドバイスを提供することはできません。 OLEDB。ただし、OLEDB はクライアント/サーバー アーキテクチャを中心に設計されており、Jet のファイルベースのロックはエレガントな方法でそれに対応していない可能性があるため、きれいではないかもしれません。

4) ネットワーク共有上の MDB

Jet は、ネットワーク接続のわずかな問題に非常に敏感です。そのため、帯域幅の狭いネットワークでは、低速の接続で開いている Jet データベースの脆弱性が高まる可能性があります。

これは、データベース ファイルの主要なチャンクをローカル コンピューターの RAM に転送して処理する必要があるためです。現在、多くの人が、MDB ファイル全体がワイヤを介してプルされている、またはテーブル全体がワイヤを介してプルされていると誤って主張しています。本当じゃない。代わりに、Jet は最初にインデックスを要求し (そして、クエリを満たすために必要以上に要求しない)、その結果から必要なデータ ページを正確に判断し、それらのページのみをプルします。これは驚くほど効率的で高速です。

また、Jet は非常にインテリジェントなキャッシングを行います。つまり、最初のデータ リクエストには時間がかかる場合がありますが、同じデータに対する後続のリクエストはキャッシングによりほぼ瞬時に発生します。

ここで、テーブルのインデックスを適切に作成していない場合、テーブル全体をプルしてフル テーブル スキャンを実行することになる可能性があります。同様に、Jet の SQL ダイアレクトの一部ではないクライアント側関数に基づいて基準を設定すると、完全なテーブルを取得することになる可能性があります (たとえば、Replace(MyField, "A", "Z") で並べ替えると、全表スキャン)。しかし、そのようなことはクライアント/サーバー アーキテクチャでも非効率になるため、適切にインデックスを作成し、UDF や非 Jet 互換関数の使用に注意するのが常識的なスキーマ設計です。一般に、クライアント/サーバーで効率的な同じことは、Jet でも効率的になります (主な違いは、Jet では、LDB ファイルを再作成するオーバーヘッドを回避するために永続的な接続を使用したほうがよいということです。重要です)。

避けるべきもう 1 つのことは、WiFi 接続を介して Jet データを使用しようとすることです。WiFi の信頼性が低いことは誰もが知っています。それは、WiFi 接続を介して Jet データを操作しようとすると、問題が発生するだけです。

要点:

Web サーバーからデータを提供するためのデータ ストアとして MDB を使用している場合は、データを Web サーバーの RAM のできるだけ近くに配置する必要があります。つまり、可能であれば、物理 Web サーバーに接続されているディスク ボリューム上で。それが不可能な場合は、高速で信頼性の高い LAN 接続が必要です。最近では、データ センター内の GB LAN はかなり一般的であり、そのような接続を介して Jet データを操作するのは非常に快適です。

たとえば、単一の Jet MDB をデータ ストアとして共有する VB.NET デスクトップ アプリを実行する複数のクライアント ワークステーションなど、共有で使用する場合、データ ファイルを信頼できるファイル サーバーに置くことは非常に安全です。可能であれば、Jet MDB ファイルを複数の目的に使用されていないマシンに配置することをお勧めします (たとえば、Exchange、SQL Server を実行し、ファイル サーバーおよびプリント サーバーとして機能しているドメイン コントローラーは最適な場所ではない可能性があります)。 . Exchange のようなアプリは、ファイル サーバーの機能にひどく干渉する可能性があります。また、極端にボリュームが少ない場合を除き、Exchange サーバーとしてマルチタスクを実行しているサーバーに MDB ファイルを配置しないことをお勧めします。

その他の考慮事項:

  1. すべてのユーザーが同じレプリカを使用していない限り、複製されたファイル システムに MDB を配布しようとしないでください。つまり、2 つのサーバー間でファイルをレプリケートしている場合、両方のサーバーから MDB ファイルを編集することは考えないでください。これにより、ファイルがすぐに破損します。

  2. ネイティブの Microsoft SMB ネットワーク経由で提供されるネイティブの Windows ファイル システム以外には、MDB を保存しないことをお勧めします。つまり、Novell も Linux も SAMBA もありません。この主な理由は、他のファイル システムで 100% 複製されていない Windows ファイル システムのいくつかの低レベル ロック機能への Jet からの明らかに低レベル フックがあることです。さて、私はこれに関して非常に保守的であり、多くの有能な Access 開発者が、適切に構成された Novell ファイル サーバーで優れた結果を報告しています (最近では関連性が低くなる可能性がありますが、多くの場合、レコード ロックの調整が必要になります。 Novell がもう存在するかどうかさえ知りません!)、SAMBA を実行する Linux ベースのファイル サーバーで驚異的なパフォーマンスを発揮します。私はこれに慎重であり、それに対してクライアントをお勧めします (これにはさまざまな SAN デバイスが含まれます。

  3. 同じ理由で、仮想化されたファイル システムでそれらを実行することは決してありません。しかし、Mac Air で Parallels の下でシングルユーザー Access アプリを数年間実行しているクライアントがいますが、今のところ 1 つの問題も発生していません。ただし、これはシングル ユーザーであるため、ロックの問題は比較的軽微です。

それがあなたの質問に答えているかどうかはわかりません。これはすべて、Access 開発者としての 13 年間の定期的な Jet の使用と、Jet に関する唯一の出版物である Jet データベース エンジン プログラマーズ ガイド (Jet 3.5 のみ) の研究に基づいています。私は実際の引用を提供していませんが、誰かが私が言ったことについて詳細を必要とする場合は、できる限り調査を行います.

于 2009-12-22T02:16:54.860 に答える
13

私は何年にもわたって Access で 12 ほどの小規模ビジネス アプリを構築してきました。ほとんどの場合、一度に最大 10 ~ 20 人のユーザーが使用できます。データベースは、「アプリ」データベースと「データ」データベースに分割されます。パフォーマンスはまともで、同時実行性に問題はありません。また、Access 2000 SP2 以降、破損は基本的に存在しません。

「Access は絶対に使わないで」と言う人がたくさんいますが、それが正しく行われていれば (つまり、プロの開発者によって)、Access は非常に優れた開発パッケージであり、私はそれで十分な生活を送っています。私の顧客は、私が構築したものに非常に満足しています。

于 2009-03-30T00:32:52.577 に答える
11

私は、ネットワーク共有から実行されるAccessデータベースを使用する2つの商用製品を、通常は最大10人のユーザー向けに作成しました。あなたがそれを乱用しなければ、本当に問題はありません。しかし、ご覧のとおり、多くの開発者はそこにたどり着きません。そのローエンドの性質のために、多くのくだらないハックが構築されています。1つの製品の場合、他の人が詳細に説明したすべての問題のために、アプリを再設計する必要がありました。しかし、クリーンアップした後は、何百ものインストールでデータベースの整合性の問題が発生することはありませんでした。

その大きな利点の1つは、単一ファイルデータベースです。これは、バックアップ、復元、およびラップトップへのコピーが簡単で、分析できます。sqliteを含むほとんどすべての選択肢(一部の人はそれを認めませんが)は、時々何らかの形のDBAの注意を必要とします。

ほとんどの場合、Accessはデフォルトでレコードロックと一部のDDL(スキーマの変更など)のファイルロックを提供します。

しかし、Microsoftは基本的にそれを廃止しており、あなたの同僚の何人かはそれを使用するためにあなたを軽蔑するでしょう。

(この時点で、私は通常、カバーをかぶって「INCOMING !!!」と叫びます。)

于 2009-03-29T21:58:44.883 に答える
3

私はAccess、より正確には、この小さな国の職業のサイズによって制限されているため、成長することのできない非常に小さなプライベートサイトのバックエンドとしてJetを使用しています。3年間問題はありませんでした。ユーザー数は100人未満で、毎日約30〜40人が使用しています。テーブルには数千のレコードがあります。

于 2009-03-29T20:41:59.437 に答える
2

Accessはマルチユーザーであると想定されています-Microsoftは最大4〜5人のユーザーに推奨していると思いますが、実際には、複数のユーザーがいるAccessデータベースは絶対に使用しないことをお勧めします。特定の条件を前提として、2つまたは3つで許容できる選択肢はありません。

私はAccessデータベースバックエンドを使用した4つまたは5つのシステムの経験があります-すべて他の「開発者」から取得しました-そしてすべての場合において、必要な即時の更新と修正の後、優先順位としてそれらをSQLServerに移動しました契約を結ぶとき-一般的に私が上司に請求書を支払うことを話すことができるとすぐに。その期間は通常数か月であるため、いくつかの異なるアプリケーションで妥当な期間同時に実行されているのを見てきました。

実際、システムに多くの同時挿入/更新がなく、頻繁に使用されていない場合は、通常、問題なく機能します。私の経験における主な実際的な問題は..

  1. それは腐敗しやすいです-それはただそうします。ファイルを開いてコンパクトに実行し、修復すると問題が解決するため、通常、これはそれほど問題にはなりませんが、適切なバックアップ体制が絶対に不可欠です。

  2. 遅いです。システムをSQLServerにアップグレードするたびに、ユーザーからシステムを高速化するための多くの称賛を受けました。

  3. Accessがレコードを更新または削除済みとしてマークする方法が原因で、データベースファイルが肥大化します。これにより、ファイルをネットワーク経由でロードする必要があるため、システムの速度がさらに低下します。したがって、通常は毎日、データを圧縮するいくつかの体制が不可欠です。

上記のすべては、これらを促す根本的な問題がはるかに目立たないため、シングルユーザーシステムの問題ではありません。

全体として、マルチユーザーシステムにAccessを推奨することは決してないことを強調する必要があります。ただし、実際に持っている場合は、使用頻度の低いアプリケーションであり、バックアップとメンテナンスの手順を実行する限り、おそらくそれを回避できます。

于 2009-03-29T21:57:29.910 に答える
1

実際のマルチユーザーの無料データベースプラットフォームを使用することは、すでに何度か述べられています。しかし、その理由の1つは述べられていません。この理由は、「少数のレコード、最大1人または2人のユーザー」として、既存の、厄介で、面倒で、大規模なAccessデータベースがいくつ始まったのかということです。私はそれらすべてを言うことに挑戦したいと思います。

会社全体で従業員が2、3人しかない場合を除いて、有用なソフトウェアを開発すると、最終的には元の2、3人以上のユーザーが使用し、元の数千件以上のレコードを持つ可能性があります。 、そして何年にもわたって拡張され、多くのフォーム、さらに多くのテーブル、およびはるかに多くのデータが含まれるようになります。家が建てられたら、家の基礎をやり直すことはできません。今日、強力な基盤を構築してください。そうすれば、家を心ゆくまで拡張できます。ソフトウェアについても同じです。

于 2009-03-29T19:17:27.127 に答える
1

ネットワーク共有を使用する場合、アクセスの代わりにネットワーク対応データベース (mysql/firebird/mssql) を使用します。

Accessの使用について説明した状況では問題ありません。

私はより困難な状況で Access を使用してきましたが、これは主に、Access が計り知れないほど悪用されていない Web サイトで作業する場合であり、データベース エンジンとしてはそれほど悪くはありません。(テーブルやレコードだけのフォームやそのようなものについては話していません)

一度に複数のユーザーから挿入/更新/削除を行うと、少し面倒になります。これが、実際のデータベース エンジンについて考え始めるポイントです。

また、スレッドセーフなオーバーヘッドの低いデータベースが必要な場合は、vistadb を見ることができます (アクセスが遅く、常に無料であるとは限りません。100% .NET)。

アクセスには、ある種のキューイングメカニズムを備えたテーブルレベルのロックが使用されていると思います。問題なく動作するはずです。心配な場合は、シミュレートされたストレス テストをいつでも実行できます。

于 2009-03-29T16:47:32.993 に答える
-1

マルチユーザー シナリオで Access を使用しないでください。

プロジェクトの前任者がバックエンドとして Access を選択したため、2 週間の苦痛を経験しました。

具体的な理由:

  • Linq-to-Access のようなものはありません
  • アクセスには、デバッグに時間がかかるコマンドへのパラメーターの追加順序への依存関係など、多くの癖があります
  • アクセスはスケーリングされません
  • データベースの更新は、SQL Server を使用する場合に比べて面倒です
于 2009-03-29T18:36:14.307 に答える