喫茶XRAYトップページ

[スレッド全体
]

[260] TADOConnection について返信 削除
2005/6/6 (月) 17:40:22 Syake
たまには、まじめに

最近、少々自分のプログラミング方法に疑問を持っているのですが?
SQLServerとADOを使ったアプリをメンテ及び開発しています。

現在、機能毎にDll化してアプリを稼動させるように改造中です。
もともと、Delphiだけでは無いので、パッケージ化は先送りです。
で、稼動中は AAA.exe  機能1.dll



[261] Re:TADOConnection について返信 削除
2005/6/6 (月) 19:25:34 Syake
すいません。 手違いで送ってしまいました。
なので続き・・・
 
> 現在、機能毎にDll化してアプリを稼動させるように改造中です。
> もともと、Delphiだけでは無いので、パッケージ化は先送りです。

で、稼動中は AAA.exe → 業務1.dll → 機能2.dll とかで実行さ
せるわけです。

実際は、複数の業務処理と共有化できる機能があるので
業務1.dll、業務2.dll、業務3.dll・・・・
機能1.dll、機能2.dll、機能3.dll・・・・
それぞれの業務.dllが必要に応じて機能.dllを呼び出すように
組もうと思っています。

そして、各業務dllも各機能dllも単一データベースにアクセス
するため、データモジュールにADOConnectionを設けると同時に
接続処理を記述しておき、それを共有ファイルとして各dllの
プロジェクトに、それぞれUsesして利用しようと思います。

で、各dllのADOConnectionはプログラムが稼動中はTrueの状態
としています。
なので、業務1.dllが実行中は業務1.dll内でADOConnectionはTrue
の状態ですが、業務1.dllから機能2.dllを呼び出した場合は、機能2.
dll内で別のADOConnectionがTrueになります。

これぐらいなら、問題は少ないと思いますが、複数の業務dllを
呼び出し、更に各業務dllがそれぞれ機能dllを重複などして呼び
出して実行した場合は、一時的に複数のADOConnectionがTrueと
なってしまいますが、これって、どうなんでしょうか?

疑問1:
OracreでもSQLServerでも「接続数に制限」ライセンス!?がある
場合があると思いますが、こうやってしまうと一台のPCで複数の
接続(ライセンス)を占有してしまう。
な〜んて事は無いですよね?

疑問2:
実行中に、ADOConnection := Tureしっぱなしは良くない。
同一のdll内で処理を連続して行う場合でも、接続と切断はこまめ
に行っていた方が良い?

疑問3:
この様な場合は、もっと別に良い方法が有るのでしょうか?




[281] Re2:TADOConnection について返信 削除
2005/6/10 (金) 10:16:06 sakiyama
▼ Syakeさん

こんにちわ。

多数のコネクションを張るとそれなりにリソースを消費しますから、
あまりやりません。それにコネクション張る時時間も結構かかることがありますし。

少なくとも、単一トランザクション内で動かしたい機能が別DLLに分かれていると
コネクションが違ってトランザクションの整合性が取れない可能性もあります。

> 疑問1:

これはDBMSによって変わってきますね。

> 疑問2:
> 実行中に、ADOConnection := Tureしっぱなしは良くない。
> 同一のdll内で処理を連続して行う場合でも、接続と切断はこまめ
> に行っていた方が良い?


同一DLL内ではつなぎっぱなしのほうが良いと思います。

> 疑問3:
> この様な場合は、もっと別に良い方法が有るのでしょうか?


一つだけコネクションを張るコネクションプールDLLを作り、
他DLLはそれを参照するのはどうでしょうか。


Delphiから使うならFirebird楽ですよ。

[283] Re3:TADOConnection について返信 削除
2005/6/10 (金) 11:51:21 Syake
▼ sakiyamaさん
こんにちは。

ありがとうございます。
 
> 一つだけコネクションを張るコネクションプールDLLを作り、
> 他DLLはそれを参照するのはどうでしょうか。

うっ!、これは良く判りません。
一体どういうことでしょうか?

> Delphiから使うならFirebird楽ですよ。
よく聞きますね。
以前挑戦しようと思いましたが(InterBaseの頃)
あまり、情報があまり無くて(有っても英語(^_^;))
諦めました。
今では、「Firebird日本ユーザー会」が一番情報
量が多いのかな。



