当前位置: 首页 > 面试题库 >

PreparedStatement,CallableStatement和性能注意事项

邵轶
2023-03-14
问题内容

我有一个html" target="_blank">oracle stored proc需要从我的Java程序调用的功能。我曾经CallableStatement将参数传递给存储的proc。我正在使用oracle瘦驱动程序(在Web逻辑服务器中根据相关的jndi条目配置)。此存储的proc没有任何OUT值。此存储的proc接受一个数字值,并根据接收到的值在db中进行很多更新。

我得到一个连接对象,然后在循环中调用此存储的proc(20次传递20个数字)。当我直接从oracle客户端调用此存储的proc时,执行将在2-3秒内完成。但是,从我的Java代码中无法预测到该行为。有些通话甚至需要30-40秒才能完成。

我尝试使用PreparedStatement代替,CallableStatement并且可以看到边际性能的提高(尽管行为仍然不一致)。

  1. 在我的情况下可以使用,PreparedStatement而不是CallableStatement给定storeproc没有任何OUT参数吗?
  2. 有什么原因可以PreparedStatement使性能有所提高,CallableStatement还是我可能会错误地观察到它?
  3. 有没有更好的方法来解决此性能问题?

问题答案:

根据您的评论,您可以在循环中添加prepareCall。预备语句(和可调用语句)的一个优点是您可以准备一次,然后换出在参数中传递的值。每次准备调用时都会有开销,因此,如果您可以将其带出循环,则可能会发现运行时间减少了。您可能会发现,关闭AutoCommit也有帮助,因为每次提交都有开销。

conn.setAutoCommit(false);
CallableStatement stmt = conn.prepareCall(sql);
while(true) {
    stmt.setInt(1, value);
    stmt.execute();
}
conn.commit();
conn.setAutoCommit(true);

conn.setAutoCommit(true)的确提交,但我发现更明确了)。



 类似资料:
  • C++ 程序员偏爱性能,所以这里是一个性能专题。 由于 Hana 运行时和编译时计算处于前沿领域,我们不仅对运行时性能感兴趣,而且对编译时性能也感兴趣。 由于这两个主题是相当不相交的,我们在下面分别对待。 注意: 当我们推送到存储库时,本节中提供的基准会自动更新。 如果您发现不能承受此处声明的结果,请开一个GitHub issue; 它可能是一个性能回归。 警告: 在写这篇文章的时候,并不是所有的

  • 主要内容:1. Statement对象,2. PreparedStatement对象,3. CallableStatement对象,关闭CallableStatement对象当获得了与数据库的连接后,就可以与数据库进行交互了。 JDBC ,和接口定义了可用于发送SQL或PL/SQL命令,并从数据库接收数据的方法和属性。 它们还定义了有助于在Java和SQL数据类型的数据类型差异转换的方法。 下表提供了每个接口定义,以及使用这些接口的目的的总结。 接口 推荐使用 用于对数据库进行通用访问,在运行时

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

  • 问题内容: 所有, 谁能让我确切知道两者之间的性能问题?站点:CodeRanch简要概述了使用keySet()和get()时需要的内部调用。但是如果使用keySet()和get()方法时,任何人都可以提供有关流的确切详细信息,那将是很好的。这将帮助我更好地了解性能问题。 问题答案: 首先,这完全取决于您使用的地图类型。但是,由于JavaRanch线程讨论了HashMap,因此我假设这就是您所指的实

  • 我正在使用Cognito,API Gateway和Authorers。授权方配置为缓存 5 分钟以提高性能。我觉得这是一个不错的功能。 我知道授权者是将身份验证逻辑保存在一个地方的好方法,并且应用程序可以假设用户已经获得授权。然而,我对此表示怀疑。 pentest报告建议,一旦注销,令牌就不能使用。这意味着为了安全起见,我不应该启用授权缓存?这也意味着所有经过身份验证的API都将有一个lambda

  • Dockerfile最佳实践 与使用的其他任何应用程序一样,总会有可以遵循的最佳实践。你可以阅读更多有关 Dockerfile 的最佳实践。以下是我们列出的基本的 Dockerfile 最佳实践: 保持常见的指令像 MAINTAINER 以及从上至下更新 Dockerfile 命令。 当构建镜像时使用可理解的标签,以便更好地管理镜像。 避免在 Dockerfile 中映射公有端口。 CMD 与 E