В настоящее время в нашем приложении ASP.NET у нас есть 1 сеанс на каждый запрос, и мы создаем одну транзакцию каждый раз, когда мы загружаем или обновляем и возражаем.См. Ниже:
public static T FindById<T>(object id)
{
ISession session = NHibernateHelper.GetCurrentSession();
ITransaction tx = session.BeginTransaction();
try
{
obj = session.Get<T>(id);
tx.Commit();
}
catch
{
session.Close();
throw;
}
finally
{
tx.Dispose();
}
return obj;
}
public virtual void Save()
{
ISession session = NHibernateHelper.GetCurrentSession();
ITransaction transaction = session.BeginTransaction();
try
{
if (!IsPersisted)
{
session.Save(this);
}
else
{
session.SaveOrUpdateCopy(this);
}
transaction.Commit();
}
catch (HibernateException)
{
if (transaction != null)
{
transaction.Rollback();
}
if (session.IsOpen)
{
session.Close();
}
throw;
}
finally
{
transaction.Dispose();
}
}
Очевидно, что это не идеально, поскольку это означает, что вы создаете новое соединение с базой данных каждый раз, когда загружаете или сохраняете объект, что влечет за собой снижение производительности.
Вопросы:
- Если объект уже загружен в кэш 1-го уровня, вызовет ли GetTransaction () соединение с базой данных?Я подозреваю, что это будет ...
- Есть ли лучший способ обработки нашего управления транзакциями, чтобы было меньше транзакций и, следовательно, меньше соединений с базой данных?
К сожалению, код приложения, вероятно, слишкомсозрел, чтобы структурировать все так (с получением и обновлением всех в одной и той же транзакции):
using(var session = sessionFactory.OpenSession())
using(var tx = session.BeginTransaction())
{
var post = session.Get<Post>(1);
// do something with post
tx.Commit();
}
Было бы ужасной идеей создать одну транзакцию на запрос и зафиксировать ее в конце запроса?Я предполагаю, что недостатком является то, что он связывает одно соединение с базой данных, в то время как выполняются операции, не связанные с базой данных.