C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: OracleConnection のシリアル化


(過去ログ 77 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■45570 / inTopicNo.1)  OracleConnection のシリアル化
  
□投稿者/ チョコ (1回)-(2010/01/14(Thu) 21:26:24)

分類:[.NET 全般] 

開発環境:WindowsXP
使用言語:VB.NET2008

内容
メインフォームからdllをロードし、画面を呼び出しています。
dllはCreateDomainでdomainを作成し、CreateInstanceAndUnwrapでインスタンスを生成し読み込んでいます。
そして画面をコールする際に、必要な情報をパラメータとして渡しているのですが、その中の1つにメインフォームで接続した
DBコネクションを渡しています。

呼び出された画面で、渡されたDBコネクションを使用しSQLを実行するタイミングで、以下のエラーが発生します。

「System.Data.OracleClient.OracleConnection.ociServiceContextHandleはシリアル化可能として設定されていません。」

中身を見てみてる、ConnectionStringが正常に渡って来ていない?ようでした。(System.Runtime・・・という内容でした)
色々探っているのですが、中々糸口が見つからず質問させて頂きました。

ご教授よろしくお願いいたします。

引用返信 編集キー/
■45571 / inTopicNo.2)  Re[1]: OracleConnection のシリアル化
□投稿者/ やじゅ (1448回)-(2010/01/14(Thu) 22:19:57)
やじゅ さんの Web サイト
No45570 (チョコ さん) に返信
> そして画面をコールする際に、必要な情報をパラメータとして渡しているのですが、その中の1つにメインフォームで接続した
> DBコネクションを渡しています。

コネクションプーリングを使えば、わざわざDBコネクションを渡す必要はなくなります。
質問のエラーの内容と違いますけど、方法論を変更してみてはいかがでしょう。

引用返信 編集キー/
■45573 / inTopicNo.3)  Re[1]: OracleConnection のシリアル化
□投稿者/ Jitta (620回)-(2010/01/14(Thu) 22:31:41)
Jitta さんの Web サイト
No45570 (チョコ さん) に返信
> 開発環境:WindowsXP
> 使用言語:VB.NET2008
>
> 内容
> メインフォームからdllをロードし、画面を呼び出しています。
> dllはCreateDomainでdomainを作成し、CreateInstanceAndUnwrapでインスタンスを生成し読み込んでいます。
> そして画面をコールする際に、必要な情報をパラメータとして渡しているのですが、その中の1つにメインフォームで接続した
> DBコネクションを渡しています。
>
> 呼び出された画面で、渡されたDBコネクションを使用しSQLを実行するタイミングで、以下のエラーが発生します。
>
> 「System.Data.OracleClient.OracleConnection.ociServiceContextHandleはシリアル化可能として設定されていません。」
>
> 中身を見てみてる、ConnectionStringが正常に渡って来ていない?ようでした。(System.Runtime・・・という内容でした)
> 色々探っているのですが、中々糸口が見つからず質問させて頂きました。
>
> ご教授よろしくお願いいたします。
>

 で?尋ねているのは「OracleConnection をシリアル化する方法」ですか?それとも、OracleConnection の ConnectionString を引き渡す方法ですか?
引用返信 編集キー/
■45577 / inTopicNo.4)  Re[2]: OracleConnection のシリアル化
□投稿者/ チョコ (2回)-(2010/01/14(Thu) 22:58:27)
やじゅさん

> コネクションプーリングを使えば、わざわざDBコネクションを渡す必要はなくなります。
> 質問のエラーの内容と違いますけど、方法論を変更してみてはいかがでしょう。

確かにDBコネクションを渡す必要がなくなるのであればベストだと思います。
少し調査したら「System.Data.OracleClient はデフォルトでコネクションプーリングが有効」とありました。
お手数をかけますが、コネクションプーリングを使うというのは、具体的にはどのような処理になるのでしょうか?

未熟で申し訳ございません。

Jittaさん

> で?尋ねているのは「OracleConnection をシリアル化する方法」ですか?それとも、OracleConnection の ConnectionString を引き渡す方法ですか?

質問が伝わりにくくすいませんでした。
「OracleConnection をシリアル化する方法」が知りたいです。

