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

时间:2009-06-03 18:56:50

标签: tomcat servlets jdbc synchronization prepared-statement

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

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

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

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

是否有一个内置于tomcat的方法来执行此操作?我看到this answer提到了poolPreparedStatements DBCP参数,但是从文档中可以清楚地看出它是否与我正在寻找的含义相同。

2 个答案:

答案 0 :(得分:6)

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

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

顺便说一句 - 我的建议是使用c3p0而不是DBCP。我有很多DBCP的问题,一旦我转到c3p0就解决了。

答案 1 :(得分:0)

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