【发布时间】:2011-02-24 15:09:42
【问题描述】:
我们正在运行 java6/hibernate/c3p0/postgresql 堆栈。 我们的 JDBC 驱动是 8.4-701.jdbc3
我有几个关于准备好的陈述的问题。我读过了 关于Prepared Statements的优秀文档
但我仍然有一个问题,如何使用 postgresql 配置 c3p0。
目前我们有
c3p0.maxStatements = 0
c3p0.maxStatementsPerConnection = 0
在我的理解中,prepared statements 和 statement pooling 是两个不同的东西:
我们的休眠堆栈使用准备好的语句。 Postgresql 正在缓存 执行计划。下次使用相同的语句时,postgresql 会重用 执行计划。这节省了在 DB 中规划语句的时间。
另外c3p0可以缓存“java.sql.PreparedStatement”的java实例
这意味着它正在缓存 java 对象。所以当使用
c3p0.maxStatementsPerConnection = 100 它最多缓存 100 个不同的
对象。它节省了创建对象的时间,但这与
postgresql 数据库及其准备好的语句。
对吗?
当我们使用大约 100 种不同的语句时,我会设置 c3p0.maxStatementsPerConnection = 100
但是 c3p0 文档在 c3p0 known shortcomings 中说
Statement pooling 的开销是 太高。对于没有的司机 执行重要的预处理 PreparedStatements,池化 开销超过任何节省。 语句池因此被关闭 默认。如果你的司机这样做 预处理 PreparedStatements, 特别是如果它通过 IPC 使用 RDBMS,您可能会看到一个 显着的性能增益 打开语句池。 (做这个 通过设置配置属性 maxStatements 或 maxStatementsPerConnection 到一个值 大于零。)。
那么:用 c3p0 和 Postgresql 激活 maxStatementsPerConnection 是否合理? 激活它有真正的好处吗?
亲切的问候 詹宁
【问题讨论】:
标签: postgresql c3p0