8

約5人のユーザーグループで、フロントエンド/バックエンドの分割構成としてセットアップされたMSAccess2003アプリケーションを作成しました。フロントエンド.mdbはネットワークファイルサーバー上にあり、すべてのクエリ、フォーム、レポート、VBAコードに加えて、バックエンド.mdb内のすべてのテーブルへのリンクと、AS/などのODBCデータソースへのリンクが含まれています。 400。バックエンドは同じネットワークファイルサーバー上にあり、テーブルデータが含まれているだけです。

これは、私が「ライブ」になり、少数のユーザーが拡張リクエストやバグレポートなどを考え出すまではうまく機能していました。フロントエンドの.mdbの独自のコピーで開発/テストすることにより、新しいコードを展開しています。別のネットワークフォルダー(同じバックエンド.mdbにリンクされている)、完成したファイルを「come-and-get-it」フォルダーに投稿し、ユーザーに警告すると、ユーザーは新しいフロントエンドをコピーして貼り付けますネットワーク上の独自のフォルダにファイルします。このようにして、各ユーザーは、全員を一度に起動しなくても、「停止点」にいるときにフロントエンドを更新できます。

私が今開発しているとき、時々Accessが非常に遅くなることがわかりました。たとえば、フォームを作成してプロパティボックスのドロップダウンをクリックしようとすると、ドロップダウン矢印が押し込まれますが、オプションのリストが表示されるまでに数秒かかります。または、フォームのコントロールの選択と移動には多くの遅れがあります。または、キーボードの遅延がたくさんあります。

その後、他の時間には、ラグはまったくありません。

他のユーザーと同じバックエンドにリンクしているからなのかしら。必要に応じて、レコードのロックを最小限に抑えて、クエリ、フォーム、レポートなどを設定するために合理的な努力をしました。しかし、私は何かを見逃した可能性があります。あるいは、対処する必要のある他のパフォーマンスの問題があるかもしれません。

しかし、自分の開発バックエンド.mdbをセットアップするためのさらに良い方法があるかどうか疑問に思っているので、他のユーザーと同じライブデータではなく、「安全な」データでコードをテストできます。 。恐らく最悪の瞬間に、いくつかのデータを破壊するのは時間の問題だと思います。

明らかに、別のバックエンド.mdbを設定し、Linked Table Managerを使用して、毎回フロントエンドのテーブルリンクを手動で再構成することができます。しかし、私はそれよりもエレガントな解決策があることを望んでいます。

そして、このマルチユーザーの分割データベース構成で考慮すべき他のパフォーマンスの問題があるかどうか疑問に思っています。

編集:私はMS Access(MS-SQLやその他の「実際の」バックエンドではない)で立ち往生していることを追加する必要がありました。詳細については、この投稿への私のコメントを参照してください。

4

8 に答える 8

13

すべてのユーザーがフロントエンドを共有している場合、それは間違った構成です。

各ユーザーは、フロントエンドの個別のコピーを持っている必要があります。フロントエンドを共有すると、共有フロントエンドが頻繁に破損したり、フロントエンドのフォームやモジュールが奇妙に破損したりすることが保証されています。

A2000以降、エンドユーザーが使用しているのと同じフロントエンドのコピーでどのように開発できるかはわかりません(VBAプロジェクト全体が保存される「モノリシック保存モデル」のため)。システムテーブルの1つにある単一のレコードの単一のBLOBフィールドに)。

私は実際に問題が本番データを使用することによって引き起こされるとは思いません(他の人が言っているように、本番データに対して開発することはおそらく良い考えではありませんが)。私はそれらが貧弱なコーディング慣行とあなたのフロントエンドコードの維持の欠如によって引き起こされていると思います。

  1. VBEオプションでCOMPILEONDEMANDをオフにします。

  2. OPTIONEXPLICITが必要であることを確認してください。

  3. コードを数行おきに頻繁にコンパイルします。これを簡単にするために、VBEツールバーにCOMPILEボタンを追加します(その間、CALL STACKボタンも追加します)。

  4. フロントエンドのバックアップを定期的に作成し、コードを逆コンパイルして再コンパイルします。これは、/ decompileスイッチでAccessを起動し、フロントエンドを開き、Accessを閉じ、Accessでフロントエンドを開き(Shiftキーを押しながらスタートアップコードをバイパスする)、逆コンパイルされたフロントエンドを圧縮する(SHIFTを使用)ことで実現されます。キーを押したまま)、プロジェクト全体をコンパイルし、最後にもう一度圧縮します。これは、メジャーコードがリリースされる前に行う必要があります。

