【问题标题】:What is a good strategy for caching prepared statements in Tomcat?在 Tomcat 中缓存准备好的语句的好策略是什么?
【发布时间】:2010-10-31 02:20:24
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: tomcat servlets jdbc synchronization prepared-statement


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2023-03-19
        • 2012-01-02
        • 1970-01-01
        • 1970-01-01
        • 2013-08-02
        • 1970-01-01
        • 2015-08-01
        • 2012-04-26
        • 1970-01-01
        相关资源
        最近更新 更多