请问如何完全释放sqlsugar 返回

SqlSugar 处理完成
13 352

情况是这样,dll在调用sqlsugar前是可以动态加载和卸载的(dll文件能删掉)

但是在dll里调用sqlsugar后,使用Db.Dispose()函数后,仍然无法卸载dll(dll文件提示占用)


热忱回答13

  • fate sta fate sta VIP0
    1个月前

    什么数据库

    0 回复
  • 皮蛋 皮蛋 VIP0
    1个月前

    @fate sta:sqlserver

    0 回复
  • 皮蛋 皮蛋 VIP0
    1个月前

    @fate sta

    再补充下详细信息


    环境是.net8,用的是SqlSugarScope单例模式

    实例化后Dispose(未操作数据库),可以删除DLL;

    操作数据库后Dispose,无法删除,提示占用

    除了自身DLL外,以下两个文件也提示占用

    SqlSugar.dll

    Microsoft.Identity.Client.dll


    0 回复
  • fate sta fate sta VIP0
    1个月前

    禁用一下连接池看一下

    0 回复
  • fate sta fate sta VIP0
    1个月前

    另外这种热插拔不要用单例

    0 回复
  • fate sta fate sta VIP0
    1个月前

    用 sqlsugarclient

    0 回复
  • 皮蛋 皮蛋 VIP0
    1个月前

    @fate sta

            public bool ConnectTest(string s)
            {
                SqlSugarClient Db = new SqlSugarClient(new ConnectionConfig()
                {
                    ConnectionString = "Data Source=127.0.0.1,1433;;database=SGDB;User ID=sa;Password=******;Trust Server Certificate=True;Pooling=False;",
                    DbType = DbType.SqlServer,
                    IsAutoCloseConnection = true
                });
                My_Log_Common log_Common = new My_Log_Common
                {
                    RoleId = 0,
                    DateTime = DateTime.Now,
                    LogType = 0,
                    Remark = s
                };
                int result = Db.Insertable(log_Common).ExecuteReturnIdentity();
                return (result > 0 ? true : false);
            }

    你好,按你说的禁用连接池和使用SqlSugarClient后,DLL仍然提示占用,这段是我测试的代码


    卸载时有使用GC强制回收

    GC.Collect();

    GC.WaitForPendingFinalizers();


    按照微软的说法卸载DLL需要满足一些条件才能完成。

    1.没有线程将程序集中的方法加载到其调用堆栈上的 AssemblyLoadContext 中。

    2.加载到 AssemblyLoadContext 中的程序集的任何类型、这些类型的实例以及程序集本身都不会被以下引用:

    -AssemblyLoadContext 外部的引用,弱引用(WeakReference 或 WeakReference)除外。

    -来自 AssemblyLoadContext 内部和外部的强垃圾收集器 (GC) 句柄(GCHandleType.Normal 或 GCHandleType.Pinned)。

    简而言之,您需要确保内存中没有对您加载的程序集中的任何内容的引用,并等待 GC 完成其工作。


    0 回复
  • fate sta fate sta VIP0
    1个月前

    @皮蛋: 用ADO.NET写一个可以卸载的DEMO,在用sqlsugar写一个不可以卸载的DEMO 。需要2个DEMO

    0 回复
  • 皮蛋 皮蛋 VIP0
    1个月前

    @fate sta


    DEMO.zip

    请看demo

    刚才又进行了一些测试,发现用直接执行sql的方式,DLL可以卸载

    猜测是实体配置方面的原因?


    //可被卸载

    int result1 = Db.Ado.GetInt("select 5");

    //可被卸载

    int result2 = Db.Ado.ExecuteCommand("INSERT INTO My_Log_Common (LogType) VALUES (1)");

     //无法卸载(DLL占用)

    int result3 = Db.Insertable(log_Common).ExecuteReturnIdentity();


    0 回复
  • fate sta fate sta VIP0
    1个月前
     db.Utilities.RemoveCacheAll();

    这样试试呢

    0 回复
  • fate sta fate sta VIP0
    1个月前

    目前ORM所有缓存都存储在这个对象

    0 回复
  • 皮蛋 皮蛋 VIP0
    1个月前

    @fate sta:可以了,非常感谢

    0 回复
  • 皮蛋 皮蛋 VIP0
    1个月前

    @fate sta

    请问Db.Queryable<>() 是否也有缓存?

    跟前面一样,调用Queryable也无法卸载

    0 回复