我在做一个项目只要运行下面这个页面就出现
超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小。这个问题
我始终弄不明白,我有这个习惯每次打开连接用完之后都关了的啊
请高手帮忙看一下,非常感谢!就差这个问题就可以结题了
该页代码如下,可能有点长:
Public Class DocFlowShow
    Inherits System.Web.UI.Page#Region " Web 窗体设计器生成的代码 "    '该调用是 Web 窗体设计器所必需的。
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()    End Sub    '注意: 以下占位符声明是 Web 窗体设计器所必需的。
    '不要删除或移动它。
    Private designerPlaceholderDeclaration As System.Object    Private Sub Page_Init(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Init
        'CODEGEN: 此方法调用是 Web 窗体设计器所必需的
        '不要使用代码编辑器修改它。
        InitializeComponent()
    End Sub#End Region    Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        '在此处放置初始化页的用户代码
    End Sub
    Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
        writer.Write(GenOFileTableTran())
    End Sub    Private Function GenOFileTableTran() As String
        Dim rv As String = "", OID As Integer = 0
        If Len(Page.Request("docid")) > 0 Then OID = CType(Page.Request("docid"), Integer)
        'OID = 84
        If OID > 0 Then
            Dim PNO As Integer = 0, OTitle As String = ""
            Dim cn As SqlConnection            cn = New SqlConnection
            cn.ConnectionString = Application("CN")
            cn.Open()            Dim dr As SqlDataReader = New SqlCommand( _
                "SELECT [ReadPNO] FROM [OfileTran] WHERE [TranPNO]=0 AND [OID]=" & OID, _
                cn).ExecuteReader(CommandBehavior.CloseConnection)
            If dr.Read Then
                PNO = CType(dr("ReadPNO"), Integer)
            End If
            dr.Close()
            cn.Close()
            If PNO > 0 Then
                rv = GenOFileTableTran(OID, PNO)
                If Len(rv) > 0 Then
                    cn.Open()
                    dr = New SqlCommand( _
                        "SELECT [DocTitle] FROM [WF_DOCUMENT] WHERE [DocID]=" & OID, _
                        cn).ExecuteReader(CommandBehavior.CloseConnection)
                    If dr.Read Then
                        OTitle = dr("DocTitle")
                        rv = "<HTML><HEAD><TITLE>柳铁工务在线 ≡ 公文流转图</TITLE></HEAD>" & vbCrLf & _
                             "<BODY bottomMargin='1' leftMargin='1' topMargin='1' rightMargin='1'>" & _
                             "<DIV ALIGN=Left>" & vbCrLf & _
                             "<table width='600'><tr>" & _
                             "<td width='100' align='right' bgColor='#c58341'><FONT color='#ffff00'>公文流转图</FONT></td>" & _
                             "<td bgColor='#cc99ff'><font color='#3366ff'>" & OTitle & "</font></td>" & _
                             "<td align='center' width='50' bgColor='#ccccff'><a href='javascript:window.close();'>关闭窗口</a></td>" & _
                             "</tr></table></DIV>" & vbCrLf & _
                             "<DIV ALIGN=Left>" & vbCrLf & _
                             "<TABLE BORDER='1' bgcolor='#ffeeff'>" & vbCrLf & _
                             "<TR>" & rv & "</TR></TABLE>" & vbCrLf & _
                             "</DIV></BODY></HTML>"
                    End If
                    dr.Close()
                    cn.Close()
                End If
            End If        End If
        If Len(rv) < 1 Then
            rv = "<HTML><HEAD><TITLE>柳铁工务在线 ≡ 公文流转图</TITLE></HEAD>" & _
                 "<BODY><BR><BR><DIV ALIGN='CENTER'>不能生成指定公文的流转图!</DIV></BODY></HTML>"
        End If        Return rv
    End Function

解决方案 »

  1.   

    Private Function GenOFileTableTran(ByVal OID As Integer, ByVal TranPNO As Integer, Optional ByVal n As Short = 0) As String
            Dim rv As String = ""
            Dim cn As SqlConnection
            cn = New SqlConnection
            cn.ConnectionString = Application("CN")
            cn.Open()        Dim dr As SqlDataReader = New SqlCommand( _
                "SELECT [ReadPNO] FROM [OfileTran] WHERE [TranPNO]=" & TranPNO & "AND [OID]=" & OID, _
                cn).ExecuteReader(CommandBehavior.CloseConnection)        rv = vbCrLf & "<TD WIDTH='138' align='center' valign='middle'>" & GenOFileTableTranCell(TranPNO, OID, dr.HasRows) & "</TD>"        If dr.HasRows Then
                rv = rv & "<TD ALIGN='Left'><TABLE cellSpacing='0' cellPadding='0' border='1'>"
                While dr.Read
                    rv = rv & vbCrLf & "<TR>" & _
                          GenOFileTableTran(OID, dr("ReadPNO"), n + 1) & "</TR>"
                End While
                rv = rv & "</TABLE></TD>"
            Else
                rv = rv & "<TD WIDTH=0>&nbsp;<TD>"
            End If
            dr.Close()
            cn.Close()        Return rv
        End Function    Private Function GenOFileTableTranCell(ByVal ReadPNO As Integer, ByVal OID As Integer, ByVal bShowTran As Boolean) As String
            Dim rv As String = "<TABLE BORDER=0 cellSpacing='0' cellPadding='0'>"
            Dim cn As SqlConnection = New SqlConnection(Application("cn"))
            cn.Open()        Dim dr As SqlDataReader = New SqlCommand( _
                "SELECT [ReadRem],SignFlag,ReadDate=CONVERT(Char(10),[ReadTime],120),SignFile," & _
                "PName=(SELECT [PName] FROM [Person] WHERE [PNO]=" & ReadPNO & ")" & _
                "FROM [OfileTran] WHERE [ReadPNO]=" & ReadPNO & "AND [OID]=" & OID & " AND [TranPNO]<>0", _
                cn).ExecuteReader(CommandBehavior.CloseConnection)        If dr.Read Then
                Dim strimage As String = IIf(Not IsDBNull(dr("SignFile")), dr("SignFile") & "'", "Usinged.jpg'")
                'Dim strSign As String = IIf((dr("SignFlag") = 0), "未签收", "已经签收")
                rv = rv & "<TR><TD ALIGN='Right' WIDTH=60><FONT color='#0000ff' size=2>接收人:</FONT></TD><TD><FONT color='#ff00ff' size=2>" & dr("PName") & "</FONT></TD></TR>" & _
                          "<TR><TD ALIGN='Right' WIDTH=60><FONT color='#0000ff' size=2>接收日期:</FONT></TD><TD><FONT color='#ff00ff' size=2>" & dr("ReadDate") & "</FONT></TD></TR>" & _
                          "<TR><TD ALIGN='Right' WIDTH=60><FONT color='#0000ff' size=2>阅读附言:</FONT></TD><TD><FONT color='#ff00ff' size=2>" & dr("ReadRem") & "</FONT></TD></TR>" & _
                           "<TR><TD ALIGN='Right' WIDTH=60><FONT color='#0000ff' size=2>签收状态:</FONT></TD><TD><IMG alt='数字签名' src='images/Sign/" & strimage & "</TD></TR>"
            Else
                dr.Close() : cn.Close() : cn.Open()
                dr = New SqlCommand( _
                    "SELECT [PName] FROM [Person] WHERE [PNO]=" & ReadPNO, _
                    cn).ExecuteReader(CommandBehavior.CloseConnection)
                If dr.Read Then
                    rv = rv & "<TR><TD ALIGN='Right' WIDTH=60><FONT color='#0000ff' size=2>转发人:</FONT></TD><TD><FONT color='#ff00ff' size=2>" & dr("PName") & "</FONT></TD></TR>"
                Else
                    rv = rv & "<TR><TD ALIGN='Right' WIDTH=60><FONT color='#ff0000' size=2>转发人错:</FONT></TD><TD><FONT color='#ff0000' size=2>" & ReadPNO & "</FONT></TD></TR>"
                End If
            End If
            If bShowTran Then
                dr.Close() : cn.Close() : cn.Open()
                dr = New SqlCommand( _
                    "SELECT [TranRem],TranDate=CONVERT(Char(10),[TranTime],120) FROM [OfileTran] WHERE [TranPNO]=" & ReadPNO & " AND [OID]=" & OID, _
                    cn).ExecuteReader(CommandBehavior.CloseConnection)
                If dr.Read Then
                    rv = rv & "<TR><TD ALIGN='Right' WIDTH=60><FONT color='#3366ff' size=2>转发日期:</FONT></TD><TD><FONT color='#ff6633' size=2>" & dr("TranDate") & "</FONT></TD></TR>" & _
                              "<TR><TD ALIGN='Right' WIDTH=60><FONT color='#3366ff' size=2>转发附言:</FONT></TD><TD><FONT color='#ff6633' size=2>" & dr("TranRem") & "</FONT></TD></TR>"
                End If
            End If
            rv = rv & "</TABLE>"
            dr.Close()
            cn.Close()
            Return rv
        End Function
    End Class
      

  2.   

    使用DataSet这样的离线数据集可以避免这样的问题或是在数据库连接字符串中指定池的最大值Max Pool
      

  3.   

    Max Pool Size=100;Min Pool Size=0;Connection Lifetime=60;
    默认好象是50
      

  4.   

    我给你给其中一个:Private Function GenOFileTableTran() As String
      using cn As new SqlConnection
        cn.ConnectionString = Application("CN")
        cn.Open()
        return Function GenOFileTableTran(cn)
      end using
    end functionPrivate Function GenOFileTableTran(SqlConnection cn) As String
            Dim rv As String = "", OID As Integer = 0
            If Len(Page.Request("docid")) > 0 Then OID = CType(Page.Request("docid"), Integer)
            'OID = 84
            If OID > 0 Then
                Dim PNO As Integer = 0, OTitle As String = ""            Dim dr As SqlDataReader = New SqlCommand( _
                    "SELECT [ReadPNO] FROM [OfileTran] WHERE [TranPNO]=0 AND [OID]=" & OID, _
                    cn).ExecuteReader(CommandBehavior.CloseConnection)
                If dr.Read Then
                    PNO = CType(dr("ReadPNO"), Integer)
                End If
                dr.Close()
                If PNO > 0 Then
                    rv = GenOFileTableTran(OID, PNO)
                    If Len(rv) > 0 Then
                        cn.Open()
                        dr = New SqlCommand( _
                            "SELECT [DocTitle] FROM [WF_DOCUMENT] WHERE [DocID]=" & OID, _
                            cn).ExecuteReader(CommandBehavior.CloseConnection)
                        If dr.Read Then
                            OTitle = dr("DocTitle")
                            rv = "<HTML><HEAD><TITLE>柳铁工务在线 ≡ 公文流转图</TITLE></HEAD>" & vbCrLf & _
                                 "<BODY bottomMargin='1' leftMargin='1' topMargin='1' rightMargin='1'>" & _
                                 "<DIV ALIGN=Left>" & vbCrLf & _
                                 "<table width='600'><tr>" & _
                                 "<td width='100' align='right' bgColor='#c58341'><FONT color='#ffff00'>公文流转图</FONT></td>" & _
                                 "<td bgColor='#cc99ff'><font color='#3366ff'>" & OTitle & "</font></td>" & _
                                 "<td align='center' width='50' bgColor='#ccccff'><a href='javascript:window.close();'>关闭窗口</a></td>" & _
                                 "</tr></table></DIV>" & vbCrLf & _
                                 "<DIV ALIGN=Left>" & vbCrLf & _
                                 "<TABLE BORDER='1' bgcolor='#ffeeff'>" & vbCrLf & _
                                 "<TR>" & rv & "</TR></TABLE>" & vbCrLf & _
                                 "</DIV></BODY></HTML>"
                        End If
                        dr.Close()
                    End If
                End If        End If
            If Len(rv) < 1 Then
                rv = "<HTML><HEAD><TITLE>柳铁工务在线 ≡ 公文流转图</TITLE></HEAD>" & _
                     "<BODY><BR><BR><DIV ALIGN='CENTER'>不能生成指定公文的流转图!</DIV></BODY></HTML>"
            End If        Return rv
        End Function另外的一两个完全一样,要注意你的的代码逻辑上其实可能打开无数连接。
      

  5.   

    我上面少改了一句:rv = GenOFileTableTran(OID, PNO)应该为rv = GenOFileTableTran(cn,OID, PNO)然后你的定义 Private Function GenOFileTableTran(ByVal OID As Integer, ByVal TranPNO As Integer, Optional ByVal n As Short = 0) As String应该改为Private Function GenOFileTableTran(SqlConnection cn,ByVal OID As Integer, ByVal TranPNO As Integer, Optional ByVal n As Short = 0) As String并且函数中不应该打开数据库连接。你的问题归结起来,是因为“GenOFileTableTran(OID, dr("ReadPNO"), n + 1) & "</TR>"”这一句,其递归调用相关方法的深度和宽度你并不知道,确在相关方法中每一次都打开数据库连接。
      

  6.   

    using cn as new DBConnection
      cn.connectString="......"
      cn.open
      'todo:数据库处理
      call anyProc
    end using这显然不是那么简单!anyProc内部是否会打开数据库连接呢?anyProc要消耗多长时间呢?这应该仔细看清楚。如果不清楚,就应该将cn放在外边:using cn as new DBConnection
      cn.connectString="......"
      cn.open
      'todo:数据库处理
      call anyProc(cn)  'anyProc中共享使用cn
    end using或者:using cn as new DBConnection
      cn.connectString="......"
      cn.open
      'todo:数据库处理
    end using
    call anyProc()  '前一个连接已经强制提前关闭,不会影响anyProc内部的连接。后两者从结构上看比较靠得住一些。