2012-07-02 66 views
3

我使用Tomcat7與Postgres 9.1和JPA與Hibernate,我想配置準備語句池。如何使用Postgres和Tomcat7 JDBC池配置PreparedStatement緩存?

我通過查看postgres查詢日誌已經看到的正常默認行爲是查看大量的PARSE,BIND,執行相同的查詢,所以似乎即使使用jdbc prepared語句,它們也沒有被緩存postgres jdbc驅動程序或服務器上。

在線閱讀似乎表明我必須在postgres jdbc驅動程序上配置準備好的語句池,因此我將connectionProperties="prepareThreshold=3"添加到了我的應用程序context.xml資源定義中,但仍然看不到任何緩存PARSE,BIND消息在日誌文件中,即使我得到一個準備好的語句執行超過3次。

我知道查詢規劃器無法像傳入參數的語句那樣將預定語句的計劃做得更好。由於我使用的是Hibernate,所有發送到數據庫的語句都將是JDBC準備的聲明,所以我無能爲力。

我正在使用的應用程序尚未生產,因此我沒有關於配置準備語句緩存的值的現場測量?當使用postgres和hibernate時,它通常會提高 真實世界的性能嗎?

任何人都知道用postgres和tomcat7成功配置預備語句緩存jdbc pool不是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

你嘗試URL = 「的jdbc:在PostgreSQL://127.0.0.1:5432/thedb prepareThreshold = 3」? –

回答

1

我認爲tomcat jdbc pool不支持準備語句的池化。 Documentation爲「poolPreparedStatements」表示:「[...] Property not used。」

也許這是對您有用:News about Tomcat jdbc pool

+0

請參閱http://stackoverflow.com/a/15901695/87696。它似乎沒有被使用,因爲責任已經從Tomcat連接池中移除,以便使JDBC驅動程序負責準備好的語句緩存。 – benvolioT