当前位置: 首页 > 知识库问答 >
问题:

用MySQL和JDBC准备语句缓存

邢博学
2023-03-14

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

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

在使用MySQL作为我的数据库的同时,我甚至应该在JDBC连接级别使用语句缓存吗?我正在使用Hikari数据库连接池与Mysql JDBC连接器。

共有1个答案

权浩邈
2023-03-14

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

cachePrepStmts=true&useServerPrepStmts=true

虽然我不是微基准的狂热粉丝,但这里有一个支持我的声明(本意是蹩脚的双关语)。该基准测试的有趣之处在于,它表明启用服务器端缓存实际上可能会在没有某些客户端缓存的情况下减慢速度,但是启用两层缓存以及正确重用准备好的语句之后,您实际上可能会获得很好的速度。

 类似资料:
  • 我一直在读一些较新的JDBC连接池(如Tomcat)不支持客户端语句池。我已经读到,这是因为大多数JDBC驱动程序都维护自己的语句缓存。然而,我不认为PostgreSQL会发生这种情况。 我说的对吗?如果是这样,我应该使用一个连接池来缓存准备好的语句,以获得最佳的批插入性能吗? 谢谢

  • 我正在使用我生成的一个准备好的语句,但在Java抛出的语句上出现了语法错误。然而,当我将PS的toString复制并粘贴到数据库的phpmyadmin中时,它的执行完美无缺。有什么想法会出错吗,我很难理解? 编辑:更改为PS.ExecuteUpdate(查询);还是不起作用。

  • 问题内容: 我在程序中尝试了准备好的语句,但是没有用。 注释的部分是“准备报表”部分。当我将其更改为常规语句时,一切都正确。 有人可以告诉我我想念什么吗? 非常感谢。 问题答案: 尝试从查询中删除并在添加参数后使用:

  • 我有一个类,其中我使用旧的jdbc方法创建了到h2数据库的连接,该方法编写url并获取连接,我在数据库中创建了一个表,这个表不是java对象,所以我用尽了聪明的方法来为我的方法编写测试 //我还创建了一个表app_user公共void addUser(连接连接,字符串登录,字符串密码,字符串描述)抛出SQLException{ 而我的测试方法看起来像这样,有没有办法让它不那么整洁,更简单,我试图用

  • 问题内容: 我使用准备好的语句编写了select语句。每次尝试运行它都会出现此错误。我如何克服这个错误?我的jdbc连接器是mysql-connector- java-5.1.13-bin.jar。我的代码: 错误代码.. 2013年10月1日,下午1:23:23 sanin.lands.model.View_ads_cls getAdDetail 问题答案: 错误在这一行 这样做

  • 问题内容: 我想知道有什么区别,何时使用,和。 每种方法的最佳实践和典型方案是什么? 问题答案: 声明与PreparedStatement 使用PreparedStatement可以提高性能,但它取决于数据库。 使用PreparedStatement可以避免SQL注入。PreparedStatement如何避免或阻止SQL注入? 使用setInt,setString和prepareStatemen