喫茶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:
この様な場合は、もっと別に良い方法が有るのでしょうか?




[262] Re2:TADOConnection について返信 削除
2005/6/6 (月) 21:04:29 Mr.XRAY
▼ Syakeさん
実は私もADOConnectionを使用したアプリを作成して使用しています.
これは,他の方が開発したデータベースのmdbファイルを読出し専用で
いろいろ情報を取得するものです.

dllにはしていませんが,Syakeさんの疑問は私の疑問でもあります.

> 場合があると思いますが、こうやってしまうと一台のPCで複数の
> 接続(ライセンス)を占有してしまう。
> な〜んて事は無いですよね?


これはないと思いますが...

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


これは正確に調べたわけではないのですが,Trueにしておいた方が次に
同じ処理をする時に接続が速いような気がしています(特にネットワーク
では).ん? KeepConnectionの方だったかな.


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

多分データベースの接続や利用に関する一般的ななにかだとは思うのですが,
DB関係は(も)さっぱりです.
他のお客さん,といっても,いないか... に期待しましょう.


[263] Re3:TADOConnection について返信 削除
2005/6/7 (火) 08:33:37 Syake
▼ Mr.XRAYさん
ありがとうございます。

> これは正確に調べたわけではないのですが,Trueにしておいた方が次に
> 同じ処理をする時に接続が速いような気がしています(特にネットワーク
> では).ん? KeepConnectionの方だったかな.


Trueにしっぱなしにしたのは、ネットワーク環境で使用するのと、多くの
マスター類とアクセスを頻繁に行うため接続・切断の繰り返しによるタイ
ムロスを無くそうと考えた為です。
そこで、マスター類などはユーザーデータ(ユーザーにとっての顧客データ)
の呼び込み時に一気に呼び込んでメモリーに確保、一旦切断。
ユーザーデータセーブ時に再接続して保存。
な〜んて事も考えては見たのですが・・・・

それともう一つ、今流行の無線LANですが、システムが稼動中に瞬間的に
接続が切れてまた再接続てしまう事があるんですが、操作画面はそのまま
なので、ユーザーは気がつかない。
インターネットで色々調べて対策したので頻度は減っているようですが完
全にはなくならないです。(^_^;)
そして、ユーザーの次点の操作時にエラーになってしまう。
有線にしてよねと思うのですが、なんとも・・・・
本題とは無関係ですが、これも悩みの種かな。

> 他のお客さん,といっても,いないか... に期待しましょう.
よろしくです。


[264] Re4:TADOConnection について返信 削除
2005/6/7 (火) 10:43:31 ちいんけ
▼ Syakeさん

> > 他のお客さん,といっても,いないか... に期待しましょう.
> よろしくです。


私はマスター同様、ADOを使ったDB開発はMDBとの接続ぐらいしか経験は無いのですが、、、

dbExpress + MySQLで開発するときは、DBのログをみて接続コンポーネントとの
やり取りを見るようにしています。

※SQLServerやOracleは高くて手が出せないです。

回答になってなくてすいません。

ちいんけ@

[265] Re5:TADOConnection について返信 削除
2005/6/7 (火) 13:36:55 Syake
▼ ちいんけさん
 
> dbExpress + MySQLで開発するときは、DBのログをみて接続コンポーネントとの
> やり取りを見るようにしています。

ありがとうございます。

> ※SQLServerやOracleは高くて手が出せないです。
実は内緒なんですけど・・・
開発はSQLServerのDeveloperEditionです。
配布はMSDEです。
なんたって、タダですから(^_^;)


[266] Re6:TADOConnection について返信 削除
2005/6/7 (火) 14:03:13 ちいんけ
▼ Syakeさん

> > ※SQLServerやOracleは高くて手が出せないです。
> 実は内緒なんですけど・・・
> 開発はSQLServerのDeveloperEditionです。
> 配布はMSDEです。
> なんたって、タダですから(^_^;)


MSDEは興味があるんですが、いざシステム導入となるとSQLServer使え!
と言われるのが怖くて、手が出せないんです。
MDBの信頼性を考えると、ローカルでMSDE使う場合は検討するんですが、、、
実は、DBISAMに走っちゃいました。(^^;)

