Мы используем NHibernate для ORM, и на этапе инициализации нашей программы нам нужно загрузить много экземпляров некоторого класса T из БД.Консолидация открытых сессий NHibernate в DB (связь NHibernate и DB)
В нашем приложении, следующий код, который извлекает все эти случаи, принимает навсегда:
public IList<T> GetAllWithoutTransaction()
{
using (ISession session = GetSession())
{
IList<T> entities = session
.CreateCriteria(typeof(T))
.List<T>();
return entities;
}
}
}
Используя NHibernate журнала я обнаружил, что фактический SQL запросов каркасных использования являются:
{
Load a bunch of rows from a few tables in the DB (one SELECT statement).
for each instance of class T
{
Load all the data for this instance of class T from the abovementioned rows
(3 SELECT statements).
}
}
3 оператора выбора связаны, то есть вторая зависит от первой, а третья - от первых двух. Как вы можете видеть, количество операторов SELECT составляет миллионы, что дает нам огромные накладные расходы, которые возникают непосредственно из всех этих вызовов в БД (каждый из которых влечет за собой «открытый сеанс БД», «закрыть сеанс БД», .. .), хотя мы используем один сеанс NHibernate.
Мой вопрос: Я хотел бы как-то объединить все эти операторы SELECT в один большой оператор SELECT. Мы не запускаем многопоточность и никоим образом не изменяем БД на этапе инициализации.
Одним из способов сделать это будет определение моего собственного объекта и его отображение с помощью NHibernate, которое будет загружено быстро и загрузится все в одном запросе, но для этого потребуется, чтобы мы выполняли операции соединения, используемые в этих утверждениях сами, и хуже - ломает абстракцию ORM. Есть ли способ сделать это с помощью некоторой конфигурации?
Спасибо, ребята!
Вы пробовали играть с размером партии? – hackerhasid
Если вы действительно новичок в NHibernate, вы можете взглянуть на профайлер nhibernate. – Min
NHibernate не предназначен для пакетной обработки. Я использую NHibernate для 99% запросов, но для пакетной обработки ETL или простой sql могут работать лучше. – Paco