他のいくつかの考え:

  1. それがWindowsサーバーであるかどうかはわかりません。SAMBAを介してアクセスされるLinuxサーバーは過去に問題を示しました(一部の人々はそれらを誓い、Windowsサーバーよりもはるかに高速であると言います)。歴史的に、NovellサーバーはJetファイルを確実に編集できるように設定を微調整する必要がありました。Windowsサーバーで調整して作業を改善できる設定(OPLOCKSなど)もいくつかあります。

  2. JetMDBを短いパスの共有に保存します。\ Server \ Data \ MyProject \ MyReallyLongFolderName \ Access \ Databases \は、\ Server\Databasesよりもデータの読み取りがはるかに遅くなります。これは本当に大きな違いを生みます。

  3. リンクされたテーブルには、古くなる可能性のあるメタデータが格納されます。2つの簡単なステップとそれを修正するために取られるべき1つの抜本的なステップがあります。まず、バックエンドを圧縮してから、フロントエンドを圧縮します。それは簡単なことです。それでも問題が解決しない場合は、リンクを完全に削除して、最初から再作成してください。

  4. MDEはアンコンパイルできないため(MDBでは可能)、MDBではなくエンドユーザーにMDEを配布することを検討することもできます。

  5. その他の一般的なパフォーマンス情報については、 TonyToewsのパフォーマンスFAQを参照してください。

于 2009-05-21T21:05:28.260 に答える
2

1)コード http://www.mvps.org/access/tables/tbl0009.htmからアクセステーブルを再リンクします

新しいMDEをユーザーに公開する準備ができたら、テーブルを再リンクし、MDEを作成して、MDEをサーバーにコピーします。

2)無料のAuto FE Updaterユーティリティを特別に作成したので、FE MDEを何度でも変更でき、次に誰かがアプリを実行したときに、最新バージョンがプルされると確信できます。エラーまたはAutoFEUpdaterユーティリティの詳細については、私のWebサイトのhttp://www.granite.ab.ca/access/autofe.htmにある無料のAuto FE Updaterユーティリティを参照して、各PCのFEを最新の状態に保ちます。 。

3)クライアントの現場で作業しているとき、全員がシステムから離れている時間後にテーブル構造を更新します。方法: Access 2000でユーザーのアイドル時間または非アクティブを検出する(Q210297)http://support.microsoft.com/?kbid=210297 ACC:ユーザーのアイドル時間または非アクティブを検出する方法(Q128814)http://support.microsoftを参照してください。 .com /?kbid = 128814

ただし、タイマーイベントで実行されるコードは、プログラマーが無効にする必要があることがわかりました。そうしないと、コードを編集しているときに奇妙なことが起こり始めます。

また、印刷プレビューでは、ユーザーがメニュー項目を実行してレポートをExcelなどにエクスポートできない場合がありました。そのため、プレビューされたレポートを右クリックして、レポートにある種の内部フォーカスを戻し、レポートをエクスポートできるようにする必要がありました。これは、タイマーを5分に延長することによっても助けられました。

タイマーを5分に延長することの欠点は、人が1日のかなりの時間、同じ形で同じコントロールを維持している場合、つまり誰かが同じ問い合わせをしている場合、ルーチンは実際に何かをしたことに気づかなかったことです。彼らがプログラムで何かをするときはいつでも、私はいつかこのタイマーをリセットするためにいくつかのロジックを入れます。

4)スキーマを更新するためのスクリプトなどについてコメントしている別の人については、Compare'Emhttp://home.gci.net/~mike-noel/CompareEM-LITE/CompareEM.htmを参照してください。それには癖がありますが、テーブル、フィールド、インデックス、および関係を更新するためのVBAコードを作成します。

于 2009-05-22T03:20:07.023 に答える
1

devからprodに切り替えるときは、VBAを使用して、テーブルのリンクを解除し、新しいターゲットに再リンクします。構文を覚えておくのは何年も前のことです。関数の記述が簡単だったのはわかっています。

または、MS-Accessを使用して、ODBCまたはクライアントmdbの外部にあるその他のデータ接続を介してMS-Accessと通信します。

すべてのファイルベースデータベースと同様に、最終的には使用量のピーク時、または2〜30の小さな魔法の数を超えると問題が発生します。

また、Accessは頻繁に破損する傾向があるため、バックアップ、コンパクト化、および修復を頻繁に実行する必要があります。このタスクを自動化するために存在していたサードパーティのツール。

パフォーマンスに関しては、データはクライアント側で処理されているため、netmeterなどを使用して、ネットワークを通過するデータの量を監視することをお勧めします。インデックス作成とテーブルスキャンの回避に関する同じ原則が、ファイルベースのデータベースにも適用されます。

于 2009-05-21T11:26:46.930 に答える
1

