我们正在运行java6/hibernate/c3p0/postgresql堆栈。 我们的JDBC驱动程序是8.4-701.jdbc3我应该激活c3p0语句池吗?
我对准备语句有几个问题。我已阅读 优秀文档约Prepared Statements
但我仍然有一个问题,如何配置PostgreSQL的c3p0。
目前,我们有
c3p0.maxStatements = 0
c3p0.maxStatementsPerConnection = 0
在我的理解中准备的语句和语句池是两个不同的东西:
我们休眠堆栈使用准备好的语句。 Postgresql缓存 执行计划。下一次使用相同的语句时,postgresql会重用 执行计划。这可以节省DB中的时间计划语句。
此外,c3p0可以缓存“java.sql.PreparedStatement” 的java实例,这意味着它正在缓存java对象。所以当使用
c3p0.maxStatementsPerConnection = 100时,它会缓存至多100个不同的对象的
对象。它节省了创建对象的时间,但这与postgresql数据库及其准备的语句无关 。
,对吗?
当我们使用约100个不同的语句我会成立 c3p0.maxStatementsPerConnection = 100
但C3P0文档说在c3p0 known shortcomings
语句池的开销 太高。对于不支持 的驱动程序,执行 PreparedStatements的重要预处理,共用 开销超过了任何节省。 默认情况下,语句池关闭为 。如果您的驱动程序执行 预处理PreparedStatements, ,特别是如果它通过具有 RDBMS的IPC执行,您可能会看到 明显的性能增益, 将语句池合并。 (通过将配置属性 maxStatements或 maxStatementsPerConnection设置为大于零的值 来执行此操作 )。
所以:用c3p0和Postgresql激活maxStatementsPerConnection是否合理? 激活它有没有真正的好处?
亲切的问候 Janning
伟大的答案!有了你的详细解释,我可以进行一些测试。事实上:激活c3p0语句池是合理的。 之前,我的语句每次解析和计划,现在他们只能绑定和执行。 但请注意您的数据是否改变以及旧计划的执行效果不佳。我还不知道postgresql是否会不时重复准备好的语句。 非常感谢你的帮助! – Janning 2010-05-28 19:50:23
很棒的回答!实际上,我总是对PreparedStatement的实现感到困惑,并且怀疑每个人都告诉我的好处。 – Chao 2016-07-31 18:06:16