我的系统采用COM+,但是现在有个问题
大概1天左右,就要重起一遍COM+服务才可以,否则就无法接受用户的请求我发现任务管理器上面有一个进程DLLHOST.EXE,占用的内存达到了130多M,刚开始的时候只有15M,这个是什么问题呢?是写的COM+组件有问题,还是内存不足啊机器的配置为2个CPU,1G内存

解决方案 »

  1.   

    谢谢以上几位
    内存泄露?
    我们的组件中都是关闭了recordset,也关闭了connecntion的
    是不是这样就足够了呢?我如何才能找出哪里有泄露呢?
    我们的组件是VB写的
      

  2.   

    VB里面用完对象后,应该set nothing,特别是全局对象应该注意,你的问题明显是内存泄漏,可能是对象或者数组在传递完后没释放的!
      

  3.   

    DLLHOST就是你组件的宿主程序
    是你的组件占用内存过度了
    如果可能话,拆分你的组建,把功能分散一下,尽可能使用JIT....等等
      

  4.   

    如果是用纯VB不用API的话,根本不存在内存泄漏
      

  5.   

    我们是用了一些API的,我看下先,set nothing应该是全做了
      

  6.   

    vb没有那么笨,垃圾收集作的挺好的.不出意外我一般不显式用set nothing,我编的纯粹ado数据库程序倒现在都没有什么大问题.如果是这些基础组件出的问题,那setnothing也没什么用.我现在一直是7*24运行,除非windows其他的东西出错重起了.
    估计是你的api没有作相应的释放动作吧.
      

  7.   

    以下是我们的一个典型范例,请大家帮忙看下先
    Public Function SearchNewProperties(ByVal StrType As String, Optional ByRef LCount As Variant = -1) As Recordset
        
        Dim rs         As ADODB.Recordset
        Dim rsCount    As ADODB.Recordset
        Dim cmd        As ADODB.Command
        Dim cn         As ADODB.Connection
        Dim MyReamisApp   As ReamisSys.ReamisApp
        Dim strSQL     As String
        Dim strWhere   As String
        
        Set rs = CreateObject("Adodb.Recordset")
        Set rsCount = CreateObject("Adodb.Recordset")
        Set cmd = CreateObject("Adodb.Command")
        Set cn = CreateObject("Adodb.Connection")
        Set MyReamisApp = CreateObject("ReamisSys.ReamisApp")
        
        
        On Error GoTo ErrConnectDB
        cn.Open MyReamisApp.ConnectionString
        
        strSQL = "Select * From VwProperty Where "
        Select Case UCase(Trim(StrType))
               Case "DAY" '×î½üÒ»Ìì
                    strWhere = " CreatedTime > '" & Now - 1 & "'"
               Case "WEEK" '×î½üÒ»ÖÜ
                    strWhere = " CreatedTime > '" & Now - 7 & "'"
               Case "MONTH" '×î½üÒ»¸öÔÂ
                    strWhere = " CreatedTime > '" & Now - 30 & "'"
               Case Else
                    On Error GoTo 0
                    GoTo errInvalidParameters
        End Select
        strSQL = strSQL + strWhere
        If LCount <> -1 Then
            Dim strSqlCount As String
           strSqlCount = "Select count(*) as lCount From VwProperty where " & strWhere
           On Error GoTo ErrAccessDb
           rsCount.Open strSqlCount, cn, , adLockReadOnly
           LCount = rsCount.Fields("LCount")
           rsCount.Close
        End If
        
        On Error GoTo ErrAccessDb
        rs.Open strSQL, cn, adOpenDynamic, adLockReadOnly
        Set SearchNewProperties = rs
        
        
        GetObjectContext.SetComplete
        
        Exit Function
        
    errInvalidParameters:
        Err.Raise vbObjectError + ErrorReamisEnum.errInvalidParameters, ERRSRC_CustomerManager, LoadResString(ErrorReamisEnum.errInvalidParameters)
        Exit Function
        
    ErrConnectDB:
        GetObjectContext.SetAbort
        LogToFile "CustomerManager.SearchNewProperties", "Error occurred while connecting database:" _
                & "Err.Number = " & Err.Number _
                & "Err.Source = " & Err.Source _
                & "Err.Description = " & Err.Description    Err.Raise vbObjectError + ErrorReamisEnum.ErrConnectDB, ERRSRC_CustomerManager, _
                  LoadResString(ErrorReamisEnum.ErrConnectDB)
        Exit FunctionErrAccessDb:
        GetObjectContext.SetAbort
        LogToFile "CustomerManager.SearchNewProperties", "Error occurred while Access database:" _
                & "Err.Number = " & Err.Number _
                & "Err.Source = " & Err.Source _
                & "Err.Description = " & Err.Description
        Err.Raise vbObjectError + ErrorReamisEnum.ErrAccessDb, ERRSRC_CustomerManager, _
                  LoadResString(ErrorReamisEnum.ErrAccessDb)
        
    End Function
      

  8.   

    Dim rs         As ADODB.Recordset
        Dim rsCount    As ADODB.Recordset
        Dim cmd        As ADODB.Command
        Dim cn         As ADODB.Connection 兄弟,为何用了这么多??
    和我一样蠢! :)
        
      

  9.   

    ??
    在解决之前,我想知道有否一个功能可以指定时间自动关闭COM+服务的?
    我在组件服务那里将闲置关闭之前的时间设置为1分钟,
    那么在凌晨的时候肯定没有人访问,那么服务应该是停止的,但是并没有停止啊