【问题标题】:Will committing multiple transactions during one session increase performance?在一个会话期间提交多个事务会提高性能吗?
【发布时间】:2023-04-01 12:55:02
【问题描述】:

我希望能够使用一个实体管理器为涉及不同实体对象的 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();
}

现在两个服务共享同一个实体管理器。现在我可以进行多个事务并仅在最后一个 Service 对象上调用继承的 close() 方法,然后关闭共享实体管理器。

我打算制作一个 web 应用程序,所以我想知道是否通过让在不同实体对象上运行的不同 serviceObjects 共享它们来更有效地使用实体管理器会话与打开和关闭新会话(实体经理)只需一笔交易。

谢谢。

【问题讨论】:

    标签: java database hibernate hibernate-entitymanager


    【解决方案1】:

    Session-per-operationanti-pattern,但不是出于性能原因。你可以做很多额外的计算(比如创建会话)并且不会注意到任何性能差异,因为等待数据库完成事务与进行额外计算相比需要很长时间(数据库 I/O 操作需要几毫秒才能完成,计算需要纳秒完成)。

    由于您打算制作一个 Web 应用程序,请尝试使用 Hibernate 的 sessionFactory.getCurrentSession()GenericService 的构造函数中执行您现在所做的操作 - 更多信息请参见 user guidethis answer 和 @987654324 @。

    【讨论】:

    • 不会通过减少存储在内存中的活动会话对象(或实体管理器对象)的数量来提高性能吗?
    • 我怀疑你会注意到性能的提高。尝试在类似生产的设置(例如,使用真实数据库,而不是内存数据库)中测量两种场景(重用会话与每次创建新会话)的性能提升。我想你会发现性能的提升几乎是无法衡量的。我的主要观点是首先关注高质量的代码(做正确的事情),而不是在需要出现之前(例如,当网络请求的响应太慢时)过分担心性能。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 1970-01-01
    • 2015-03-15
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多