【问题标题】:How to configure PreparedStatement Caching with Postgres and Tomcat7 JDBC Pool?如何使用 Postgres 和 Tomcat7 JDBC 池配置 PreparedStatement 缓存?
【发布时间】:2012-07-02 16:58:24
【问题描述】:

我正在使用带有 Postgres 9.1 的 Tomcat7 和带有 Hibernate 的 JPA,我想配置准备好的语句池。

我通过查看 postgres 查询日志看到的正常默认行为是看到许多 PARSE、BIND、执行相同的查询,因此似乎即使使用了 jdbc 准备好的语句,它们也没有被缓存postgres jdbc 驱动程序或在服务器上。

在线阅读似乎表明我必须在 postgres jdbc 驱动程序上配置准备好的语句池,所以我将 connectionProperties="prepareThreshold=3" 添加到我的应用程序 context.xml 资源定义中,但我仍然没有看到任何缓存正在进行它仍然是日志文件中有很多 PARSE、BIND 消息,即使我得到一个准备好的语句执行 3 次以上。

我知道查询计划器无法为准备好的语句制定计划,因为我使用的是传入参数的语句。由于我使用的是 Hibernate,因此发送到数据库的所有语句都将是 JDBC 准备语句所以我对此无能为力。

我正在开发的应用程序还没有投入生产,所以我没有关于配置预准备语句缓存的价值的现场测量?它通常会提高性能吗? 使用 postgres 和 hibernate 时的真实世界?

有人知道使用 postgres 和 tomcat7 jdbc 池而不是 dbcp 池成功配置准备好的语句缓存吗?我的配置如下。

<Resource 
        name="jdbc/thedb"
        factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
        auth="Container"
        type="javax.sql.DataSource"

    jmxEnabled="true"
    logAbandoned="true"
    suspectTimeout="60000"
    jdbcInterceptors="StatementFinalizer;ResetAbandonedTimer"

    driverClassName="org.postgresql.Driver"
    url="jdbc:postgresql://127.0.0.1:5432/thedb"
    username="theusername" 
    password="thepassword" 
    connectionProperties="prepareThreshold=3"

    maxActive="20"
    maxIdle="20" 
    minIdle="3"        
    maxWait="5000"

    testOnBorrow="true"
    validationInterval="30000"
    validationQuery="SELECT count(*) FROM data_source_test"
/>

【问题讨论】:

  • 你试过 url="jdbc:postgresql://127.0.0.1:5432/thedb?prepareThreshold=3" 吗?

标签: hibernate postgresql tomcat jdbc


【解决方案1】:

我认为tomcat jdbc pool不支持准备好的语句池。 Documentation 表示“poolPreparedStatements”:“[...] 未使用属性。”

也许这对你有用:News about Tomcat jdbc pool

【讨论】:

  • stackoverflow.com/a/15901695/87696。似乎没有使用它,因为该责任已从 Tomcat 连接池中移除,有利于让 JDBC 驱动程序负责准备好的语句缓存。
猜你喜欢
  • 2012-06-09
  • 2012-01-12
  • 2018-01-05
  • 2021-07-21
  • 2017-09-15
  • 2014-06-15
  • 2014-10-26
  • 2013-11-28
  • 2016-01-28
相关资源
最近更新 更多