我正在使用带有 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"
/>