我们正在运行 java6/hibernate/c3p0/postgresql 堆栈。我们的 JDBC 驱动是 8.4-701.jdbc3
我有几个关于准备好的陈述的问题。我已经阅读了关于准备好的陈述的优秀文件
但我仍然有一个问题如何使用 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 中说已知的缺点
Statement pooling 的开销太高。对于未对 PreparedStatements 执行大量预处理的驱动程序,池化开销超过了任何节省。语句池因此默认关闭。如果您的驱动程序确实对 PreparedStatements 进行了预处理,特别是如果它通过 IPC 和 RDBMS 进行预处理,那么您可能会通过打开 Statement pooling 看到显着的性能提升。(通过将配置属性 maxStatements 或 maxStatementsPerConnection 设置为大于零的值来执行此操作。)。
那么:用 c3p0 和 Postgresql 激活 maxStatementsPerConnection 是否合理?激活它有真正的好处吗?
亲切的问候詹宁