在一个会话期间提交多个事务会提高性能吗?
Will committing multiple transactions during one session increase performance?
我希望能够使用一个实体管理器为涉及不同实体对象的 CRUD 操作提交多个事务。例如,我希望能够在一个实体管理器会话期间删除一个猫实体对象并创建一个新的狗实体对象。我通过让 catService 和 dogService(可以 CRUD 对象的对象)扩展 GenericService 来实现这一点:
public abstract class GenericService<T> {
private Class<T> type;
protected static EntityManager entityManager;
public GenericService() {
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
type = (Class) pt.getActualTypeArguments()[0];
if (entityManager == null || !entityManager.isOpen()) entityManager = GetEntityManager.getInstance(); // zo kunnen meerdere services gebruik maken van dezelfde entitymanager sessie. 1 operation per sessie is een antipattern namelijk. Beter meerdere operations in 1 sessie doen.
}
// sluit entityManager en daarmee dus ook de sessie af.
public void close(){
entityManager.close();
}
现在两个服务共享同一个实体管理器。现在我可以进行多个事务并仅在最后一个服务对象上调用继承的 close() 方法,然后关闭共享实体管理器。
我打算制作一个网络应用程序,所以我想知道与打开和关闭新会话相比,通过让在不同实体对象上运行的不同 serviceObjects 共享它们来更有效地使用实体管理器会话是否会提高性能(实体管理器)仅用于一次交易。
谢谢。
Session-per-operation 是 anti-pattern 但不是出于性能原因。你可以做很多额外的计算(比如创建会话)而不会注意到任何性能差异,因为与进行额外计算相比,等待数据库完成事务需要很长时间(数据库 I/O 操作需要几毫秒才能完成,计算需要几纳秒才能完成)。
由于您打算制作一个网络应用程序,请尝试使用 Hibernate 的 sessionFactory.getCurrentSession()
哪种方式可以执行您现在在 GenericService
的构造函数中执行的操作 - 更多信息请参见 user guide, this answer and javadocs.
我希望能够使用一个实体管理器为涉及不同实体对象的 CRUD 操作提交多个事务。例如,我希望能够在一个实体管理器会话期间删除一个猫实体对象并创建一个新的狗实体对象。我通过让 catService 和 dogService(可以 CRUD 对象的对象)扩展 GenericService 来实现这一点:
public abstract class GenericService<T> {
private Class<T> type;
protected static EntityManager entityManager;
public GenericService() {
Type t = getClass().getGenericSuperclass();
ParameterizedType pt = (ParameterizedType) t;
type = (Class) pt.getActualTypeArguments()[0];
if (entityManager == null || !entityManager.isOpen()) entityManager = GetEntityManager.getInstance(); // zo kunnen meerdere services gebruik maken van dezelfde entitymanager sessie. 1 operation per sessie is een antipattern namelijk. Beter meerdere operations in 1 sessie doen.
}
// sluit entityManager en daarmee dus ook de sessie af.
public void close(){
entityManager.close();
}
现在两个服务共享同一个实体管理器。现在我可以进行多个事务并仅在最后一个服务对象上调用继承的 close() 方法,然后关闭共享实体管理器。
我打算制作一个网络应用程序,所以我想知道与打开和关闭新会话相比,通过让在不同实体对象上运行的不同 serviceObjects 共享它们来更有效地使用实体管理器会话是否会提高性能(实体管理器)仅用于一次交易。
谢谢。
Session-per-operation 是 anti-pattern 但不是出于性能原因。你可以做很多额外的计算(比如创建会话)而不会注意到任何性能差异,因为与进行额外计算相比,等待数据库完成事务需要很长时间(数据库 I/O 操作需要几毫秒才能完成,计算需要几纳秒才能完成)。
由于您打算制作一个网络应用程序,请尝试使用 Hibernate 的 sessionFactory.getCurrentSession()
哪种方式可以执行您现在在 GenericService
的构造函数中执行的操作 - 更多信息请参见 user guide, this answer and javadocs.