使用JPA / Hibernate保持数据库连接

时间:2010-08-13 12:35:32

标签: java hibernate jpa

我在应用程序中使用JPA和Hibernate。 (使用PostgreSQL作为DBMS)

我执行了很多select语句来获取存储在DB中的项目名称。

我使用以下代码:

    //em is the javax.persistence.EntityManager Object.
    Query q = em.createQuery("Select i from Item i where i.name = :name");

    q.setParameter("name", nameParam);

    List<NavigationItem> results = q.getResultList();

所以,我的问题是,通过连接到数据库,准备语句和关闭连接,我会浪费很多时间。 我使用Eclipse TPTP来跟踪哪些方法花费的时间最多:(每分钟)

com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery():~22s com.mchange.v2.c3p0.impl.NewProxyConnection()。close():〜16s com.mchange.v2.c3p0.impl.NewProxyConnection()。prepareStatement(String):~12s com.mchange.v2.c3p0.impl.AbstractPoolBackedDataSource()。getConnetction():~6s com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.close():~4s

执行查询,需要他的时间,没关系,但我认为其他方法需要的时间比他们应该的多。 如果我可以保持连接打开几个(或几百个)执行,应用程序会快得多。

所以我的问题是:我如何保持这种联系开放?

1 个答案:

答案 0 :(得分:1)

分析确实会对性能产生一些影响但是,执行时间报告她疯狂地 sloooowww ,这是出乎意料的。我的意思是,你正在使用连接池并获得连接,因此关闭应该几乎是即时的,这些操作根本不应该是一个问题 - 这在某种程度上是使用连接池的关键。准备一份声明的时间非常高。

某处出现了问题并且保持连接打开绝对不是解决方案(池应该正常工作)。但是没有足够的信息用于诊断。那么,请你补充一些细节:

  • 上下文(out-container?in-container?)
  • 连接池配置。
  • 您正在展示的代码段周围的代码。

作为旁注,您应该支持使用命名查询(它们通常由JPA提供程序预编译,以避免解析JPQL和每次生成SQL的开销)。但这不是问题所在。必须解决根本原因。

资源