作为一个
这是否有意义?还是我很困惑?
PreparedStatatement
包含预编译的SQL命令,因此如果我们创建这种类型的池,就不需要频繁地创建和销毁此对象(就像线程池一样)。这是否有意义?还是我很困惑?
PreparedStatatement
包含预编译的SQL命令,因此如果我们创建这种类型的池,就不需要频繁地创建和销毁此对象(就像线程池一样)。PreparedStatements 被附加到连接上,因此尽管尽可能地重复使用它们是一个好主意,但显式地池化它们不起作用,因为这可能需要您打开太多的连接。另一件要记住的事情是,每个连接只能有一个 ResultSet 打开,因此在不了解应用程序是否需要同时为该语句获取 ResultSet 的情况下,管理哪些语句可以附加到同一连接将会很困难。
如果您经常执行相同的查询并重复使用连接(通过连接池),那么这是有意义的。在PostgreSQL的pgjdbc-ng JDBC驱动程序中,"driver-side prepared statement cache"可用。缓存的详细信息在pull request 64中有描述。
请注意,这是一种(性能)优化:您不应该依赖它来提高应用程序的速度。应用程序将花费更多的时间等待来自数据库的网络延迟和查询结果,缓存不会改善这一点。调整数据库(模式)和改进网络将产生更大的影响。
如果您在代码的不同位置多次运行相同的查询,则缓存准备语句是有意义的。由于您正在使用PostgreSQL,因此无需从头开始实现它 - PostgreSQL JDBC连接器已经支持此功能(准备好的语句存储在服务器端),请参见此处:http://jdbc.postgresql.org/documentation/head/server-prepare.html。
我个人见过它的工作效果,并通过打开此缓存获得了超过200%的提升。
是的,它可以加速语句的执行。连接池可以使用默认最大缓存值为您完成此操作。
http://dev.mysql.com/doc/refman/5.6/en/statement-caching.html
postgresql
。 - user330315