- - PR -
ODP.NetでのXMLファイル取得と開放について…
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-01-29 20:13
お世話になります。
現在、Oracle9iのテーブルのXMLタイプの列より、 XMLデータを取得して、ファイルに書き込む事を考えています。 言語:VB.Net2003、ODP.Net 下記内容の関数(実際は多少違いますが…)を繰り返し5000回ほど呼び出すと メモリーをどんどん圧迫していき、メモリーエラーが出てしまいます。 (1ファイル3M程度です。) 開放、Nothing設定等は抜けていないと思うのですが、 何が原因か分かりますでしょうか? 以下、ソースの一部 ----------------------------------------- Dim cnn As New OracleConnection Dim cmd As New OracleCommand Dim oxmltpe As OracleXmlType Dim xmlDoc As Xml.XmlDocument ' Oracleへのコネクションの確立 ↓Iniファイルより接続文字を取得する関数 cnn.ConnectionString = GetConnectionString() cnn.Open() 'SQL文設定 cmd.Connection = cnn ' App.ConfigファイルよりSQL文を取得する関数↓ cmd.CommandText = GetSQLString("SQL.SELECT_XML_DATA") Dim Rdr As OracleDataReader = cmd.ExecuteReader If Rdr.Read() Then oxmltpe = Rdr.GetOracleXmlType(0) xmlDoc = oxmltpe.GetXmlDocument xmlDoc.Save(i_strPath) xmlDoc = Nothing oxmltpe.Dispose() oxmltpe = Nothing End If Rdr.Close() Rdr.Dispose() Rdr = Nothing cmd.Dispose() cmd = Nothing cnn.Close() cnn.Dispose() cnn = Nothing | ||||||||||||
|
投稿日時: 2008-01-30 09:44
ローカル変数の場合、Nothing (参照の解放) にはそれほど意味はありません。 ローカル変数の場合、参照はプロシージャの最後で勝手に解放されます。
たとえば、XmlDocument の処理を一端コメントアウトするなりして、この関数のうちどこが原因なのかをまず切り分けてみるところからお勧めします。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||||||||||
|
投稿日時: 2008-01-30 20:57
ご指摘ありがとうございます。
自分の中では理解しているのですが、GCが信用できず、 今回は駄目もとでNothingを設定していました…。
提示したソースのうち、以下の部分のみコメントアウトした所、メモリーの圧迫はなくなりました。 xmlDoc.Save(i_strPath) ファイル自体は取得した後に、サーバーに送って、ローカルのファイルは消しているのですが、それでもメモリを握っているのでしょうかね…。 上記ソースの部分に、以下のソースを置き換える事でメモリーの圧迫も解決しました。
原因を掴めないのは腑に落ちませんが、なんとか問題は解決できました。 ご助言頂きありがとうございました! |
1