请问如何完全释放sqlsugar 返回
情况是这样,dll在调用sqlsugar前是可以动态加载和卸载的(dll文件能删掉)
但是在dll里调用sqlsugar后,使用Db.Dispose()函数后,仍然无法卸载dll(dll文件提示占用)
热忱回答(13)
-
fate sta VIP01个月前
什么数据库
0 回复 -
皮蛋 VIP01个月前
@fate sta:sqlserver
0 回复 -
皮蛋 VIP01个月前
@fate sta:
再补充下详细信息
环境是.net8,用的是SqlSugarScope单例模式
实例化后Dispose(未操作数据库),可以删除DLL;
操作数据库后Dispose,无法删除,提示占用
除了自身DLL外,以下两个文件也提示占用
SqlSugar.dll
Microsoft.Identity.Client.dll
0 回复 -
fate sta VIP01个月前
禁用一下连接池看一下
0 回复 -
fate sta VIP01个月前
另外这种热插拔不要用单例
0 回复 -
fate sta VIP01个月前
用 sqlsugarclient
0 回复 -
皮蛋 VIP01个月前
@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 VIP01个月前
@皮蛋: 用ADO.NET写一个可以卸载的DEMO,在用sqlsugar写一个不可以卸载的DEMO 。需要2个DEMO
0 回复 -
皮蛋 VIP01个月前
@fate sta:
请看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 VIP01个月前
db.Utilities.RemoveCacheAll();
这样试试呢
0 回复 -
fate sta VIP01个月前
目前ORM所有缓存都存储在这个对象
0 回复 -
皮蛋 VIP01个月前
@fate sta:可以了,非常感谢
0 回复 -
皮蛋 VIP01个月前
@fate sta:
请问Db.Queryable<>() 是否也有缓存?
跟前面一样,调用Queryable也无法卸载
0 回复