2009-05-18 7 views
3

SQL Server 2005 dbにアクセスする複数のスレッドを使用するすべてのアプリケーションで作業しています。現在、TADOQueryオブジェクトの接続文字列プロパティを設定して暗黙的な接続を使用していますが、データベースへの接続。TADoConnection and pooling

  1. タップ接続ライブラリで使用できる接続プーリングは何種類あり、どうすればそれを有効にして制限を設定することができますか。
  2. もしそうでなければ、データベースへの接続を減らして再利用することで、アプリケーションの規模が大きくなるような方法をお勧めします。

私は任意の意見や考えをいただければ幸いです。..

多くのおかげ

+0

接続文字列にMultipleActiveResultSets = Trueを追加してみてください。これをコメントとして追加するのは、Delphiで動作するかどうかわからないからです。 –

+0

もし私が間違っていなければ、これは 'TADOConnection'コンポーネントの背後にある全ての目的です。独自の接続で複数の' TADOQuery'コンポーネントを作成するのではなく、データベース接続を1か所にプールすることです。しかし、ここでの答えは、ADOのいくつかの奇妙な動作を記述しています。私のケースでは、 –

答えて

3

デフォルトでは、SQL ServerへのADOデータベース接続は必要なくなり、プールされます。プーリングの動作は、接続文字列によって変更できます。あなたの接続文字列はどうですか?

接続文字列をまったく同じにして、スレッド内でADO接続を作成または解放し、ADOランタイムでプーリングを処理させます。プロセスあたりの接続数は、通常、「最近の」同時接続の最大数とバッファの数の和に等しくなります。

+0

私はado.netがデフォルトで接続プーリングを行っていることを知っていますが、DelphiのTADOConnectionもそうですか?関連ドキュメントへのリンクはありますか? –

+0

TADOConnectionは、MicrosoftのOLEDBインターフェイスのBorland/CodeGearラッピングです。 http://blogs.msdn.com/selvar/archive/2007/11/10/ole-db-resource-pooling.aspxというリンクがあります。 ADODBを見ると、Borlandが行ったこのラッピングが見えます。あなたはtypelibを自分でインポートして直接行くことができますが、TADOxxxコンポーネントを使う方がはるかに簡単です。 –

1

DataModuleの上TADOConnectionのコンポーネントを設定し、DataModuleの上の他のすべてのADOコンポーネントから、すでに多くのを減らす必要があることを利用し接続。 アプリケーションが多数のデータモジュールを使用している場合、実行時にこれらのデータモジュールを同じ接続で共有することができます。

+0

いくつかのスレッドはdatamoduleにアクセスしますが、tadoconnectionは同時に複数のクエリをオープンしますか? –

+0

スレッドからデータモジュールを使用する場合は、スレッド内のデータモジュールのインスタンスを作成して破棄することが理にかなっているため、各スレッドには独自のデータモジュールがあります。次に、スレッドごとに接続する必要があり、パラメータとフィールドの値はスレッド間で競合しません。 –

+0

このオプションは、クエリごとにではなく、スレッドごとに接続の量を減らすだけです。ほとんどのスレッドが単一のクエリしか含んでいない場合、これは大きなメリットはありません。 – skamradt

4

接続数が増加したもう1つの理由は、同じ接続でアクティブな複数のオープンクエリです。

は、結果を格納し、あなたがこのようなコードがある場合

にプールされていないを作成する別の接続が発生します)あなたは

db := TAdoConnection.Create() 
qry1 := TAdoQuery.Create(); 
qry2 := TAdoQuery.Create(); 

qry1.connection := db; 
qry2.connection := db; 

qry1.SQL.Text := 'select * from whatever'; 

qry1.open; 
while not qry1.eof do 
begin 
    x := qry1.fieldbyname('fld').AsString; 
    qry2.SQL.Text := 'select * from elsewhere where SomeField='+ QuotedStr(x); 
    qry2.Open; 
    ..do something.. 
    qry2.Close; 

    qry1.Next; 
end; 

のようなコードqry2.Openを(持っていると言いますqry1をローカルの場所に移動し、qry2の作業を行います。この場合、接続は1つだけ維持されます。ラフに言えば

、これはより多くのようになります。

db := TAdoConnection.Create() 
qry1 := TAdoQuery.Create(); 
qry2 := TAdoQuery.Create(); 
str := TStringList.Create(); 

qry1.connection := db; 
qry2.connection := db; 

qry1.SQL.Text := 'select * from whatever'; 

qry1.open; 
while not qry1.eof do 
begin 
    x := qry1.fieldbyname('fld').AsString; 
    str.Add(x); 
    qry1.Next; 
end; 
qry1.Close; 

for i := 0 to str.Count-1 do 
begin 
    qry2.SQL.Text := 'select * from elsewhere where SomeField='+ QuotedStr(str[i]); 
    qry2.Open; 
    ..do something.. 
    qry2.Close; 
end 
1

Microsoftは言う:OLE DBサービス「を... ADOがデフォルトで使用するOLE DBリソースのプールを、無効にするには...あなたが追加することによって行うことができます」 = -2 "をADO接続文字列に追加します。"ここで

はリンクです:http://support.microsoft.com/kb/229564

クライアントアプリケーションがアプリケーションロールを使用する場合、それは非常に便利です。

関連する問題