2009-10-02 30 views
1

我有一个使用Hibernate 3,c3p0和spring 2.5.6的应用程序。我们有一个配置为与postgres数据库交谈的数据源。在应用程序服务器和数据库之间引入防火墙之前,一切都很好。我们间歇性地获取java.net.SocketTimeoutException:在尝试与数据库通信时读取超时错误。如何配置c3p0/hibernate的查询超时阈值

我们认为防火墙的开销会导致数据库延迟响应。我们希望通过提高查询超时之前的等待时间(如果甚至可能的话)的阈值来验证这一点。这里是一个stacktrace片段

org.postgresql.util.PSQLException: An I/O error occured while sending to the backend. 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:218) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.execute(AbstractJdbc2Statement.java:451) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeWithFlags(AbstractJdbc2Statement.java:350) 
    at org.postgresql.jdbc2.AbstractJdbc2Statement.executeQuery(AbstractJdbc2Statement.java:254) 
    at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeQuery(NewProxyPreparedStatement.java:76) 
    at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:208) 
    at org.hibernate.loader.Loader.getResultSet(Loader.java:1808) 
    at org.hibernate.loader.Loader.doQuery(Loader.java:697) 
    at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:259) 
    at org.hibernate.loader.Loader.loadEntity(Loader.java:1881) 
    ... 35 more 
Caused by: java.net.SocketTimeoutException: Read timed out 
    at java.net.SocketInputStream.socketRead0(Native Method) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at org.postgresql.core.VisibleBufferedInputStream.readMore(VisibleBufferedInputStream.java:135) 
    at org.postgresql.core.VisibleBufferedInputStream.ensureBytes(VisibleBufferedInputStream.java:104) 
    at org.postgresql.core.VisibleBufferedInputStream.read(VisibleBufferedInputStream.java:73) 
    at org.postgresql.core.PGStream.ReceiveChar(PGStream.java:259) 
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:1166) 
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:192) 
    ... 44 more 

回答

1

这与Hibernate或C3P0无关;你会从JDBC驱动程序中获得超时。

如果您使用的是8.4或更高版本,请尝试在连接字符串中将socketTimeout设置为更高的值(甚至将其禁用为零)。

+0

啊......我们正在运行8.2。是否有另一种操纵价值的方法? – predhme

+1

此设置在8.3和之前不存在。请注意,我指的是JDBC版本,而不是Postgresql版本。 JDBC是向后兼容的(绝对是所有的8.x版本),所以我建议你升级你的驱动程序。 – ChssPly76

+0

甜!没有意识到这一点。非常感谢! – predhme