然后,整个函数你再找不到关闭数据库连接的动作,是要等着操作系统来释放吗? 有人就说啦,看起来好像没有什么大不了的,这仅仅是一个函数而已;数据库打开连接,未关闭不会影响到整个应用程式;果真是这样吗?
让我们谈谈数据库连接的问题,在Oracle数据库里,一般默认的数据库连接数最多也就100多来个,不会超过200个,即使你改变这个连接数;但无论怎样,它的连接数是有限的;不可能无限地供你消耗。
在Web这个程式里,它不仅不会自动关闭数据库连接,象这样的函数还会每次调用,都会重新用掉一个数据库连接;如果象这样的函数很多的话,你就等着一个错误警告页面弹出来,如Database Connection Timeout…等讯息。
这还不算什么,更有甚者,尽然在循环语句里写下面的代码如 :
[sample-02]
Foreach(DataRow row in tabl.select(“”,”ProductID”)
……………
clsOraDb.Open(strConn)
………….
Next
有人还喜欢玩下面的语句:
[sample-03]
Foreach(DataRow row in tabl.select(“”,”ProductID”)
Foreach(DataColumn col in tbl.columns)
……………
clsOraDb.Open(strConn)
Next
………….
Next
……………
clsOraDb.Open(strConn)
………….
Next
有人还喜欢玩下面的语句:
[sample-03]
Foreach(DataRow row in tabl.select(“”,”ProductID”)
Foreach(DataColumn col in tbl.columns)
……………
clsOraDb.Open(strConn)
Next
………….
Next
说到这,有人就问啦;我在开发环境下测试一点问题都没有呀?是呀,你是没有问题;我想问的是,你开发环境的测试数据有几笔?
现在,问题已经知道在哪里,怎么解决?
针对[sample-01]做如下处理,注意下面代码:
Public Shared Function getOEMPN(ByVal psPN As String, ByRef OEMPN As String) As BSResult
Dim clsResult As New BSResult
Try
clsResult.ResultID = -1
Dim dtResult As New DataTable
Dim Sql As String = String.Empty
Dim clsOraDb As New clsOraClienDb
Dim strConn As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
clsOraDb.Open(strConn) 注释:这里Open后,后面看不到 clsOraDb.Close
Sql = "SELECT SATBMMBRND.OEMPN FRUNO FROM SATBMMBRND WHERE SATBMMBRND.MATNO = :MATNO"
Dim params() As racleParameter = {New OracleParameter("MATNO", psPN)}
If clsOraDb.FillDataTable(Sql, dtResult, params) = False Then
Return clsResult
End If
If dtResult Is Nothing Then
Return clsResult
End If
If dtResult.Rows.Count > 0 Then
OEMPN = dtResult.Rows(0)("FRUNO").ToString()
Else
OEMPN = ""
End If
clsResult.ResultID = 1
clsOraDb.Close 注释:后面看到 clsOraDb.Close
Return clsResult
Catch ex As Exception
clsOraDb.Close 注释:程序异常也看到 clsOraDb.Close
clsResult.ResultID = -1
Return clsResult
Throw ex
End Try
End Function
Dim clsResult As New BSResult
Try
clsResult.ResultID = -1
Dim dtResult As New DataTable
Dim Sql As String = String.Empty
Dim clsOraDb As New clsOraClienDb
Dim strConn As String = ConfigurationManager.ConnectionStrings("ConnectionString").ConnectionString
clsOraDb.Open(strConn) 注释:这里Open后,后面看不到 clsOraDb.Close
Sql = "SELECT SATBMMBRND.OEMPN FRUNO FROM SATBMMBRND WHERE SATBMMBRND.MATNO = :MATNO"
Dim params() As racleParameter = {New OracleParameter("MATNO", psPN)}
If clsOraDb.FillDataTable(Sql, dtResult, params) = False Then
Return clsResult
End If
If dtResult Is Nothing Then
Return clsResult
End If
If dtResult.Rows.Count > 0 Then
OEMPN = dtResult.Rows(0)("FRUNO").ToString()
Else
OEMPN = ""
End If
clsResult.ResultID = 1
clsOraDb.Close 注释:后面看到 clsOraDb.Close
Return clsResult
Catch ex As Exception
clsOraDb.Close 注释:程序异常也看到 clsOraDb.Close
clsResult.ResultID = -1
Return clsResult
Throw ex
End Try
End Function
注意上面的两句代码:clsOraDb.Close和clsOraDb.Close;