で、MSDEでもログは見れるんでしょうか?

※喫茶MrXRAYって、飲み物持ち込み制なんですね。(^▽^笑)

ちいんけ@

[267] Re7:TADOConnection について返信 削除
2005/6/7 (火) 15:09:46 Syake
▼ ちいんけさん
 
> MSDEは興味があるんですが、いざシステム導入となるとSQLServer使え!
> と言われるのが怖くて、手が出せないんです。

それでは、大変ですね。
当方には、そう言う事を言われる方はいないので・・・

> MDBの信頼性を考えると、ローカルでMSDE使う場合は検討するんですが、、、
妥当な選択です。
MDBには以前(今も)嫌というほど泣かされました。
M社も見放してる様子!?

> で、MSDEでもログは見れるんでしょうか?
見れません。(^_^;)

ところで、MySQLは
「本格運用には、Unix, UnixライクOS(Linuxの事!?) を推奨し
 Windowsは実験とか開発とかのレベルだけにしなさい。」
って、MySQLの日本の総本山のページに明記がありましたが、そうなのですか?




[268] Re8:TADOConnection について返信 削除
2005/6/7 (火) 15:54:40 ちいんけ
▼ Syakeさん

> > MDBの信頼性を考えると、ローカルでMSDE使う場合は検討するんですが、、、
> 妥当な選択です。
> MDBには以前(今も)嫌というほど泣かされました。


MDBはよく壊れると聞くのですが、実際酷な使い方をしてるわけではないので
MDBで泣かされ事はないんですが、皆さんの意見を聞くと、納品形式の商品で
は敬遠しているのが実際です。

BDE + Paradoxではよくよく泣かされます。インデックス関係で、、、

> > で、MSDEでもログは見れるんでしょうか?
> 見れません。(^_^;)


じゃ、DeveloperEditionでは?
しつこくてすいません。自分で調べます。はい。

P.S
dbExpressを使ってると、暗黙的に接続を切られてしまったりして、接続を
キープしてないと動かない命令を使ってたときには、泣かされました。
そこで、ログが活躍したわけです。

> ところで、MySQLは
> 「本格運用には、Unix, UnixライクOS(Linuxの事!?) を推奨し
>  Windowsは実験とか開発とかのレベルだけにしなさい。」
> って、MySQLの日本の総本山のページに明記がありましたが、そうなのですか?


えっ? どこにかいてありますか?
私は、Linux系はわからないので、全部Windowsなんですよ。

LAMP(Linux + Apache + MySQL + PHP)じゃなくて、
WAMD(Windows + Apache + MySQL + Delphi)なんです。 (=^_^=) ヘヘヘ

ただ、サードパーティ製のリプリケーションツールを使う必要がある場合は
Linuxでないとダメな場合があったり、MySQLのパワーを最大限引き出すには、
Linux系をお勧めされるもんだと思い込んでたんですが、、、

Webアプリのバックで動作してるMySQL4.0 on Windowsは1年間ノンストップです。

ちいんけ@

[269] Re9:TADOConnection について返信 削除
2005/6/7 (火) 18:24:55 Syake
▼ ちいんけさん
> MDBはよく壊れると聞くのですが、実際酷な使い方をしてるわけではないので
> MDBで泣かされ事はないんですが、皆さんの意見を聞くと、納品形式の商品で
> は敬遠しているのが実際です。

大量のデータで、追加・削除を繰り返したり、高頻度で参照を繰り返したりの
苛酷な環境で利用すると必ず変になります。
ところで、何でそんなことしてるのかって?
私が聞きたいです。(^_^;)

> BDE + Paradoxではよくよく泣かされます。インデックス関係で、、、
逆に経験が無いのでこれはわかりませんが、以前ネットに乗ってたような。
記憶と表現が適切ではないですが、なにやらレコードを削除しても実際に
は削除されるわけではないので!?、単にデータの追加・削除を繰り返し
続けると云々・・・って、やつですか?
(詳細は覚えてません)
 
