保持Hibernate会话一直打开

时间:2015-11-05 14:45:03

标签: java hibernate

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

我根据Postgres数据库中的条目授权传入请求。

此项目中的性能优先 - 反向代理服务器不应该为响应时间增加很多。

重点:
我正在使用Hibernate来查询数据库。 DB is read-only.我在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;
    }
}

然后我将Session注入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调用时关闭/打开Session。我只是在App init打开它,我一直打开它。 原因是:
1.这是最快最简单的实施方案 2.我希望避免打开/关闭会话的性能开销

问题:
1.让Hibernate Session始终保持打开是否可以接受?特别是如果DB是只读的?

2 个答案:

答案 0 :(得分:0)

  

我希望避免打开/关闭会话的性能开销

你有基准吗?创建会话的大部分开销可以通过使用连接池来保存。我建议在过早优化之前测量创建会话的开销。

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

答案 1 :(得分:0)

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

另请注意,相对少量“挂起”会话会耗尽您的连接池并有效阻止整个应用

相关问题