我正在寻找一种在servlet环境中缓存预准备语句的方法(特别是Tomcat 5.5)。这意味着减少准备语句的创建次数,即connection.prepareStatement(sql)
被调用的次数。
我最初的想法是在会话中存储PreparedStatement
个对象,其中键(属性名称)是查询本身。这也可以懒惰地完成。
然而,有人提醒我,根据JDBC驱动程序的实现,同一个预处理语句可能同时被2个线程(或请求)访问,导致例如设置了错误的参数。因此,需要同步对这些语句对象的访问。
实现这一目标的好策略是什么?
是否有一个内置于tomcat的方法来执行此操作?我看到this answer提到了poolPreparedStatements
DBCP参数,但是从文档中可以清楚地看出它是否与我正在寻找的含义相同。
答案 0 :(得分:6)
PreparedStatement缓存通常由您使用的连接池提供。
请注意,在连接池工作的方式中,一个线程获取一个连接,将其用于某些sql查询并将其返回到池中。只有这样,连接才可用于另一个线程。除非连接池中存在错误,否则不会在并发的线程之间共享连接。
顺便说一句 - 我的建议是使用c3p0而不是DBCP。我有很多DBCP的问题,一旦我转到c3p0就解决了。
答案 1 :(得分:0)
我不确定其他数据库,但如果你使用的是Oracle,那么JDBC客户端将缓存PreparedStatement。您可能想看看您的数据库是否这样做。