【问题标题】:Connection Pooling: How to deal with prepared statements?连接池:如何处理准备好的语句?
【发布时间】:2018-01-31 17:39:35
【问题描述】:

我正在使用 CppCMS 开发一个网站,但遇到了一些 MySQL 错误。我怀疑这将是空闲问题(如此处所述:Lost connection to MySQL server during query on remote host)或有关并发连接的问题。

所以我想尝试连接池。 但是我有 >50 个 cppdb::statement 对象的列表(我认为)这些对象包含准备好的语句。这些需要创建一个cppdb::session 对象,直到现在我在程序开始时创建它们一次,并在程序的整个生命周期中使用它们。

如何通过连接池正确实现这一点?

【问题讨论】:

    标签: mysql prepared-statement cppcms


    【解决方案1】:

    我将准备好的语句视为具有与事务类似的生命周期。我知道这并不完全正确;准备好的语句可以用于多个事务。但这就是我使用它们的方式。

    如果您遵循这种做法,或者非常接近它的做法,那么您将不会丢失与一个 cppdb 会话相关联的准备好的语句。

    换句话说,在获取 cppdb 会话后创建新的准备好的语句。完成一个工作单元,然后在释放该 cppdb 会话之前释放准备好的语句。

    创建一个新的准备好的语句是一项开销非常低的事情。许多应用程序每秒创建和释放数千次语句。您真的需要在应用的整个生命周期中保留这些准备好的语句吗?

    请记住,准备好的语句会分配一点内存并在服务器端锁定。这是一个很小的开销,但分配准备好的语句不是免费的。对于不需要的语句,您不应该这样做。当你用完它们时你应该释放它们,这样服务器就可以清理它的内存。由于过多的语句分配导致 RDBMS 服务器中的内存泄漏是一种风险。

    【讨论】:

      【解决方案2】:

      cppdb 为您管理连接池。

      见:http://cppcms.com/sql/cppdb/pool.html

      仅供参考:准备好的语句在会话中被缓存。一般来说,这一切都是为您透明地完成的。准备好语句后,默认情况下会缓存它。

      见:http://cppcms.com/sql/cppdb/stat.html

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-08-30
        • 2022-11-30
        • 1970-01-01
        • 2013-10-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多