2015-11-05 109 views
2

我正在构建一个反向代理服务器,它将授权并向某些内部API传递http请求。保持Hibernate会话始终打开

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

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

的一点是:
我使用Hibernate来查询数据库。 DB is read-only.我初始化期间开扩的Hibernate session在Spring配置:

@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层,我用它在读取方法:

@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的Session一直开放吗?特别是如果DB是只读的?

+0

每个额外的会话都会消耗一些内存,只读使得它可以安全使用,但是它极其耗费内存,并且通常是一种不好的做法。 – cristianhh

回答

0

我想,以避免性能开销打开/关闭会话

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

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

0

你不仅应该考虑性能。估计并发会话的最大数量 - 是否与连接池大小相当(即数据库是否可以支持这个连接数)?

也请记住,“挂”在会话相对少数可能会耗尽你的连接池,有效块整个应用程序