2009-08-12 7 views
1

私はこのトピックと私の同僚との集中的な議論に関する広範な研究を行ってきました。Jet/ADOですぐに接続を閉じることは本当に賢明ですか?

一般的なコンセンサスは、データベース接続が必要なときに待機し、すぐに終了する必要があるようです。接続のキャッシング/プーリングは、アプリケーション自体ではなく、データベースドライバまたはその他のレイヤーによって行われる必要があります。

しかし、私はJet/ADOに関しては疑問があります。 Jetおよび/またはADOは、リードキャッシュと遅延書き込みを使用し、"unsynchronized" connectionsになる可能性があります。もちろん、私はJROを使用するたびに接続を再同期することができますが、それは非常に面倒でパフォーマンスの低下の可能性があります。

各接続を閉じ、すべての新しい接続を再同期する "ベストプラクティス"にするか、Jet/ADOの特質のためにグローバル接続オブジェクトを使用するだけですか?

答えて

2

VB6デスクトップアプリケーション用にグローバル接続を使用することをお勧めします。理想的にはデータベース・ドライバーは透過的に接続プールを管理しますが、VB6でADOまたはDAOでJetを使用している場合、ではありません:OLE DB Jet Provider doesn't have connection pooling。私は.NETのプロバイダはそう信じています。

あなたのアプリケーションはデスクトップアプリケーションであると想定していますが、実際には指定していません。私はIISアプリケーションやCOM +の経験がないので、そこに何がベストかわかりません。おそらくジェットアクセスを使用しないでください!デスクトップアプリケーションでも問題ありません。

+0

JetはおそらくWebベースのアプリケーションのための最良のデータストアではないと私は同感しますが、元のポスターの場合のVB6アプリケーションではうまく機能します。従って、-1。 –

+0

@David:VB6は、IISアプリケーションとCOM +の両方に使用されます。元のポストはデスクトップアプリケーションであることを意味する「アプリケーション」を使用しています。これが最初に取り上げられたのですが、IISやCOM +のヒントである「レイヤー」も使用されています。 – MarkJ

+0

明確にするために - 私は、VB6/Jet Accessを使用する多くのユーザーと2台のデスクトップアプリケーションを維持しています。 – MarkJ

1

最新のDBMSのほとんどは、接続を管理するためにConnectionPoolを提供しています。しかし、あなたが connection.close()を使用するとき。 あなたは実際に接続を閉じることはありません。プールに戻すだけで、書き込むときには connection.open(); 実際には新しい接続を作成しません。あなたはConnectionPoolで準備された接続を受け取り、それを使用するだけです。

したがって、DBMSにクエリを渡すたびに接続を開いて閉じると、パフォーマンスに問題は生じません。 に加えて、いくつかの同じ接続を使用することはできませんデータリーダーSQLDataReader。

これは特にウェブサイトを開発するときにはグローバル接続を使用しません 2人のユーザーが2人のデータ読者が同じ接続を使用しようとしたときに、

+0

しかし、Jet/ADOの同期の問題はどうですか? –

+0

-1。私はこの答えはVB.NETのVB6ではないと思いますか? SQLDataReaderは確かに.NETのものです。そして、Jet用のADO OLE DBプロバイダは、接続プーリングを提供しません。ただし、.NETプロバイダはそうしています。 http://support.microsoft.com/kb/191572 – MarkJ

+0

申し訳ありませんが、vb6とマークされています。 –

2

最後の二つの大きなVB6 +私は(二つの異なるチーム/雇用)で働いていたADO +アクセスデータベースエンジンのアプリと同じアプローチを使用:

  • ADODB.Connectionオープンにしてくださいクライアント側カーソル
  • を使用します
  • 直ちにジェット/ ACEの問題のSet rs.ActiveConnection = Nothing
5

いずれかを使用して、各 ADODB.Recordsetを切断し、そのTでありますロッキングファイル(* .ldb)を作成すると、パフォーマンスが大幅に低下する可能性があります。また、LDBがすでに存在する場合(別のユーザーが接続されているため)、ロックの設定にはかなりの時間がかかります。

このように、LDBファイルを常に再作成して再接続するために時間を浪費する可能性があるため、アプリの接続回数を最小限に抑えたいとします。

多くのプログラマーの間では、アクセスアプリではmaintain a persistent connectionです。

通常、テーブルを隠しフォームで開くか、テーブルのレコードセットを開くことをお勧めします。私は、バックエンドを指すデータベース変数の初期化を好む。引用した記事のTonyの反対意見は、私にとってはかなり重要ではないようです。たとえば、Mid(CurrentDB.TableDefs( "MyLinkedTable")。Connect、11)などの接続文字列を解析するのは簡単ではありません。

これはJet/ACEデータベースエンジンの問題であるため、非アクセスコンテキストでは同じ問題が発生します。もちろん、オープンな接続を維持する特定の方法は異なりますが、ポイントをオープンにすることは、ロックファイルのdbエンジンによる競合が少なくなることを意味します。

関連する問題