Мне удалось ОГРОМНО изменить производительность, кэшировав экземпляр базы данных, который он создает в процедурах конструктора / инициализации. То, что я вижу сейчас, это ~ 2-3-кратное ускорение, в зависимости от ситуации и пробега.
1) Метод простой замены _db статическим экземпляром работает нормально, если вы вызываете только конструктор по умолчанию, и имеет все те же преимущества в скорости.
// MyProject.MyDB _db;
// replace with a static instance, and remove the "this." from other lines
static MyProject.MyDB _db = new MyDB();
public MyClass() {
//_db=new MyProject.MyDB();
Init();
}
2) Я написал небольшой класс кэширования для записей БД и вызываю его из моего файла ActiveRecord.tt во всех старых местах, где использовался «new ()».
// REPLACE "MyDB" with the name of your DB. Alternately, include this
// class in Context.tt and have it generate the correct name.
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];
}
///<summary>Call this when the "DefaultConnection" string changes in the
/// App.exe.config file so that a new db instance will be created
/// and pick up the changed value. </summary>
public static void Clear() {
_dict.Clear();
}
}
Это тип замены, выполненный в файле ActiveRecord.tt:
public <#=tbl.ClassName#>(){
_db=new <#=Namespace#>.<#=DatabaseName#>DB();
Init();
}
// becomes this:
public <#=tbl.ClassName#>(){
_db= <#=Namespace#>.ContextDatabaseCache.Get<#=DatabaseName#>DB();
Init();
}