我正在使用CppCMS开发一个网站,并且遇到了一些MySQL错误。我怀疑这将是空闲问题(如此处所述:Lost connection to MySQL server during query on remote host)或关于并发连接的问题。
所以我想到尝试连接池。 但是我有一个> 50 cppdb::statement
个对象的列表,我认为这些对象包含准备好的语句。这些需要创建一个cppdb::session
对象,直到现在我在程序开头创建它们一次,并在程序的整个生命周期内使用它们。
如何通过连接池正确实现此功能?
答案 0 :(得分:0)
我将准备好的陈述视为与交易具有相似的生命周期。我知道这不是严格意义上的;准备好的声明可用于多个交易。但这就是我使用它们的方式。
如果你遵循这种做法,或者非常接近它的东西,那么你就不会丢失与一个cppdb会话相关的准备好的语句。
换句话说,在获取cppdb会话后创建新的预准备语句。做一个工作单元,然后在释放cppdb会话之前释放准备好的语句。
创建一个新的预准备语句是一件非常低效的工作。许多应用程序每秒创建和释放语句数千次。您是否真的需要在应用程序的生命周期内保留这些准备好的语句?
请记住,预准备语句也会在服务器端分配一点内存和锁定。这是一个非常小的开销,但是不能自由地分配预备语句。你不应该为你不需要的陈述这样做。当你完成它们时你应该释放语句,这样服务器就可以清理它的内存。由于语句分配过多,RDBMS服务器中的内存泄漏是一种风险。
答案 1 :(得分:0)
cppdb为您管理连接池。
请参阅:http://cppcms.com/sql/cppdb/pool.html
仅供参考:准备好的语句缓存在会话中。一般来说,这一切都是透明的。准备语句后,默认情况下会缓存它。