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

为带有连接池的Select SQL准备的语句

蓬高谊
2023-03-14

在连接池中为selectsql使用Prepared语句是否良好。(在我的例子中,我使用Tomcat JDBC连接池)

它是否增加了任何优势(加速),或者会增加维护准备好的语句和连接的开销,并使它们保持活动状态,或者跟踪是否关闭池连接,因为池连接是在内部维护的,并且它们会根据此处指定的不同设置关闭

我正在使用DataSource获取连接,数据库是MariaDB

在阅读各种帖子、文档和示例时,大多数准备好的语句都是使用插入更新查询构建的。它是否指出对于选择不会增加任何优势?


共有2个答案

潘宝
2023-03-14

如果可以,最好使用PreparedStatement

  • 防止SQL注射
  • 抽象日期/时间表示
  • 处理Charset转换
  • 可读性(你看到一个字符串SQL)
  • 因为SQL保持恒定数据库可能会缓存该计划,而不必重新解析

如果出现选择的情况,原因的主要焦点在于传递到WHERE条件中的参数。

至于性能:这可能取决于-但我从未体验过PreparedStatements比simpleStatements差得多-如果编码正确的原因。

事实上,您正在共享连接并没有增加太多。不知何故,“准备好你将在该连接上需要的所有语句以备将来使用”的概念并不是如何使用PreparedStatements。一遍又一遍地准备相同的小语句是非常好的,尽管如果遇到INSERTs或UPDATEs循环,最好重用PreparedStatement和/或批处理INSERTs

颜博达
2023-03-14

MariaDB/MySQL预处理语句在查询解析/优化方面没有任何优势,查询计划没有像在其他一些SQL数据库上那样保留。

当涉及到传输结果集时,它们确实具有性能优势,因为列值可以以二进制形式传输并立即存储到结果变量中。对于经典的非准备语句,所有结果字段都在服务器端转换为文本形式。这增加了服务器端的流转时长,导致更多的字节必须通过线路传输,并且根据您的应用程序需求,客户端可能需要将值从文本形式转换回二进制形式(例如整数和浮点值)。

使用预处理语句的另一个原因(也在前面的评论中提到)是,它是防止SQL注入的可靠方法,适用于SELECT以及INSERT/UPDATE/DELETE

 类似资料:
  • 可能重复: dbcp中的已准备语句池 我正在构建一个Web应用程序,它使用Tomcat的数据库连池机制进行内部使用。我试图汇集准备好的语句,以便应用程序在检索数据时更有效。 据我所知,当连接、结果集和语句关闭时,连接将返回到池。如果设置了适当的标志,放弃的连接也会关闭并返回到池中。关闭连接意味着释放所有数据库游标和缓存的语句,包括准备好的语句。那么准备好的语句池有什么意义呢?

  • 我有一个搜索查询,它必须使用包含搜索搜索表中的一列。列上有CTXSYS.Context类型索引。当使用prepared语句在表中获取数据时,搜索查询不能处理像-、/、_等特殊字符。

  • 我将游标声明放在准备好的语句中,然后执行它,然后返回一个

  • 问题内容: 我总是发现很难编写MySQLi预备语句,因为许多函数的工作方式与旧方法不同。现在我面临一个问题。 问题答案: 您正在尝试通过以下方式获取结果 事实并非如此。因为execute将仅返回布尔值。 做喜欢的。

  • 我使用SpringBoot(V2.3.0.Release)、JPA和Hibernate(带有MySQL数据库)。总的来说,我需要努力提高表演。 是否需要手动配置(同时添加依赖项)连接池?