有一个sql PreparedStatement池是否有意义?

时间:2014-07-27 12:17:37

标签: java sql postgresql design-patterns pool

由于PreparedStatatement包含预编译的sql命令,所以当我们创建这种类型的池时,为了不创建和销毁这个对象太多(就像线程池一样)。
它有意义吗?或者我真的很困惑?

6 个答案:

答案 0 :(得分:1)

我认为您正在寻找的是缓存准备好的陈述。一些连接池为您做了一个可选的调整参数(Weblogic,我也认为是JBoss)。适用于在运行时会话中多次使用相同预准备语句的情况,即使在同一事务中也不一定。你使用静态基本上意味着你只认为你将拥有其中一个,而不是需要一个缓存用于多个语句,所以理论上它会起作用。我不确定的是,是否可以跨连接共享预准备语句缓存,或者它是否是特定于连接的。

答案 1 :(得分:0)

不,因为每次都必须在客户端绑定它们。

服务器可以缓存已编译的PreparedStatement(例如已解析,已检查以确保表存在且列是正确的类型等),这正是您真正想要的。

答案 2 :(得分:0)

PreparedStatements附加到连接,因此即使尽可能重用它们也是一个好主意,明确地将它们合并将无法工作,因为它可能需要您有太多打开的连接。另外要记住的是,每个连接只能打开一个ResultSet,因此很难管理哪些语句可以附加到同一个连接而不了解应用程序是否需要同时使用ResultSet言。

答案 3 :(得分:-1)

如果您从代码中的不同位置多次运行相同的查询,则缓存准备好的语句是有意义的。由于您正在使用PostgreSQL,因此您无需从头开始实现 - PostgreSQL JDBC连接器已经支持此功能(预准备语句存储在服务器端),请参见此处:http://jdbc.postgresql.org/documentation/head/server-prepare.html

我个人认为只需打开此缓存就能正常工作并提供+ 200%的提升。

答案 4 :(得分:-1)

是的,它加快了语句的执行速度。连接池为您提供最大缓存默认值。

http://dev.mysql.com/doc/refman/5.6/en/statement-caching.html

答案 5 :(得分:-1)

是的,如果您经常触发相同的查询并重新使用连接(通过连接池),这是有意义的。 PostgreSQL的pgjdbc-ng JDBC驱动程序中提供了“驱动程序端预处理语句缓存”。 pull request 64中更详细地描述了缓存。

请注意,这是(性能)优化:您不应该依赖它来提高应用程序的速度。应用程序将花费更多时间等待网络延迟和数据库查询结果,缓存不会改善这一点。调整数据库(模式)和改进网络将产生更大的影响。