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

在Tomcat中缓存准备好的语句的好策略是什么?,tomcat,servlets,jdbc,synchronization,prepared-statement,Tomcat,Servlets,Jdbc,Synchronization,Prepared Statement,我正在寻找一种在servlet环境(特别是Tomcat5.5)中缓存准备好的语句的方法。这是为了减少创建准备语句的次数,即调用connection.prepareStatement(sql)的次数 我最初的想法是在会话中存储PreparedStatement对象,其中键(属性名)就是查询本身。这也可以懒散地完成 但是,有人提醒我,根据JDBC驱动程序实现的不同,同一条准备好的语句可能同时被两个线程(或请求)访问,例如,导致设置了错误的参数。因此,需要同步对这些语句对象的访问 实现这一目标的好策略

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

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

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

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


tomcat中是否有内置的方法来执行此操作?我已经看到它在哪里提到了
poolPreparedStatements
DBCP参数,但是从文档中还不完全清楚它是否具有与我所寻找的相同的含义。

我不确定其他数据库,但是如果您使用的是Oracle,JDBC客户端将缓存PreparedStatement。您可能希望查看您的数据库是否会这样做。

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

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

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