如何使用Postgres和Tomcat7 JDBC Pool配置PreparedStatement缓存?

时间:2012-07-02 09:24:04

标签: hibernate postgresql tomcat jdbc

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

通过查看postgres查询日志我看到的正常默认行为是看到很多PARSE,BIND,对同一个查询执行,所以看起来即使使用了jdbc预处理语句,它们也没有被缓存postgres jdbc驱动程序或在服务器上。

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

我知道查询规划器无法将预准备语句的计划作为传入参数的语句。由于我使用Hibernate,所有发送到db的语句都将是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"
/>

1 个答案:

答案 0 :(得分:1)

我认为tomcat jdbc池不支持汇编预准备语句。 Documentation对“poolPreparedStatements”说:“[...]未使用的属性。”

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