他の人からの多くの良い提案。これが私の2ミリセントの価値です。私のバックエンドデータは、ドライブマッピングを介してアクセスされるサーバー上にあります。私の場合、Yドライブです。本番ユーザーは、ActiveDirectoryを使用したログインスクリプトを介してマッピングを取得します。次に、次のシナリオをバッチファイルで簡単に実行できます。

  • バッチファイルでsubstコマンドを実行して、ローカルコンピューターに対して開発する
  • Yをバックアップサーバーにポイントして、昨夜のデータに対してレポートを実行します(読み取り専用)
  • 適切なディレクトリをポイントして、月末のデータに対してレポートを実行します
  • 特別なディレクトリを保持することにより、特別なシナリオに対してテストします

私の環境(平均5人の同時ユーザー、1000行ではなく1000行)で破損が発生しましたが、それはまれで管理可能です。過去数年間に一度だけ、前日のバックアップに頼ってきました。大量のSQLServerを使用していますが、おそらくサイトにSQL管理者がいないため、開発するのはそれほど便利ではありません。

于 2009-05-21T12:23:39.297 に答える
0

また、この質問に対する回答(アクセスからスキーマを抽出する方法)のいくつかも役立つ場合があります。提案された手法の1つを使用してスキーマを抽出すると、スキーマでソース管理を使用する機能や、「クリーンな」テスト環境を簡単に構築できる機能など、さまざまな新しいオプションを利用できるようになります。

コメントに応答するように編集する:Accessデータベースをネイティブ形式でソース管理する簡単な方法はありませんが、スキーマファイルは他のファイルと同様に単なるテキストファイルです。したがって、バージョン管理/ロールバックを簡単にするために、選択したソース管理ソフトウェアでそれらをチェックインおよびチェックアウトできます。

またはもちろん、スキーマからデータベースを再構築するために一連のスクリプトを設定しておく必要があります。一度実行すると、通常、別の場所に再構築するオプション/代替バージョンを作成するのはかなり簡単です。これにより、以前にコミットされたバージョンのスキーマからテスト環境を構築できます。それが少し明確になることを願っています!

于 2009-05-21T11:36:35.867 に答える
0

新しいFEをクライアントにリリースするときにバックエンドMDBスキーマを自動的に更新する場合は、Compare'Emhttp://home.gci.net/~mike-noel/CompareEM-LITE/CompareEM.htmを参照してください。 VBAコードはMDBを再作成する必要があります。または、既存のBEMDBのバージョンアップグレードを実行できるように2つのMDB間の違いを作成するコード。少し風変わりですが、機能します。

いつも使っています。

于 2009-06-23T08:02:18.370 に答える
-1

データの共有mdbファイルは堅牢なソリューションではないことを理解する必要があります。Microsoftは、SQL Serverまたはその他のサーバーベースのデータベースがはるかに優れたソリューションであり、同じアクセスフロントエンドを使用できるようにすることを提案します。移行ウィザードは、そのようにしたい場合に切り替えを行うのに役立ちます。

別の用途が指摘しているように、破損が発生します。それは単に頻度の問題であり、そうでない場合ではありません。

パフォーマンスの問題を理解するには、サーバーにとって、データを含むmdbファイルが単にファイルであることを理解する必要があります。サーバー上でコードが実行されないため、サーバーはトランザクションやレコードロックなどを理解しません。サーバーは、多数の人々が同時に読み取りと書き込みを行おうとしているファイルがあることを単に知っています。

SQL Server、Oracle、DB2などのデータベースシステムを使用します。MySQLなどのデータベースプログラムはサーバー上で実行され、データベースファイルにアクセスする単一のプログラムのようにサーバーに見えます。これは、レコードのロック、トランザクション、同時実行、ロギング、データのバックアップ/リカバリ、およびデータベースに必要なその他すべての優れた機能を処理するデータベースプログラム(サーバー上で実行)です。

サーバー上で実行するように設計されたデータベースプログラムはそれだけを実行するように設計されているため、Accessのようなプログラムが共有ファイル(mdb)の書き込みを読み取るよりもはるかに効率的かつ効率的に実行できます。

于 2009-05-21T11:39:35.267 に答える
-2

ライブデータに対して開発するための2つのルールがあります

最初のルールはです。。。ライブデータに対して開発することはありません。今までにない。

2番目のルールはです。。。ライブデータに対して開発しないでください。今までにない。

リンクされたテーブルのバインディングをプログラムで変更できるため、新しいバージョンを展開するときにリンクを変更するマクロを作成できます。

アプリケーションはMSAccessであるため低速であり、多数の同時ユーザー(多くは1より大きい任意の数)を好みません。

于 2009-05-21T11:26:05.950 に答える