hibernate - 如何使用 Postgres 和 Tomcat7 JDBC 池配置 PreparedStatement 缓存?

标签 hibernate postgresql tomcat jdbc

我正在将 Tomcat7 与 Postgres 9.1 一起使用,并将 JPA 与 Hibernate 一起使用,我想配置准备好的语句池。

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

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

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

我正在处理的应用程序尚未投入生产,因此我没有关于配置准备语句缓存的值(value)的现场测量值?它通常会提高性能吗? 使用 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"
/>

最佳答案

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

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

关于hibernate - 如何使用 Postgres 和 Tomcat7 JDBC 池配置 PreparedStatement 缓存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11290960/

相关文章:

node.js - 无法使用 Sequelize ORM 连接到 AWS RDS

java - 在 servlet 的 processRequest 方法中发送 POST 请求

java - 如何从 JPA 查询更新 MySQL 表时间戳?

spring - @Transactional Annotation + 用于在循环中插入数据

python-3.x - 连接到 docker 容器内的 PostgreSQL 时连接调用失败 (aiohttp)

tomcat - 使用 asm 动态生成字节

tomcat - 由于 Solr 服务器无法启动 Hybris Tomcat 服务器

java - 如何设置 Hibernate 以读取/写入不同的数据源?

mysql - GORM withCriteria 返回意外的重复结果

python - 将数组参数传递给 SQL 命令