2

私のクエリは次のとおりです。これは、トップクエリの「DISTINCT permissionid」句から個別に削除した後、完全に機能します。

SELECT modulename, 
   Group_concat(DISTINCT permissionid) Permissions FROM   licensedproductpermission 
   JOIN vw_licensedproduct USING (licensedproductid) 
   JOIN modulepermission USING (permissionid) 
   JOIN module USING (moduleid) WHERE  ( permissionid IN (SELECT permissionid 
                      FROM   rolepermission 
                      WHERE  roleid IN (SELECT roleid 
                                        FROM   userrole 
                                        WHERE  userid = 14)) ) GROUP  BY modulename UNION SELECT modulename, 
   permissionid FROM   modulepermission 
   JOIN module USING (moduleid) WHERE  permissionid IN ( 159 ) 
   AND ( permissionid IN (SELECT permissionid                               FROM   rolepermission 
                          WHERE  roleid IN(SELECT roleid 
                                           FROM   userrole 
                                           WHERE  userid = 14)) ) UNION SELECT modulename, 
   permissionid FROM   modulepermission 
   JOIN module USING (moduleid) WHERE  moduleid IN ( 160, 98 ) UNION SELECT modulename, 
   permissionid FROM   licensedproductpermission 
   JOIN vw_licensedproduct USING (licensedproductid) 
   JOIN modulepermission USING (permissionid) 
   JOIN module USING (moduleid) WHERE  permissionid = 1 

しかし、DISTINCT パーミッション ID を使用すると、しばらくすると例外がスローされ始めます。mySQL を再起動すると、しばらくの間は再び機能します。オープン接続時に、次のようなサーバー変数を設定しています。

'Open Connection
    <System.Runtime.CompilerServices.Extension()> _
    Public Function OpenConn(conn As MySqlConnection) As MySqlConnection
        If conn.State <> ConnectionState.Open Then conn.Open()

        Dim sSetSql As String = _
           "SET SESSION tmp_table_size = 1024 * 1024 * 1024 * 2; " & _
           "SET SESSION max_heap_table_size = 1024 * 1024 * 1024 * 2; " & _
           "SET SQL_BIG_SELECTS=1; " & _
           "SET SESSION GROUP_CONCAT_MAX_LEN=1048576; " & _
           "SET NET_WRITE_TIMEOUT=99999; " & _
           "SET NET_READ_TIMEOUT=99999; " & _
           "SET SESSION WAIT_TIMEOUT=99999;"

        clsDBAccess.cmdExecuteQueryWithoutLog(conn, sSetSql, Nothing)
        Return conn
    End Function

コネクションクローズ時の..

<System.Runtime.CompilerServices.Extension()> _
    Public Sub CloseConn(conn As MySqlConnection)
        If Not IsNothing(conn) AndAlso conn.State = ConnectionState.Open Then conn.Close()
        conn = Nothing
        GC.Collect(0, GCCollectionMode.Forced)
        GC.Collect(0, GCCollectionMode.Forced)
    End Sub

これは MySQL の再起動後に一部で機能するため、メモリ リークが発生している場所を提案するように要求します。

4

0 に答える 0