引用返信 編集キー/
■45578 / inTopicNo.5)  Re[3]: OracleConnection のシリアル化
□投稿者/ なちゃ (350回)-(2010/01/14(Thu) 23:29:55)
というか、AppDomainを作ってその中で処理するなら、OracleConnectionを渡して処理するようなことは多分できません。
仮にエラーにならなかったとしても、おそらくかなり混乱のもとですのでやらない方がいいです。
※ちなみにOracleConnectionはMarshalByRefObject派生ですが、この辺の意味は理解できていますか?

引用返信 編集キー/
■45579 / inTopicNo.6)  Re[3]: OracleConnection のシリアル化
□投稿者/ やじゅ (1450回)-(2010/01/14(Thu) 23:34:26)
やじゅ さんの Web サイト
No45577 (チョコ さん) に返信
> 確かにDBコネクションを渡す必要がなくなるのであればベストだと思います。
> 少し調査したら「System.Data.OracleClient はデフォルトでコネクションプーリングが有効」とありました。
> お手数をかけますが、コネクションプーリングを使うというのは、具体的にはどのような処理になるのでしょうか?

コネクションを渡そうとしているのは、接続を確立する処理が大きな負荷がかかるからですよね。
コネクションプーリングは、オラクル側で「接続文字列」が同じなら自動で接続を維持してくれる処理です。
接続文字列が違う場合、コネクションを新規に確立する

また、アプリケーション側でDBのClose処理を呼び出しても、実際には切断されずプーリングを維持してくれます。
http://www.vacant-eyes.jp/tips/tadonet/040.aspx

引用返信 編集キー/
■45587 / inTopicNo.7)  Re[1]: OracleConnection のシリアル化
□投稿者/ はつね (1159回)-(2010/01/15(Fri) 09:38:20)
はつね さんの Web サイト
No45570 (チョコ さん) に返信
> メインフォームからdllをロードし、画面を呼び出しています。
> dllはCreateDomainでdomainを作成し、CreateInstanceAndUnwrapでインスタンスを生成し読み込んでいます。
> そして画面をコールする際に、必要な情報をパラメータとして渡しているのですが、その中の1つにメインフォームで接続した
> DBコネクションを渡しています。

前提として、OracleConnectionは使用するときに開いてデータの取得や更新が終わったら
閉じて下さい。
同一PCから同一文字列のConnectionStringでコネクションをOpenした場合、直前に閉じて
いさえすれば、ほぼ処理時間なしでコネクションがOpenできます。これがコネクションプー
リングです。つまり、再度OpenしてもOpenの処理時間がほぼゼロにできるのでコネクショ
ンを渡す必要がなくなります。
よって、DBコネクション(OracleConnection)を渡すのではなく、ユーザID、パスワードなどを
設定したConnectionStringの文字列をパラメータとして渡して、呼び出し先で新たに
OracleConnectionにその文字列を設定してOpenするだけで利用できます。


注意するのは、呼出し元でコネクションを開きっぱなしで、呼び出し先で同じConnectionString
でOpenしてもコネクションプーリングは効かずに、新たにコネクションがつくられるため、
処理時間が掛かってしまい、プログラムの動作が遅くなってしまうからです。
#もう少し複雑な制御を行っていますが基本は上記のような動きです。

引用返信 編集キー/
■45590 / inTopicNo.8)  Re[2]: OracleConnection のシリアル化
□投稿者/ なちゃ (353回)-(2010/01/15(Fri) 10:54:56)
念のため、コネクションプールはおそらくAppDomain単位で作成されますので、
自分でAppDomainを作成してその中で接続を実行する場合は、
元のAppDomainとコネクションプールは共有出来ないと思われます。
かといって、前に書いたようにOracleConnectionをAppDomain間で共有するのも多分無理ですので、
結局接続の効率化はあまりできないと思います。

引用返信 編集キー/
■45610 / inTopicNo.9)  Re[3]: OracleConnection のシリアル化
□投稿者/ Jitta on the way (506回)-(2010/01/15(Fri) 18:23:23)
Oracle なら、案外、Windows 認証を使わないように修正するだけで問題が解決したりして?
引用返信 編集キー/
■45616 / inTopicNo.10)  Re[4]: OracleConnection のシリアル化
□投稿者/ チョコ (3回)-(2010/01/15(Fri) 21:34:12)

みなさまからの意見をもとに検討した結果、DBコネクションを渡すことをやめ、子Domain側でオープンする仕様にきまり、
問題なく接続できました。

初めてで色々ありましたが、みなさんのおかげで無事クリアできました。
とても勉強になり感謝しています。

本当にありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -