- - PR -
他のメモリが壊れている・・・
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2006-11-24 21:59
初めて書き込みします。よろしくお願いします。
環境は以下の通りです。 OS:WinXPPRO SP2 DB:日立製HIRDB IIS&ASP.NET FrameWork2.0 VB2005 上記環境にてWEBアプリの開発を行ってますが、 不定期に以下のエラーが発生します。 「保護されているメモリに読み取りまたは書き込み操作を行おうとしました。 他のメモリが壊れていることが考えられます。」 上記エラーは実行PCで現象はほとんどおきず、他のPCから 接続した場合、同時に複数端末で実行した場合におきてます。 ある一定期間出た後、再起動等を実施すると出なくなります。 おきる場所につきましては、DBに対しSELECTを行ったときで どのテーブルでもおきてます。 接続方式はODBCを使用しており、データアダプタ、コマンドにて datasetを行っております。 <参考例> @ODBCCommand(SQL文、コネクション、トランザクション) AODBCDATAAdapter(@のコマンド) BDETASET CA.MissingSchemaAction = MissingSchemaAction.AddWithKey DA.FILL(B) 特にデータ連結はしておりません。 考えられる原因は何がありますでしょうか。。 よろしくお願いします。 | ||||
|
投稿日時: 2006-11-24 22:17
そのエラーを出しているのは誰ですか?
(IIS, HIRDB, プログラム) エラーですか?それとも例外ですか? 例外ならば、発生している場所を特定し、その近辺でやっていることを列挙してください。
なんか、玉虫色な書き方ですね。 まず、「実行PC」って、なんですか? 「他の PC から接続した場合、同時に複数端末で実行した場合」の箇所。句点は、OR ですか?AND ですか? 「ある一定期間出た後、再起動」ということですが、期間をおかないと再起動しても再発するのでしょうか? また、再起動をするのは OS ですか?データベース サービスだけ再起動した場合は、どうなりますか? あるいは、ASP.NET サービスだけを再起動した場合は、どうなりますか? _________________ | ||||
|
投稿日時: 2006-11-25 09:46
CLR から出力されている例外ですよね。 そうだとして、Google 検索などはしていますよね? _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-11-27 15:43
Jitta様 じゃんぬねっと様
返信ありがとうございます。 エラーを出しているのはCLR(システム)と思います。 エラー内容「保護されているメモリ・・・」にて検索等を実施しましたが、 再起動により直る、いつのまにか無くなったと明記されており、 結論対策等が明記されていないように思いました。 検索が足りなければ申し訳ありません。 今回の環境としましては、以下となります。 @IIS・ASPが動作しているPC AクライアントPC BクライアントPC @にてデバック・実行等を実施してもエラーは起きませんでした。 A単独又は、AとBで同時実行等を実施するとたまに起きます。 DBのみの再起動等は行っておらず、エラーが出た後PCの再起動を 実施すると出なくなることは確認しました。 DBのみ再起動等は調査後、回答します。 念のため、本処理でのソースとエラー内容を以下に明記致します。 Public Function find(ByVal p_sSqlString As String, ByVal p_prmList As ArrayList) As DataTable Dim da As OdbcDataAdapter = Nothing 'データアダプタ Dim cm As OdbcCommand = Nothing 'コマンド Dim ds As DataSet = Nothing 'データテーブル Try cm = New OdbcCommand(p_sSqlString, con__, tran__) If Not p_prmList Is Nothing Then MsgBox("パラメータ設定") 'パラメータを設定する For Each val As String In p_prmList Dim prm As New OdbcParameter() prm.Direction = ParameterDirection.Input prm.Value = val cm.Parameters.Add(prm) Next End If da = New OdbcDataAdapter(cm) ds = New DataSet 'DB検索を行う da.MissingSchemaAction = MissingSchemaAction.AddWithKey da.Fill(ds) For Each col As DataColumn In ds.Tables(0).Columns col.ReadOnly = False Next Catch ex As HIT00ComBsnExp Throw Catch ex As HIT00ComSysExp Throw Catch ex As Exception Dim exp As HIT00ComSysExp = New HIT00ComSysExp(ex) exp.setErrorInfo( _ C_PGMID, _ System.Reflection.MethodBase.GetCurrentMethod.Name, _ "HIT0001E", _ Nothing) Throw exp End Try '戻り値を返却する Return ds.Tables(0) End Function エラー内容 保護されているメモリに読み取りまたは書き込み操作を行おうとしました。他のメモリが壊れていることが考えられます。 [スタックトレース] 場所 System.Data.Common.UnsafeNativeMethods.SQLBindCol(OdbcStatementHandle StatementHandle, UInt16 ColumnNumber, SQL_C TargetType, IntPtr TargetValue, IntPtr BufferLength, IntPtr StrLen_or_Ind) 場所 System.Data.Odbc.OdbcDataReader.RetrieveKeyInfo(Boolean needkeyinfo, QualifiedTableName qualifiedTableName, Boolean quoted) 場所 System.Data.Odbc.OdbcDataReader.BuildMetaDataInfo() 場所 System.Data.Odbc.OdbcDataReader.GetSchemaTable() 場所 System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader, Object[] methodArguments, SQL_API odbcApiMethod) 場所 System.Data.Odbc.OdbcCommand.ExecuteReaderObject(CommandBehavior behavior, String method, Boolean needReader) 場所 System.Data.Odbc.OdbcCommand.ExecuteReader(CommandBehavior behavior) 場所 System.Data.Odbc.OdbcCommand.ExecuteDbDataReader(CommandBehavior behavior) 場所 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) 場所 System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 場所 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) 場所 System.Data.Common.DbDataAdapter.Fill(DataSet dataSet) 場所 dbcom.common.module.HIT00ComDbiMng.find(String p_sSqlString, ArrayList p_prmList) 言葉足らずで申し訳ありませんが、よろしくお願いします。 [ メッセージ編集済み 編集者: ゆーとパパ 編集日時 2006-11-28 09:03 ] | ||||
|
投稿日時: 2006-11-27 18:46
解決策を探す前に、原因を探すのが手順として正しいと思います... 2.0 であれば、発生している例外は AccessViolationException ですよね? だとすると、根深そうです。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 | ||||
|
投稿日時: 2006-11-28 00:53
及ばずながら投稿させていただきます。
私も以前同様の現象になった事があります。 私の場合、 @ASP動作PC OS:Windows2000 DB:Oracle9i IIS&.NET Framework Aリモート操作用PC OS:WindowsXP Pro でした。 マネージドコードとかガーベッジコレクションとか、従来の考えにはないメモリ管理の方式がいろいろと採用されてましたので、それが異なるOS間で悪動作をしているのではないかと私は調査しましたが、結局わからずじまいでした。 ただ、PCを再起動して、@のPCでのみ操作を行っている分にはメモリアクセスエラーはほとんど発生しなかった記憶があります。(前の事なのではっきりは覚えていませんが・・・。) >じゃんぬねっとさん 何か思い当たる原因とかわかりますか? じゃんぬねっとさんのサイトはいつもいろいろ参考にさせていただいてます。 いろいろお詳しそうですので。 結局の所、他のスレをいろいろ見ても、根本的な解決策を述べている所は無いように思いました。 今更ですがこのエラーが気になった通りすがりのモノでした。。。 | ||||
|
投稿日時: 2006-11-28 08:35
ODBCドライバの内部で落ちている事から考えて、明らかなコーディングミスが無いなら、後は日立に問い合わせるのが近道でしょう。実運用でだけ問題が起こるということは、ODBCドライバがマルチスレッドに対応しきれてないとかじゃないですかね。
| ||||
|
投稿日時: 2006-11-28 08:44
"根深そう" というのは、甕星さんが既に答えられているようなものです。 アンマネージド ポインタを使うなど特殊なコトをやられていないのであれば、 コーディング ミスではなく、ベンダ側の不具合というパターンが多いです。 今回は明らかにドライバ側の不具合っぽいですが... 以前、私も別のベンダに問い合わせをしたことがあります。 _________________ C# と VB.NET の入門サイト じゃんぬねっと日誌 |