首页 文章

使用MySQL和JDBC准备语句缓存

提问于
浏览
5

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

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

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

3 回答

  • 2

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

    cachePrepStmts=true&useServerPrepStmts=true
    

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

  • 6

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

  • 8

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

    但是你仍然应该在JDBC中使用预处理语句 . 使用它们有很多理由,包括绑定变量所带来的注入阻力 .

相关问题