在c3p0中关闭服务器端预处理语句

时间:2014-06-09 21:59:08

标签: java mysql jdbc prepared-statement c3p0

这有一个商业原因与如何在slave和master之间路由查询有关。 From this question我知道它可能在Connector / J中,但是阅读c3p0的文档似乎从来没有区分服务器端和客户端语句缓存,并且考虑到它对内存使用的讨论,我认为它意味着客户端。 (IOW,我甚至无法确认c3p0完全使用服务器端预处理语句)。我该怎么控制呢?

关于相关问题的答案

  

Connector / J驱动程序在本地处理预准备语句,除非使用连接参数useServerPrepStmts = true打开实际服务器端语句。

1 个答案:

答案 0 :(得分:1)

c3p0实现了自己的PreparedStatement缓存,如果您通过设置非零maxStatementsmaxStatementsPerConnection来启用它。这就是你所描述的"客户端" - PreparedStatements缓存在DataSource中。

如果您的DBMS在服务器端实现了某种类型的PreparedStatement缓存,那么您需要在DBMS中配置它。 (如果您的JDBC驱动程序使用非标准配置来启用此功能,请指向一些文档,我可能会解释如何通过c3p0将其传递给驱动程序。)c3p0只能通过标准使用Connection对象JDBC。如果对prepareStatement(...)的调用悄悄地返回缓存的对象,那么c3p0也将返回。

如果您的DBMS支持这样的功能,那么保持禁用c3p0语句缓存(默认值为maxStatements == maxStatementsPerConnection == 0)并使用JDBC驱动程序或服务器缓存可能是有意义的。但最终它是一个经验问题,无论你的dbms / JDBC驱动程序的缓存,c3p0,或两者,或两者都不是最好的。您应该能够以任何方式配置事物。