[286] Re4:TADOConnection について返信 削除
2005/6/10 (金) 16:33:07 sakiyama
▼ Syakeさん
> > 一つだけコネクションを張るコネクションプールDLLを作り、
> > 他DLLはそれを参照するのはどうでしょうか。
> うっ!、これは良く判りません。
> 一体どういうことでしょうか?


たとえば、今のように全部のDLLがデータモジュールを
持つのではなく、ADO接続をするDLLを一個作ってそこから
ConnectionObjectを取得してって感じです。
--adoconn.dpr(dll)
var
  dm: TDataModule1;
procedure GetConnection(out Connection:IUnknown);
begin
  if dm = nil then
    dm := TDataModule1.Create(nil);

  if not dm.ADOConnection1.Connected then
    dm.ADOConnection1.Open;
  dm.ADOConnection1.ConnectionObject.QueryInterface(IUnknown, Connection);
end;

--unit1.pas
procedure GetConnection(out Connection: IUnknown); external 'adoconn.dll' name 'GetConnection';

procedure TForm1.Button1Click(Sender: TObject);
var
  conn: IUnknown;
begin
  GetConnection(conn);
  if conn = nil then Exit;
  //これでDetaControlが使える
  ADOConnection1.ConnectionObject := conn as _Connection;
  ADOTable1.Active := True;
end;
 
実行時パッケージでよければもっと楽かも。

> > Delphiから使うならFirebird楽ですよ。
> よく聞きますね。
> 以前挑戦しようと思いましたが(InterBaseの頃)
> あまり、情報があまり無くて(有っても英語(^_^;))
> 諦めました。
> 今では、「Firebird日本ユーザー会」が一番情報
> 量が多いのかな。
>


Firebird情報は
http://nekomimi.s41.xrea.com/x/firebird/pukiwiki/
が詳しいですね。

[287] Re5:TADOConnection について返信 削除
2005/6/10 (金) 18:20:17 Syake
▼ sakiyamaさん
 
> たとえば、今のように全部のDLLがデータモジュールを
> 持つのではなく、ADO接続をするDLLを一個作ってそこから
> ConnectionObjectを取得してって感じです。


お〜おっ!素晴らしい。
完璧です。!(^^)!
以前、Dll化に挑戦したのですが、何せ未熟者ですので
挫折いたしました。
ありがとうございます。

////////////////////////////////////////////////////////////////////
// DLL -------------------------------------

(略)
var
  dmSqlConnect: TdmSqlConnect;
  procedure SqlConnect(out Connection:IUnknown);stdcall;

implementation

procedure SqlConnect(out Connection:IUnknown);
begin
   if dmSqlConnect = nil then
      dmSqlConnect := TdmSqlConnect.Create(nil);

   if not dmSqlConnect.SqlConnect.Connected then
      dmSqlConnect.SqlConnect.Open;
   dmSqlConnect.SqlConnect.ConnectionObject.QueryInterface(IUnknown, Connection)
end;

{$R *.dfm}

procedure TdmSqlConnect.DataModuleDestroy(Sender: TObject);
begin
   dmSqlConnect.Free;
end;
end.

//=====================================================================//
(略)
var
  frmADOTest: TfrmADOTest;
  procedure SqlConnect(out Connection: IUnknown);stdcall; external 'sqlConnection.dll';

implementation

{$R *.dfm}

procedure TfrmADOTest.Button1Click(Sender: TObject);
var
  conn: IUnknown;
begin
   SqlConnect(conn);
   if conn = nil then Exit;
   adoConect := TADOConnection.Create(Application);
   adoConect.ConnectionObject := conn as _Connection;
   ADOTable1.Connection := adoConect;
   ADOTable1.TableName := 'ABC';
   ADOTable1.Active := True;
end;

procedure TfrmADOTest.FormClose(Sender: TObject; var Action: TCloseAction);
begin
   adoConect.Free;
end;
end.
///////////////////////////////////////////////////////////////////////
な、感じで・・・すかね。

実行時パッケージは、他の絡みもあり使えません。(^_^;)
 
> Firebird情報は
> http://nekomimi.s41.xrea.com/x/firebird/pukiwiki/
> が詳しいですね。

これは、知りませんでした。


[▼次のスレッド]
INCM/CMT
Cyclamen v3.82