我正在构建一个反向代理服务器,它将授权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是只读的?
答案 0 :(得分:0)
我希望避免打开/关闭会话的性能开销
你有基准吗?创建会话的大部分开销可以通过使用连接池来保存。我建议在过早优化之前测量创建会话的开销。
如果您决定尝试长期保持会话开放,我建议也会对内存使用情况进行基准测试。 Hibernate有一个实体的会话缓存,可能随着时间的推移而膨胀。
答案 1 :(得分:0)
您不仅应该考虑表现。估计最大并发会话数 - 是否与连接池大小相当(即数据库是否支持此连接数)?
另请注意,相对少量“挂起”会话会耗尽您的连接池并有效阻止整个应用。