- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我调查了很多地方,听到了很多可疑的说法,从 PreparedStatement
应该比 Statement
更受欢迎,即使只是为了性能优势;一路声称 PreparedStatement
应该专门用于批处理语句,而不是其他。
但是,我关注的(主要是在线的)讨论似乎存在盲点。让我展示一个具体的场景。
我们有一个带有数据库连接池的 EDA 设计的应用程序。事件来了,有的需要坚持,有的不需要。有些是人为生成的(例如,每 X 分钟更新/重置一些内容)。一些事件按顺序发生和处理,但其他类型的事件(也需要持久性)可以(并且将会)并发处理。
除了那些人为生成的事件之外,没有关于需要持久化的事件如何到达的结构。
此应用程序是很久以前(大约 2005 年)设计的,支持多个 DBMS。典型的事件处理程序(需要持久化的地方):
如果事件需要批处理,语句准备一次并使用addBatch
/executeBatch
方法。这是一个明显的性能优势,这些情况与此问题无关。
最近,我收到了一个意见,即准备(解析)一条语句、执行一次并关闭的整个想法本质上是对 PreparedStatement
的滥用,提供了零性能优势,无论是使用服务器还是客户端准备语句,典型的 DBMS(Oracle、DB2、MSSQL、MySQL、Derby 等)甚至不会将此类语句提升到准备语句缓存(或至少是它们的默认 JDBC 驱动程序/数据源)不会)。
此外,我不得不在 MySQL 的开发环境中测试某些场景,Connector/J usage analyzer 似乎同意这个想法。对于所有非批处理的准备好的语句,调用 close()
打印:
PreparedStatement 已创建,但使用次数不超过 1 次。一次准备语句,多次重复使用它们效率更高
由于前面概述的应用程序设计选择,拥有一个 PreparedStatement
实例缓存来保存连接池中每个连接的任何事件使用的每个 SQL 语句听起来是一个糟糕的选择。
有人可以进一步详细说明吗? 逻辑“准备-执行(一次)-关闭”是否存在缺陷并且基本上不鼓励?
附言为 Connector/J 明确指定 useUsageAdvisor=true
和 cachePrepStmts=true
并使用 useServerPrepStmts=true
或 useServerPrepStmts=false
在 每个 非批处理 SQL 语句的 PreparedStatement
实例上调用 close()
时,仍然会导致效率警告。
最佳答案
Is the logic prepare-execute [once]-close flawed and essentially discouraged?
我不认为这是一个问题,本身。给定的 SQL 语句需要在某个时刻进行“准备”,无论是显式(使用 PreparedStatement)还是“即时”(使用 Statement)。如果我们使用 PreparedStatement 而不是 Statement 来处理只会执行一次的内容,可能会产生更多的开销,但所涉及的开销不太可能很大,特别是如果您引用的语句是正确的:
typical DBMSes (Oracle, DB2, MSSQL, MySQL, Derby, etc.) will not even promote such a statement to prepared statement cache (or at least, their default JDBC driver/datasource will not).
不鼓励使用这样的模式:
for (int thing : thingList) {
PreparedStatement ps = conn.prepareStatement(" {some constant SQL statement} ");
ps.setInt(1, thing);
ps.executeUpdate();
ps.close();
}
因为 PreparedStatement 只被使用一次,而且同一个 SQL 语句被一遍又一遍地准备。 (尽管如果确实缓存了 SQL 语句及其执行计划,即使那样也不是什么大问题。)更好的方法是
PreparedStatement ps = conn.prepareStatement(" {some constant SQL statement} ");
for (int thing : thingList) {
ps.setInt(1, thing);
ps.executeUpdate();
}
ps.close();
...甚至更好,“尝试使用资源”...
try (PreparedStatement ps = conn.prepareStatement(" {some constant SQL statement} ")) {
for (int thing : thingList) {
ps.setInt(1, thing);
ps.executeUpdate();
}
}
请注意,即使不使用批处理也是如此。 SQL语句仍然只准备一次,多次使用。
关于java - 单次执行后关闭 PreparedStatement——这是设计缺陷吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33065643/
我的 slideToggle 在幻灯片切换的底部有点跳动。会不会是因为那里有一个按钮之类的。任何使它更平滑的方法。尝试使用缓动但不是很成功。有什么建议 点击视频设置自己看看 The site $(do
按照目前的情况,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
概述: 我的 B 对象是一个 100 000 * 5000 的 2 GB 大矩阵 我的 A 对象较小 1000 * 5000 analyse_with_glm <- function(Y) { c
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 6年前关闭。 Improve t
我在从 SQL Server (2008R2) 数据库中的 NVARCHAR 字段检索加密数据时遇到了问题,对于某些记录,我的 C# .NET 应用程序中数据的字符串值与数据库记录中的数据字符串值不同
我从 main.cpp 中包含两个头文件,它们在匿名命名空间中具有以下定义:const string strToken = ("%");使用 g++ 4.9 版编译结果如下: In file incl
我正在测试的代码中出现信任边界冲突。该代码在 session 中添加表单,并且由于违反信任边界而存在缺陷 Inside Struts Action class execute method { Ed
这个问题没有与之相关的实际问题,它更多的是一个好奇的问题,想知道我是否过于字面意思;)。 所以我一直在努力尽可能多地理解 c++ 标准。今天,在深入研究标准时,我注意到了这一点 (ISO/IEC 14
在我的数据库中,我必须做一个Circular Reference(cycle)来获取我想要的数据,我不知道如何重新排序表来获取我想要的数据而不需要循环. 这是我的数据库的模式(或模型)——只有表名是英
我有一个代表一组数字的类。构造函数接受三个参数: startValue 、 endValue 和 stepSize 。 该类负责保存一个列表,其中包含考虑 stepSize 的开始值和结束值之间的所有
如何删除下图中标记的三个间隙? 此代码可在 http://jsfiddle.net/69zj6smo/ 获得- 调整渲染区域的大小以查看通常存在的一些线条。 让我感到困惑的是,我认为我总是创建这样的流
double 的位格式在第一位存储符号。 double的C#哈希算法是高低32位二进制异或。 因此,当您对 double A 及其负数 -A 进行哈希处理时,哈希值的唯一区别在于第一位。 要散列多个字
当我在 Action 中使用重定向时,afterAction 方法(在 controller.php 中)不起作用!我该如何解决这个问题? 注意:我不能使用 beforeAction 因为我在我的 A
毫无疑问,还有其他可能更好的方法可以做到这一点,但我正在努力了解这里发生了什么。 在下面的示例中,coverity 在第四行报告了 FORWARD_NULL 缺陷。 double? foo = nul
我们希望针对 Jenkins 中失败的构建自动在 Jira 中创建缺陷。如果您成功完成了此操作,可以与我分享吗? 最佳答案 您应该能够使用JIRA plugin来做到这一点,以及“JIRA:创建问题”
有人能解释一下为什么 VeraCode 似乎认为使用 name 作为公共(public)属性(property)是一个坏主意,并提出了一个好的缓解措施吗? 代码(JavaScript): var Ba
我认为这是 C++11 标准中的一个(次要)缺陷。在 [dcl.dcl] 中我们有: simple-declaration: decl-specifier-seqopt init-
我做了以下... private static IDbConnectionProvider CreateSqlConnectionProvider(DbConfig dbConfig) { r
我现在在运行我的 cakephp 应用程序时遇到了很多麻烦。 在将 vom lenny 升级为 squeeze(甚至尝试完全重新安装 sqeeze)之后,imagick 的速度非常慢,以至于它只是关闭
我收到来自 Veracode 的信任边界违规。我的代码是 userName= req.getParameter(Constant.USERNAME); session.setAttribute(Con
我是一名优秀的程序员,十分优秀!