- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
使用 Oracle java JDBC (ojdbc14 10.2.x),加载包含许多行的查询需要永远(高延迟环境。这显然是 Oracle JDBC 中的默认预取是默认大小“10”,每次需要一次往返时间10 行。我试图设置一个积极的预取大小来避免这种情况。
PreparedStatement stmt = conn.prepareStatement("select * from tablename");
statement.setFetchSize(10000);
ResultSet rs = statement.executeQuery();
这可以工作,但我得到了一个内存不足的异常。我曾假设 setFetchSize 会告诉它在它们进入时缓冲“那么多行”,使用每行所需的尽可能多的 RAM。如果我运行 50 个线程,即使有 16G 的 -XMX 空间,它也会耗尽内存。感觉几乎像泄漏:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.lang.reflect.Array.newArray(Native Method)
at java.lang.reflect.Array.newInstance(Array.java:70)
at oracle.jdbc.driver.BufferCache.get(BufferCache.java:226)
at oracle.jdbc.driver.PhysicalConnection.getCharBuffer(PhysicalConnection.java:7422)
at oracle.jdbc.driver.OracleStatement.prepareAccessors(OracleStatement.java:983)
at oracle.jdbc.driver.T4CTTIdcb.receiveCommon(T4CTTIdcb.java:273)
at oracle.jdbc.driver.T4CTTIdcb.receive(T4CTTIdcb.java:144)
at oracle.jdbc.driver.T4C8Oall.readDCB(T4C8Oall.java:771)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:346)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:521)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:205)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:861)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1145)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1267)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3449)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3493)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1491)
....
我该怎么做才能仍然获得预取但不会耗尽 RAM?这是怎么回事?
SO 上最接近的相关项是:https://stackoverflow.com/a/14317881/32453
最佳答案
基本上,oracle 对于最近的 ojdbc jar 的默认策略是为每个“预取”行“预分配”一个数组,以适应从该查询可能返回的最大尺寸。对于所有行。所以在我的例子中,我有一些 VARCHAR2(4000),50 个线程(语句)* varchar2 的 3 列 * 4000 加起来超过千兆字节的 RAM,setFetchSize 为几百 [yikes]。似乎没有一个选项可以说“不要预先分配该数组,只需使用它们进来时的大小”。 Ojdbc 甚至将这些预先分配的缓冲区保留在 preparedstatements(缓存/连接)之间,以便可以重用它们。绝对是内存消耗者。
一个解决方法:使用 setFetchSize
到一些合理的数量。默认值为 10,这在高延迟连接上可能会非常慢。配置文件并仅使用尽可能高的 setFetchSize 实际上可以显着提高速度。
另一种解决方法是确定最大实际列大小,然后将查询替换为(假设 50 是已知的最大实际大小)select substr(column_name, 0, 50)
您可以做的其他事情:减少预取行数,增加 java -Xmx
参数,只选择您实际需要的列。
一旦我们能够在所有查询上使用至少 400 预取 [确保进行分析以查看哪些数字对您有利,在高延迟的情况下我们看到了预取大小 3-4K 的改进],性能显着提高。
我想,如果您想对稀疏的“非常长”的行采取真正积极的态度,那么当您遇到这些 [罕见的] 大行时,您可以重新查询。
详细信息令人作呕 here
关于java - Oracle JDBC 预取 : how to avoid running out of RAM/how to make oracle faster high latency,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28161049/
从下面的链接中读取,我相信当 Nifi 集群中的一个节点出现故障时,数据将不会被处理,直到该节点恢复运行 --- 因此由故障节点处理的流文件/数据不会被另一个节点接管集群中的节点。 https://c
我在这两篇论文中发现了“high-capacity cnn”这个短语: 1. Rich feature hierarchies for accurate object detection and se
目前我想使用来自 http://codepen.io/JaxoDI/pen/DtsdH 的评级系统.但目前它在您从右向左悬停时有效。请随意在给定的链接中尝试一下。但我想要一个从左到右悬停的评级系统。
我读过多篇文章,包括 Jon Bentley 的二分查找章节。这是我对 CORRECT 二进制搜索逻辑的理解,它在我所做的简单测试中有效: binarysearch (arr, low, high,
我的问题与下面的有点不同 CSS Float Logic .我的问题是关于 height 比这更具体的概念。 这里有规则 https://www.w3.org/TR/CSS22/visuren.htm
当我们说“高阶”函数时,我怀疑“阶”的真正含义是什么?例如,我有一个嵌入式函数调用: f.g.h 那么它叫“三阶”函数吗? “高阶”函数是静态函数累加的概念吗?然后当我有一个递归函数 f 时,在运行时
我正在研究树问题 Convert Sorted Array to Binary Search Tree - LeetCode Given an array where elements are sor
我最近将 iPhone 设备中的 iOS 升级到 12.2(为我的应用程序“Match4app”提供对最新版本的支持),这似乎与 Xcode 10.1 不兼容。我应该将 Xcode 更新到 10.2
我了解 >>> 修复了溢出:当添加两个大的正长时,您最终可能会得到一个负数。有人能解释一下这种按位移位如何神奇地解决溢出问题吗?它与 >> 有何不同? 我的怀疑:我认为这与 Java 使用二进制补码这
我有一个关于托管高流量 Rails 应用程序的问题。问题是我有 3/4 年的 Ruby on Rails 应用程序经验,但我以前从未有过高流量网站。我真的很兴奋,因为这对我和我的同事来说是“下一个层次
人们说 Delphi 在整数运算上生成了非常好的优化代码。我在 Delphi 2007 中尝试了以下示例,并看到编译器生成的汇编代码。 program p1000; {$APPTYPE CONSOLE
我目前正在构建一个混合云解决方案,需要将消息写入队列以供稍后处理。队列具有高可用性(99.999+% 的正常运行时间)是绝对必要的。 我的选择是将消息读/写到本地 ZeroMQ 高可用性对或 Azur
我正在使用 Highcharts 创建此条形图。条形的对齐方式不在部分的中间(就像第一个红色条形图不在 2016 年 1 月的中间)。是否有任何选项可以将所有栏放置在每个部分的中间? 最佳答案 我找到
我一直在阅读 Framework Design Guidelines 一书,这是一本关于在 .NET 中设计框架的书,其中摘录了框架设计者对每个部分(例如参数设计、异常处理等)所做的决定。 在参数设计
我正在尝试停止Macbook上的Apache服务器。 我尝试了以下 $ sudo apachectl stop /System/Library/LaunchDaemons/org.apache.htt
如何在高可用性中部署 apache Airflow (正式称为 airbnb 的 Airflow )调度程序? 我不是在询问显然应该在高可用性配置中部署的后端 DB 或 RabbitMQ。 我的主要关
我的内部循环包含一个计算,分析显示有问题。 这个想法是采用灰度像素 x (0 .5,x =0)-1, ... x, erf(x), ... x, tanh(x), .
我们如何定制 HighChart 的 Bubble Chart具有不同的形状。 就像我们代表 4 种不同的事件类型一样,我们不仅需要 4 种不同颜色的气泡,而且还需要每个气泡具有不同的形状,如圆形、三
刚刚注意到我在 Azure 中的文件共享存储出现“ClientOtherError”的概率非常高。他们的成功率在 50-100% 之间。 有人有任何经验可以解释为什么会这样吗? 所附图表以红色/橙色显
我是Elasticsearch的新手,遇到了一个问题,甚至在故障排除方面也遇到了困难。我的Elasticsearch(1.1.1)当前正在使CPU处于运行状态,即使没有进行搜索或建立索引也是如此。 C
我是一名优秀的程序员,十分优秀!