tomcat - 在 Tomcat 中缓存准备好的语句有什么好的策略?

标签 tomcat servlets jdbc synchronization prepared-statement

我正在寻找一种在 servlet 环境(特别是 Tomcat 5.5)中缓存准备好的语句的方法。这是为了减少创建准备好的语句的次数,即 connection.prepareStatement(sql) 被调用的次数。

我最初的想法是在 session 中存储 PreparedStatement 对象,其中键(属性名称)是查询本身。这也可以懒惰地完成。

但是,有人提醒我,根据 JDBC 驱动程序的实现,2 个线程(或请求)可能同时访问同一个准备好的语句,例如,导致设置了错误的参数。因此,对这些语句对象的访问需要同步。

实现这一目标的好策略是什么?

tomcat 是否有内置的方法来执行此操作?我看到了this answer它提到了 poolPreparedStatements DBCP 参数,但如果它与我正在寻找的含义相同,则从文档中并不完全清楚。

最佳答案

PreparedStatement 缓存通常由您使用的连接池提供。

请注意,在连接池的工作方式中,一个线程获取一个连接,将其用于某些 sql 查询并将其返回到池中。只有这样连接才可用于另一个线程。除非连接池中存在错误,否则线程之间不会同时共享连接。

顺便说一句 - 我的建议是使用 c3p0 而不是 DBCP。我遇到了很多 DBCP 问题,这些问题在我迁移到 c3p0 后得到了解决。

关于tomcat - 在 Tomcat 中缓存准备好的语句有什么好的策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/946513/

相关文章:

java - 正确设置简单的服务器端缓存

grails - 如何使用Groovy返回JDBC ResultSet

jsp - 地址栏中的本地主机地址

java - 在类路径资源 + Springboot 中创建名称为 'dataSource' 的 bean 时出错

java - 将对象列表传递给 Freemarker 然后循环

java - 用于 JDBC 的 MariaDB 连接器,用于查询在 PhPMyAdmin 中创建的数据库

Java GSS/JDBC 问题

spring - grails 中特定于环境的 web.xml?

java - 如何使用 UI 对话框启动 Tomcat

java - 使用java中的过滤器记录servlet请求和响应的内容大小