0

私はthsのようないくつかのコードを継承しました:

Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
            Try
                Dim Test As Integer
                Dim strCon As String = "Data Source=TestDatabase;User Id=TestUser;Password=TestPassword;"
            For Test = 0 To 100000
            Dim objDBCon As New OracleConnection(strCon)
            Dim objDBCmd As New OracleCommand
            Dim objDR As OracleDataReader
            Using objDBCon
                'Using objDBCmd
                objDBCmd.Connection = objDBCon
                objDBCmd.CommandText = "SELECT * FROM nominal_incident where rownum = 1 "
                objDBCon.Open()
                objDR = objDBCmd.ExecuteReader
                'End Using

            End Using
        Next   
            Catch ex As Exception
              'Handle the exception.  It is not absorbed.
            End Try
        End Sub

これにより、メモリリークが発生しますか? 次のような Using ステートメントが表示されることを期待しています。

Using objDBCmd

End Using

ASP.NET プロセスは徐々に (1 GB を超えて) 大きくなり、WinDBG は、ヒープ上に OracleCommand オブジェクトがあることを示します (予想したほどではありませんが)。OracleCommand は、プロセスのサイズを大きくする原因となる他のリソースを保持できると思います。

4

2 に答える 2

0

Usingオブジェクトを使い終わったらオブジェクトを解放するために使用されるので、それは問題になりません。ただしusing、接続を閉じobjDBConます。その接続を開いたままにし、DB への呼び出しごとに共有する方が効率的です。したがって、この場合、実際にはforの使用を取り除き、ループobjDBConの外に引き出しforます。すべてのdb呼び出しの後、ループの外で閉じるようにしてください。

また、これがあなたのコードからの直接のコピーであるかどうかはわかりませんし、あなたのコードが何をしているのかわかりませんが、データベースへの 100k の呼び出しがおそらくメモリ使用量が非常に高く、負荷が高くなる理由です。 SQLサーバー。

于 2012-07-16T13:29:22.957 に答える
0

これがメモリ リークを引き起こすとは思いませんが、(プールされているにもかかわらず) ループ内で 10 万の接続を開いているという事実は、そのような量のリソースが消費されているのを見るのは奇妙ではないと思います。

于 2012-07-16T13:29:52.133 に答える