使用MySQL编写的语句缓存& JDBC

时间:2014-02-12 01:30:09

标签: java mysql jdbc hikaricp

我读到MySQL不支持服务器端查询计划缓存。因此,如果我想使用PreparedStatements获得性能优势,我可以做的是在JDBC Connection中启用语句缓存。因此,根据文档,它将支持基于每个连接缓存预准备语句。

与MySQL有服务器端查询计划缓存相比,JDBC连接的PreparedStatement缓存的性能提升是多少? 因此,如果确实在物理连接的缓存中找到了PreparedStatement,它是否意味着当它到达mysql服务器时,mysql不会对它运行查询优化并且能够直接执行它?

在使用MySQL作为我的数据库时,我是否应该在JDBC连接级别使用Statement缓存?我正在使用Hikari数据库连接池和Mysql JDBC连接器。

4 个答案:

答案 0 :(得分:9)

是的,如果您知道自己在做什么,缓存不会受到影响。如果您按照预期重复使用预准备语句,那么将客户端缓存与服务器端缓存Wilds性能结合起来会带来好处(许多人忘记了最重要的部分:D)。只需正确设置Connector/J properties属性:

cachePrepStmts=true&useServerPrepStmts=true

虽然我不是微观基准的忠实粉丝,here is one支持我的陈述(确实是蹩脚的双关语)。关于基准测试的有趣部分是,它表明启用服务器端缓存可能实际上减慢了一些事情而没有一些客户端缓存,但启用了两层缓存以及正确重用已准备好的语句,您实际上可以获得良好的加速

答案 1 :(得分:7)

HikariCP的作者之一。有关如何为预准备语句缓存正确配置MySQL,请参阅HikariCP wiki。准备好的语句缓存可以大大加快SQL。此外,它可以避免对您的代码进行SQL注入攻击,否则如果您将用户提供的输入连接到SQL普通语句中就会成功。 永远不要撰写包含用户提供的输入的SQL字符串。 始终使用预准备语句,并将用户提供的输入设置为替换值。

答案 2 :(得分:2)

与MySQL相比,其他品牌和型号的表服务器将为您提供JDBC预处理语句带来的更多性能优势。例如,Oracle可以重用执行计划。

但是你仍然应该在JDBC中使用预处理语句。有很多理由可以使用它们,包括通过绑定变量产生的注射阻力。

答案 3 :(得分:2)

有两个属性,你可以设置:

  • useServerPrepStmts。 - 它使服务器侧准备的语句,因为,在默认情况下,准备的语句被模仿o客户端
  • cachePrepStmts - 其使得语句缓存机制

性能结果

有关客户端语句,吞吐量通过使cachePrepStmts设定的提高,通过以下图表所示:

Client-side statement caching

和,用于服务器端语句,吞吐量也通过使改善了cachePrepStmts属性:

Server-side statement caching

因此,语句缓存机构既适用于客户端和服务器端准备的语句,以及

当在两个MySQL的8.0.22和8.0.18测试,采用单语句和多语句事务,客户端预处理语句表现好于服务器端准备的语句。​​

Therfeofre,下面的配置选项似乎产生最好的结果:

useServerPrepStmts=false
cachePrepStmts=true
prepStmtCacheSize=500
prepStmtCacheSqlLimit=1024

在最后两个特性进行设定,使得我们增加高速缓存限制为默认值的方式太低许多数据驱动的应用程序。