通过在构造函数/初始化过程中缓存数据库实例,我能够在性能方面取得巨大的差异。现在我看到的是大约2-3倍的加速,具体取决于情况和运行。
1) 如果您只调用默认构造函数,则仅使用静态实例替换_db的方法就可以正常工作,并具有相同的速度优势。
static MyProject.MyDB _db = new MyDB();
public MyClass() {
Init();
}
2) 我编写了一个小的缓存类来缓存数据库条目,并从我的ActiveRecord.tt文件中调用它,以替换所有旧的使用"new()"的地方。
class ContextDatabaseCache {
public static MyDB GetMyDB()
{
return GetInstance("~~default~~", () => new MyDB());
}
public static MyDB GetMyDB(string connectionString) {
return GetInstance(connectionString, () => new MyDB(connectionString));
}
public static MyDB GetMyDB(string connectionString, string providerName)
{
return GetInstance(connectionString + providerName, () => new MyDB(connectionString, providerName));
}
private static Dictionary<string, MyDB> _dict = new Dictionary<string, MyDB>();
private static MyDB GetInstance(string key, Func<MyDB> createInstance)
{
if (!_dict.ContainsKey(key)) {
lock (_dict) {
if (!_dict.ContainsKey(key)) {
_dict.Add(key, createInstance());
}
}
}
return _dict[key];
}
public static void Clear() {
_dict.Clear();
}
}
这是在ActiveRecord.tt文件中进行的替换类型:
public <#=tbl.ClassName#>(){
_db=new <#=Namespace#>.<#=DatabaseName#>DB();
Init();
}
public <#=tbl.ClassName#>(){
_db= <#=Namespace#>.ContextDatabaseCache.Get<#=DatabaseName#>DB();
Init();
}