Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用MySQL准备语句缓存&;JDBC_Java_Mysql_Jdbc_Hikaricp - Fatal编程技术网

Java 使用MySQL准备语句缓存&;JDBC

Java 使用MySQL准备语句缓存&;JDBC,java,mysql,jdbc,hikaricp,Java,Mysql,Jdbc,Hikaricp,我读到MySQL不支持服务器端查询计划缓存。所以,如果我想使用PreparedStatements来提高性能,我可以做的是在JDBC连接中启用语句缓存。因此,根据文档,它将在每个连接的基础上启用准备好的语句的缓存 与MySQL使用服务器端查询计划缓存相比,JDBC连接的PreparedStatement缓存的性能提高了多少? 那么,如果在物理连接的缓存中确实找到了PreparedStatement,这是否意味着当它到达mysql服务器时,mysql不会在其上运行查询优化,而是能够直接执行它 在使

我读到MySQL不支持服务器端查询计划缓存。所以,如果我想使用PreparedStatements来提高性能,我可以做的是在JDBC连接中启用语句缓存。因此,根据文档,它将在每个连接的基础上启用准备好的语句的缓存

与MySQL使用服务器端查询计划缓存相比,JDBC连接的PreparedStatement缓存的性能提高了多少? 那么,如果在物理连接的缓存中确实找到了PreparedStatement,这是否意味着当它到达mysql服务器时,mysql不会在其上运行查询优化,而是能够直接执行它


在使用MySQL作为数据库时,我是否应该在JDBC连接级别使用语句缓存?我将Hikari数据库连接池与Mysql JDBC连接器一起使用。

其他品牌和型号的表服务器将从JDBC准备的语句中获得比Mysql更多的性能优势。例如,Oracle可以重用执行计划


但是您仍然应该在JDBC中使用准备好的语句。使用它们有很多原因,包括绑定变量时产生的注入阻力。

是的,如果您知道自己在做什么,缓存不会有什么坏处。如果按照预期重用准备好的语句(很多人忘记了最重要的部分:D),那么将客户端缓存与服务器端缓存结合起来将大大提高性能。只需正确设置属性:

cachePrepStmts=true&useServerPrepStmts=true

虽然我不太喜欢微观基准测试,但我还是要支持我的观点(这是一个蹩脚的双关语)。关于基准测试有趣的一点是,它表明启用服务器端缓存实际上可能会在没有客户端缓存的情况下降低速度,但是启用两层缓存以及正确重用准备好的语句,您实际上可以获得很好的速度。

本文作者之一。有关如何正确配置MySQL以进行预处理语句缓存的信息,请参阅。预处理语句缓存可以极大地提高SQL的速度。此外,如果将用户提供的输入连接到SQL普通语句中,它可以避免对代码的SQL注入攻击,否则这些攻击会成功。切勿编写包含用户提供的输入的SQL字符串。始终使用准备好的语句,并将用户提供的输入设置为替换值。

可以设置两个属性:

  • useServerPrepsMTS
    -启用服务器端准备语句,因为默认情况下,准备语句是在客户端模拟的
  • cacheprepsmts
    -启用语句缓存机制的
绩效结果 对于客户端语句,通过启用
cacheprepsmts
设置可以提高吞吐量,如下图所示:

而且,对于服务器端语句,还可以通过启用
cacheprepsmts
属性来提高吞吐量:

因此,语句缓存机制也适用于客户端和服务器端准备的语句

在MySQL 8.0.22和8.0.18上测试时,使用单语句和多语句事务时,客户端准备的语句的性能优于服务器端准备的语句

此外,以下配置选项似乎可以产生最佳效果:

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

设置最后两个属性是为了增加缓存限制,因为默认值对于许多数据驱动应用程序来说太低。

您使用的是什么版本的MySQL和JDBC?@emecas我使用的是MySQL connector java 5.1.18版。MySQL版本是5.7,因为我打算使用MySQL版本5中附带的InnoDB缓存插件。7@AnthonyAccioly:谢谢你的链接。但是语句缓存仍然是基于每个连接的。它比在JDBC级别进行语句缓存更好吗?两者都可以:)。另外,您的连接池将使“每个连接”缓存值得。谢谢Anthony!顺便说一句,连接器/J属性的链接无效。谢谢你的精彩节目。顺便说一句,c3p0的基准并不令人印象深刻。有一件事,为什么你们不推荐MySQL使用
useServerPrepsmts=true
?它还可以压缩一些额外的性能。Anthony,我不知道有
userServerPrepStmts
。我将把它添加到文档中,谢谢!一些简单的测试表明
userserverprepsmts=false
更快。弗拉德·米哈尔恰的故事也说明了这一点。