- - PR -
Accessを利用したデータベースについて
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-12-05 17:19
できれば便乗するのはスレ主が解決したと書き込んでからの方がいいかと。 せっかくなので、別スレを立てるのもありだと思います。 とりあえず端的に言うならば「同じようなどころか、問題ありまくりマクリスティー(意味不明)」 とだけ。 _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||
|
投稿日時: 2006-12-05 17:42
なるほど、了解しました。
ずっと心の隅で気になっていたことだったのでつい早まってしまいました。 別スレッドを建てさせてもらうかもしれません。 しかし問題ありまくりですか。気になるなぁ。 | ||||
|
投稿日時: 2006-12-06 01:48
単純なテキストファイルの処理なので、書き込み作業を排他的にできるよう
プログラムを組めばよいだけでは? | ||||
|
投稿日時: 2006-12-06 10:41
確かにそうですね。排他的に作業する部分を少し大げさに考えすぎていたかもしれませ ん。 ログ書き込み程度なら追加のみだろうし占有時間も短そうですが、データ本体をXML にしてプログラムで更新…となると一度全部読んで必要な箇所を書き換えてまた出力 という感じになるのかなと。そうした場合はキチンと排他処理を考えないと問題ありまくり マクリスティーじゃないかなぁとぽわわーんと考えてました。 テキストファイルだろうから、更新時に更新不可(読み込みも不可?)でオープンしてしま えば大丈夫かもしれませんね。難しく考えすぎか… べっ、別にまくりマクリスティーって言いたかっただけじゃないんだからねっ!(ツンデレ) _________________ ぽぴ王子@わんくま同盟 ぽぴ王子の人生プログラミング中 / ぽぴンち。 | ||||
|
投稿日時: 2006-12-06 15:19
ちゃんと事前調査してから新スレッドを立ち上げようとしてたら話が展開しているようなので少しだけ書かせてください。ACCESS関係の話ですので。
ACCESSを使う場合の問題点は、スレッドセーフでないからということだと思うのですが、じゃあ具体的に何が悪いのかというと、よく分かってないというのが本音です。それもあって先の質問が出てくるわけですが、テキストだと排他制御が対応可能で、ACCESSだと使うことすらダメ(?)という理由がよくわかりません。例えば、同時書き込みが悪いという理由なら参照だけならOKではないのか?とか、DataSetを使って楽観的ロックにすれば問題ないのではないか?という疑問が出てきます。(テキストも同様ですけど) MSの情報によるとACCESSを使うと「応答がなくなるなどの予期せぬ動作が起きる場合がある」ということなので、書き込み時のみの問題ではなく、ファイルを開く時にldbファイルを作るため参照のみであっても同時アクセスでldbファイルが上書きされてしまう?というのが原因ないかなと推測していますが、正確なところはどうなのでしょうか。 | ||||
|
投稿日時: 2006-12-06 15:31
ACCESSでも自分で排他制御をきちんと完全に入れられるのなら問題はでないのでは
ないかと思います。 ただ、それがテキストファイルほど単純じゃないんじゃないかと思います。 間に入ってくるミドルウェアの動作についてもきちんとした知識が必要だと思いますし。 あと、楽観的ロックであっても同時に書き込むということは考えられますから これは解決策にはなりません。 | ||||
|
投稿日時: 2006-12-06 16:03
JETがスレッドセーフではない、つまり複数のスレッドから同時に呼び出された時の動作を保障していない事が原因です。そして、その結果として何が起こるかは全く運しだいです。楽観的ロックを使えばとか言う問題ではありません。デッドロックで済んだなら、幸運なほうでしょう。 逆に言えば、複数のスレッドから同時にJETの機能を呼び出さなければ大丈夫なはず・・・となります。「じゃぁ、名前付きセマフォでJETの機能を同時に呼び出さないようにロックすれば良いんだね」と思った人は想像力が無さ過ぎます。小規模なシステムなら問題ないかもしれませんが、規模が大きくなるに従って問題が顕在化してゆきます。もし10秒かかるSQLを何処かで実行したら何が起こるでしょうか?システム全体が10秒間ロックします。これってパフォーマンス上致命的な問題・・・と言うかセキュリティホール(DoS攻撃への脆弱性)だよね。もちろん実装でそれを回避する事は可能だろうけど、安心して使える仕組みが他に用意されてるのだから、そちらを使わない理由は無いよね。 実はXMLに関してもシステムの規模が大きくなると、単純にファイルをロックして読み書きすれば良いとはなりません。システム負荷が大きくなり、読込みを行うスレッドが大量に発生すると、何時までたっても書き込み権限を取れなくなる恐れがあります。システム負荷の高いときに書き込みを試みると、タイムアウトが発生すると・・・。これを回避するには複数のスレッドからのアクセスを適切に制御するラッパークラスが必要になるでしょう。 | ||||
|
投稿日時: 2006-12-07 02:00
お世話になります。
んー、だんだん自分の書いてるコードは凄くまずいんじゃないかという気がしてきましたが、まあそれは別スレッドでということにしたいと思います。 誤解されては困るのですが、ACCESSも使えるんじゃない?という事を書きたいのではありません。自分自身はACCESSは使う考えは全くありませんが、かといってSQL Serverも使える環境にないし、規模的にも使うまでもないと思っているのでXMLにしているという状況です。もちろん大規模なものになればSQL Serverも考えると思いますけど。 では何故聞いたかというと、純粋に知りたいというのもありますし、それをもってXMLは無関係の内容だという確認としたいというのがあります。 また、ACCESSを使いたいという質問が度々あるようなのでそれに対する明快な納得感のある答えが出せればと思ってというのもあります。 仕様だからということになってしまうと、(特に私と同じような初心者レベルだと)どうしても納得感が薄くなってしまうので同じような質問が繰り返されることになってしまうと思うのですが、私自身は今回のやり取りを通じて、問題は同時書き込みがどうだとかいうレベルではなくて、同時にアクセスするということ自体にあるという風に理解しました。で、それによる不具合を防ぐようにすることは技術的にできるだろうが、それは大変な作業になるのでちゃんとしたDBを使った方がよいということで、ある程度納得感が得られたと思います。より納得できる答えを得るにはJETなどの細かなところも理解しないと無理なのでしょうが。 それから楽観的ロックについては、レコードが更新されていると上書きをしにいかないので使えるのではと思っていたのですが、ちょっと勘違いして理解してるのかもしれませんので、もうすこし勉強してみます。まあ、そもそも同時アクセスすること自体がまずければ楽観的ロックも何もないですけど。 ということでお騒がせしました。 また変な質問をしてしまうかもしれませんがよろしくお願いします。 |