【问题标题】:Keep DB connection using JPA/Hibernate使用 JPA/Hibernate 保持数据库连接
【发布时间】:2011-03-29 10:56:30
【问题描述】:

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

我执行了很多选择语句来获取按名称存储在数据库中的项目。

我使用以下代码:

    //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

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

所以我的问题是:我怎样才能保持这个连接打开?

【问题讨论】:

  • 事务是如何管理的?手动、spring、JavaEE?

标签: java hibernate jpa


【解决方案1】:

分析确实对性能有一些影响,但仍然报告她的执行时间非常sloooowww,这是出乎意料的。我的意思是,您正在使用连接池,因此获得连接和关闭应该几乎是瞬时的,这些操作根本不应该是一个问题 - 这就是使用连接池的意义所在。准备声明的时间长得离谱。

某处出了点问题,保持连接打开绝对不是解决方案(池应该可以正常工作)。但是没有足够的信息进行诊断。那么,您能否添加一些关于以下内容的详细信息:

  • 上下文(容器外?容器内?)
  • 连接池配置。
  • 围绕您显示的 sn-p 的代码。

附带说明,您应该倾向于使用命名查询(它们通常会由 JPA 提供程序进行预编译,以避免每次解析 JPQL 和生成 SQL 的开销)。但这不是这里的问题。必须解决根本原因。

资源

【讨论】:

    猜你喜欢
    • 2016-10-24
    • 1970-01-01
    • 2011-01-07
    • 1970-01-01
    • 2020-01-10
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多