再び同タイトルで(すぐ)復活です。
一応解決の方向となっているのですが、
複数のスレッドからParadoxにアクセスしているのですが
突然スレッドが死んでしまったり、アプリ自体が死んでしまうことがあります。
特徴としては、
① 同じTSession、TDatabase、を複数のスレッドから使用しています。
② エイリアスは使用せずにDBフォルダを直接指定しています。
③ TSession の SessionName は明示的に設定しています。
④ TSession は PrivateDir、NetFileDir を指定していません。
⑤ データベースを更新するスレッドでは Transaction を tiDirtyRead に設定
しています。
Delphi7(Pro)+Paradoxの環境です。
の続きなんですが、皆様のご意見をいただきたく、
セッション、データベース、データセットの各プロパティと、明示的に更新して
いる個所を以下に挙げますので、
何かお気づきになる点がございましたら、また意見をいただけると有り難いです。
セッション(TSession)プロパティ
Active
AutoSessionName = False
KeepConnection
Name
NetFileDir = (未設定:今後設定していく方向で検
討しています)
PrivateDir = (未設定:今後設定していく方向で検
討しています)
SessionName = セッション毎に一意な固定名(※)
SQLHourGlass
Tag
データベース(TDatabase)プロパティ
AliasName
Connected
DatabaseName = DB格納フォルダのフルパス(§)
DriverName
Exclusive
HandleShared
KeepConnection
LoginPrompt
Name
Params
ReadOnly = (未設定:今後設定していく方向で検
討しています)
SessionName = 関連付けるTSessionのSessionName
(※)
Tag
TransIsolation = tiDirtyRead (トランザクション使
用時) または tiReadCommitted (ト
ランザクション未使用時)
データセット(TQuery)プロパティ
Active
AutoCalcField
AutoRefresh
CashedUpdate = False
Constrained
Constraints
DatabaseName = 関連付けるTDatabaseの
DatabaseName(§)
DataSource
Filter
Filtered
FilterOptions
Name
ObjectView
ParamCheck
Params
RequestLive
SessionName = 関連付けるTSessionのSessionName
(※)
SQL = SQL文
Tag
UniDirectional
UpdateMode
UpdateObject
以上、よろしくお願いいたします。
昔同じような事をしたことがあります。かなり頻度の高い複数スレッドで Paradox に更新してましたが、バリバリ動きました。
> ① 同じTSession、TDatabase、を複数のスレッドから使用しています。
これは大丈夫でしょうか?スレッド間で更新時に何らかの排他をすればいいかもしれませんが、それではスレッドのメリットが薄れてしまいそうです。
完全に動作させるにはスレッドごとに別のインスタンスの Session にする必要があったと思います。
また、トランザクション時に Paradox は確か(昔の事なので記憶違いだったらすみません) PrivateDir に任意の名前の一時ファイルを作成します。このとき複数のセッション間で、同名のファイルになる可能性がありエラーになる可能性があります。よって PrivateDir はセッション毎に違うフォルダにしておく必要がありました。
1.スレッド毎に異なる Session にする
2.Session 毎に PrivateDir を個別にする
上記のようにすれば、問題なく動くと思うのですが...
現在Delphiを扱える環境でないのであまり詳しく説明できず残念ですが、少しでも参考にして頂ければと思います。
ゆうさん、ご意見ありがとうございました。
現在、開発先にて随時修正を加えており、まもなく暫定ですが
テスト版が完成します。そこで、ストレステストを実施して
問題が再発するかどうかを確認します。
テスト後、問題がまだ発生するようであればこのQ&A掲示板へ
書き込みしますのでよろしくお願いいたします。
レスが遅くなってしまい、申し訳ありませんでした。
今後ともよろしくお願いいたします。
ツイート | ![]() |