- PR -

ODP.NetでのXMLファイル取得と開放について…

1
投稿者投稿内容
sai
会議室デビュー日: 2007/07/18
投稿数: 10
投稿日時: 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
じゃんぬねっと
ぬし
会議室デビュー日: 2004/12/22
投稿数: 7811
お住まい・勤務地: 愛知県名古屋市
投稿日時: 2008-01-30 09:44
引用:

saiさんの書き込み (2008-01-29 20:13) より:

開放、Nothing設定等は抜けていないと思うのですが、何が原因か分かりますでしょうか?


ローカル変数の場合、Nothing (参照の解放) にはそれほど意味はありません。 ローカル変数の場合、参照はプロシージャの最後で勝手に解放されます。

引用:

下記内容の関数(実際は多少違いますが…)を繰り返し5000回ほど呼び出すとメモリーをどんどん圧迫していき、メモリーエラーが出てしまいます。
(1ファイル3M程度です。)


たとえば、XmlDocument の処理を一端コメントアウトするなりして、この関数のうちどこが原因なのかをまず切り分けてみるところからお勧めします。

_________________
C# と VB.NET の入門サイト
じゃんぬねっと日誌
sai
会議室デビュー日: 2007/07/18
投稿数: 10
投稿日時: 2008-01-30 20:57
ご指摘ありがとうございます。

引用:
ローカル変数の場合、Nothing (参照の解放) にはそれほど意味はありません。 ローカル変数の場合、参照はプロシージャの最後で勝手に解放されます。


自分の中では理解しているのですが、GCが信用できず、
今回は駄目もとでNothingを設定していました…。

引用:
たとえば、XmlDocument の処理を一端コメントアウトするなりして、この関数のうちどこが原因なのかをまず切り分けてみるところからお勧めします。


提示したソースのうち、以下の部分のみコメントアウトした所、メモリーの圧迫はなくなりました。
xmlDoc.Save(i_strPath)

ファイル自体は取得した後に、サーバーに送って、ローカルのファイルは消しているのですが、それでもメモリを握っているのでしょうかね…。
上記ソースの部分に、以下のソースを置き換える事でメモリーの圧迫も解決しました。
コード:
Dim fs As New FileStream(i_strPath, FileMode.Create)
xmlDoc.Save(fs)
fs.Flush()
fs.Close()
fs = Nothing


原因を掴めないのは腑に落ちませんが、なんとか問題は解決できました。
ご助言頂きありがとうございました!
1

スキルアップ/キャリアアップ(JOB@IT)