当前位置: 首页 > 知识库问答 >
问题:

保持Hibernate会话始终打开

麹正业
2023-03-14

我正在构建一个反向代理服务器,它将授权http请求并将其传递给一些内部API。

我根据PostgresDB中的条目授权传入请求。

这个项目中的性能是优先的——反向代理服务器不应该增加太多响应时间。

简而言之:
我正在使用Hibernate来查询数据库。数据库是只读的。我在Spring配置中的init期间打开Hibernate会话:

@Bean
public Session session()
{
    LOG.info("Opening Hibernate session...");
    try
    {
        return HibernateUtil.getSessionFactory().openSession();
    }
    catch (final HibernateException ex)
    {
        LOG.error("HibernateException while opening Hibernate session.", ex);
        throw ex;
    }
}

然后我将会话注入DAO层,并在read方法中使用它:

@Repository
public class MappingDAOHibernate implements IMappingDAO
{
    @Autowired //in fact this is autowired using constructor
    private final Session session;

    .....

    //read method
    @Override
    public MappingDto getMapping() throws SQLException
    {
        this.session.beginTransaction();
        return (MappingDto)this.session.createCriteria(MappingDto.class)
    }

正如您所看到的,我并不是在每次DAO调用中都关闭/打开会话。我只是在App init打开它,并一直保持打开状态。原因是:
1。这是最快、最简单的实现
2。我希望在开始/结束会话时避免性能开销

问题:
1.保持Hibernate会话一直开放是可以接受的吗?特别是如果DB是只读的?

共有2个答案

漆雕兴平
2023-03-14

你不仅应该考虑表演。估计并发会话的最大数量-它是否与连接池大小相当(即数据库是否支持此数量的连接)?

还要记住,相对较少的“挂起”会话会耗尽连接池,并有效地阻止整个应用程序。

阴鸿才
2023-03-14

我希望在开始/结束会话时避免性能开销

您是否对此进行了基准测试?创建会话的大部分开销可以通过使用连接池来节省。我建议在过早优化会话之前,先测量创建会话的开销。

如果您决定长期保持会话打开,我建议您也对内存使用情况进行基准测试。Hibernate有一个实体的会话缓存,可以随时间膨胀。

 类似资料:
  • 问题内容: 我的项目架构是带有Spring集成和JPA / Hibernate的Struts2。StrutsSpringTestCase基类用于JUnit集成测试。 在正常情况下,web.xml中的以下配置从每个请求的开始到结束都保持单个会话打开: 结果,所有延迟加载都可以在所有服务中正常工作。例如: 现在…当我尝试运行集成测试时会出现问题,这些测试独立于web.xml中的OpenEntityMa

  • 我制作了一个带有引导的手风琴,但它处于for循环中,所以当我单击手风琴的一个项目时,所有其他项目都会同时打开。我怎么能只点击打开手风琴的一个项目?

  • 下面是Spring3.x和Hibernate3.x上的一个假设情况 我在Spring有一个服务层,它调用3个DAO来构建一个模型。DAO 是事务性的(@Transactional),并且具有延迟加载的Hibernate集合。 该服务方法会导致一些更新,以及数据的获取。 典型的DAO方法如下- 我有以下关于OSIV的问题 - 1.在默认的AUTO模式下,此会话刷新(数据库更新)多少次? 2.是否可以

  • 问题内容: 我目前将实体Bean中的集合标记为渴望避免在使用EntityManager加载Bean之后尝试访问集合属性时避免出现惰性初始化异常。 如果我将集合留为延迟加载,如何保持会话打开?我曾考虑过尝试@Transactional,但即使这样行​​之有效,我也不想这样做,因为在较长的时间范围内保持事务开放似乎不正确。 问题答案: https://www.hibernate.org/43.html

  • 我正在iOS上构建一个小应用程序,使用Spotify SDK向其Web Api发出请求。问题是,我正在使用函数每当我想提出请求时,都可以续订令牌。但是对于该函数,文档中说“如果没有指定令牌刷新服务,回调将返回nil作为会话”。这就是发生在我身上的事。我总是得到一个零“续费期”(https://developer.spotify.com/ios-sdk-docs/Documents/Classes/

  • 我正在尝试验证Spring启动后端并获取一些数据 身份验证工作正常。以下是响应标题: 然后我试着从Spring启动中获取项目。这是我的HTTP GET的标题: 它不使用会话cookie,因此会抛出一个错误,说没有标识。 如何使用angular 4.3解决此问题?