> じゃ、DeveloperEditionでは?
MSDEのDeveloperEdition無いのでわかりません。

>えっ? どこにかいてありますか?
http://www.mysql.gr.jp/
の、MySQLの運用のOSの選択の項です。



[275] Re10:TADOConnection について返信 削除
2005/6/8 (水) 10:06:10 ちいんけ
▼ Syakeさん

おはようございます。

> >えっ? どこにかいてありますか?
> http://www.mysql.gr.jp/
> の、MySQLの運用のOSの選択の項です。


FAQのOS による MySQL の違い
http://www.mysql.gr.jp/frame/modules/bwiki/?FAQ#content_1_10

上記の情報では、
「OS による違いはありません。
どの OS 用の MySQL でも動きや機能は同じです。
MS-Winはシンボリックリンクやソケットの実装がないので、それを MS-Win 用にしているぐらい。それ以外は Unix 用と同じです


とあるんですが、、、

[272] 飲み物持込み喫茶店 ?返信 削除
2005/6/8 (水) 05:31:43 Mr.XRAY
> ※喫茶MrXRAYって、飲み物持ち込み制なんですね。(^▽^笑)

実はそうなんです (^^ゞ
Q and A みたいのは他にもあるし,いろいろ雑談(これもありすが)
のつもりで開店しました.飲み物を置いても,あまり客もこないだろうし...
話題はお客さん持ちという意味で.
Syakeさんや,ちいんけさんがこなければ,「喫茶閑古鳥」に名前を変更しな
いといけませんね.
でも,たとえお客さんがこなくても,私の命あるかぎり店はあけておきます
ので,是非ときどきはご来店下さいませ.

ところで,
>dbExpress + MySQLで開発するときは、DBのログをみて接続コンポーネントとの
>やり取りを見るようにしています。


そうか,ログ機能はそのためにもあるんですね.

>BDE + Paradoxではよくよく泣かされます。インデックス関係で、、、

これ経験しています.後
 Pdoxusrs.Net
 Pdoxusrs.lck
 Paradox.lck

というファイルが残ってしまって,再度Paradoxを使用するアプリを起動する
と,使用中などの表示が現れ起動しないやつも経験しています.
これは,Paradox使用のアプリが異常終了した場合ですね.特にWin95,98で
Windowsが固まった場合(マウスもキーボードも使用不可の様な状態),電源を
切ったりすると当然残る様です.もちろん自分の作成したアプリの出来が悪
くてそうなる時もあるかも (^^ゞ

いろいろ勉強になります.




[274] Re:飲み物持込み喫茶店 ?返信 削除
2005/6/8 (水) 10:02:57 ちいんけ
▼ Mr.XRAYさん
> >BDE + Paradoxではよくよく泣かされます。インデックス関係で、、、
>
> これ経験しています.後
>  Pdoxusrs.Net
>  Pdoxusrs.lck
>  Paradox.lck
>
> というファイルが残ってしまって,再度Paradoxを使用するアプリを起動する
> と,使用中などの表示が現れ起動しないやつも経験しています.


これはイヤというほど経験しています。
Delphi IDEでBDE+Paradoxのデバッグ中にブチッと実行停止すると、はまります。
OSの再起動だと時間がかかるので、再ログインで解除できるようです。

その点、ADO+Accessでは問題ないのです。

ちいんけ@

[277] Re2:飲み物持込み喫茶店 ?返信 削除
2005/6/9 (木) 00:10:39 Mr.XRAY
▼ ちいんけさん
> OSの再起動だと時間がかかるので、再ログインで解除できるようです。

おっ,新知識獲得です.再ログインでOkだったんですか.
(苦笑い)
言われてみれは,なんとなく納得です.過去に某掲示板だかMLで削除できな
い,という質問があったようですが,知っていればレスしたのに.

[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/
> が詳しいですね。

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


[290] Re5:TADOConnection について返信 削除
2005/6/10 (金) 22:19:14 Mr.XRAY
▼ sakiyamaさん

なるほど,勉強になります.やみくもにConnectionするのではなく...
反省.う〜む.まだまだ未熟者です.


INCM/CMT
Cyclamen v3.82