天道酬勤,学无止境

获取结果集时的 Oracle JDBC 内存分配(Oracle JDBC memory allocation while fetching a resultset)

问题

如果我有一个包含三列的表格,

NAME (VARCHAR2 20), AGE (NUMBER), LOCATION (VARCHAR2 50)

Oracle JDBC 驱动程序在获取结果之前分配了多少内存?

如果fetch size设置为100 ,即使查询仅返回10条记录,驱动程序是否会为所有100条记录分配内存?

谢谢

回答1

Oracle 数据库 JDBC 驱动程序,12 之前的版本:

在执行查询之前,驱动程序为每列分配最大fetchSizefetchSize的行数。

例如,对于VARCHAR(4000)列,它将分配 8k 字节乘以fetchSize


版本 12(及更高版本):

在执行查询之前,它在fetchSize中为每列每行分配大约 15 个字节。 执行后,版本 12 中的驱动程序仅分配存储实际行数据所需的数量。

因此,版本 12 驱动程序使用的内存通常比早期版本的驱动程序少得多。


你的例子

在您的示例中, VARCHAR(20)可以大到 40 个字节,一个NUMBER可以大到 22 个字节,而VARCHAR(100)可以大到 100 个字节。 将fetchSize设置为 100 时,旧驱动程序将分配(40 + 22 + 100) * 100 = 16k 。 版本 12 驱动程序将分配3 * 15 * 100 = 4.5k 。 我忽略的两个驱动程序都有额外的开销。

回答2

Oracle 驱动程序分配fechtsize * max. size of one row fechtsize * max. size of one row

在您的情况下,这将是 40 个字节(= UTF-16 中的 20 个字符)+ 22 个字节 + 100 个字节(= UTF-16 中的 100 个字符)* 100。总共大约 16kb(可能更多)

这实际上是驱动程序唯一的选择:如果您请求驱动程序通过网络发送 100 行,它必须分配足够的内存才能在内存中保存这 100 行。 这意味着它必须假设最坏的情况并为每列保留最大长度。

从服务器接收到数据后,它只会在转换为正确的 Java 对象后占用所需的内存。

您可以想象获取大小以分配在检索操作期间使用的缓冲区。 类似于例如 BufferedInputStream

回答3

您可以深入了解:http://www.oracle.com/technetwork/database/application-development/t-12c-1964666.pdf

如您所见,它取决于 JDBC 驱动程序的版本、驱动程序配置(是否启用 Prepare Statement Cache、您通过 -D 选项传递的参数)以及许多其他因素。

它甚至取决于您的应用程序中的其他 SQL 语句。

在最好的情况下,驱动程序不会分配任何内存,而只是重用先前调用相同或不同语句的缓冲区(当然取决于许多因素)。

在最坏的情况下,将分配尽可能多的内存量,以通过您已经在准备语句缓存中的其他 SQL 语句调用获取数据(对于 Oracle JDBC < 11.2)

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇
    3. JVM监控及诊断工具-GUI篇3.1. 工具概述使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限:1.无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。2.要求用户登录到目标 Java 应用所在的宿主机上,使用起来不是很方便。3.分析数据通过终端输出,结果展示不够直观。为此,JDK提供了一些内存泄漏的分析工具,如jconsole,jvisualvm等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。所以这里我们介绍的工具相对多一些、丰富一些。JDK自带的工具jconsole:JDK自带的可视化监控工具。查看Java应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等Visual VM:Visual VM是一个工具,它提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。JMC:Java Mission Control,内置Java Flight Recorder。能够以极低的性能开销收集Java虚拟机的性能数据。第三方工具MAT:MAT(Memory Analyzer Tool)是基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具
  • <JVM下篇:性能监控与调优篇>03-JVM监控及诊断工具-GUI篇
    3. JVM监控及诊断工具-GUI篇3.1. 工具概述使用上一章命令行工具或组合能帮您获取目标Java应用性能相关的基础信息,但它们存在下列局限:1.无法获取方法级别的分析数据,如方法间的调用关系、各方法的调用次数和调用时间等(这对定位应用性能瓶颈至关重要)。2.要求用户登录到目标 Java 应用所在的宿主机上,使用起来不是很方便。3.分析数据通过终端输出,结果展示不够直观。为此,JDK提供了一些内存泄漏的分析工具,如jconsole,jvisualvm等,用于辅助开发人员定位问题,但是这些工具很多时候并不足以满足快速定位的需求。所以这里我们介绍的工具相对多一些、丰富一些。JDK自带的工具jconsole:JDK自带的可视化监控工具。查看Java应用程序的运行概况、监控堆信息、永久区(或元空间)使用情况、类加载情况等Visual VM:Visual VM是一个工具,它提供了一个可视界面,用于查看Java虚拟机上运行的基于Java技术的应用程序的详细信息。JMC:Java Mission Control,内置Java Flight Recorder。能够以极低的性能开销收集Java虚拟机的性能数据。第三方工具MAT:MAT(Memory Analyzer Tool)是基于Eclipse的内存分析工具,是一个快速、功能丰富的Java heap分析工具
  • Oracle下如何处理大额事务?(How to handle large transactions under Oracle?)
    问题 我们的应用程序基于 Hibernate 3.5、Spring 3.1 和 Oracle 下,我一直遇到 Max Cursors Exceeded 问题,主要是在处理大型事务时(涉及的实体数量很大,执行的查询数量很大)。 在 H2、MS SQL Server 或 MySQL 上运行应用程序时不会出现此类问题。 如果我正确理解了我的调查结果,Oracle 会为事务期间构建的每个 ResultSet 创建一个游标,并且这些游标仅在对Connection (即休眠会话)调用close时释放。 我的问题(暂时): 有没有办法让 Oracle 在事务进行时清理游标? 在事务中的特定点之后不需要很多查询结果,但 Oracle 似乎保持游标打开。 是否有“正常”最大光标设置? 默认值为 50,我们的大多数客户都设置了 400-600 个游标,但我看到的一些论坛帖子似乎表明几千个更常见。 当我们建议将最大游标数增加到(比如)5000 时,我们似乎也从我们的客户 DBA 那里得到了很多反对。这真的有这么大吗? 坦率地说,我读过的大多数论坛帖子都与 ResultSet/Statement/Connection 泄漏有关,但根据我们的分析,我们没有它们; 当我们关闭连接时,当前游标计数恢复正常。 我们似乎是唯一在尝试在单个事务中执行几百个操作时遇到问题的人。 真的有这么不正常吗? 感谢您的任何建议;
  • Statement.setFetchSize(nSize)方法在SQL Server JDBC驱动程序中真正做什么?(What does Statement.setFetchSize(nSize) method really do in SQL Server JDBC driver?)
    问题 我有一个非常大的表,每天有数百万条记录,并且每天结束时我都会提取前一天的所有记录。 我这样做是: String SQL = "select col1, col2, coln from mytable where timecol = yesterday"; Statement.executeQuery(SQL); 问题在于该程序占用了大约2GB的内存,因为它将所有结果存入内存,然后对其进行处理。 我尝试设置Statement.setFetchSize(10)但它从OS占用的内存完全相同,没有任何区别。 我为此使用Microsoft SQL Server 2005 JDBC驱动程序。 有什么方法可以像在执行查询仅显示几行并且向下滚动显示更多结果时一样读取Oracle数据库驱动程序中的小块结果吗? 回答1 在JDBC中, setFetchSize(int)方法对于JVM中的性能和内存管理非常重要,因为它控制从JVM到数据库的网络调用数量,并相应地控制用于ResultSet处理的RAM数量。 本质上,如果调用setFetchSize(10)且驱动程序忽略了它,则可能只有两个选项: 尝试使用其他将遵循fetch-size提示的JDBC驱动程序。 查看Connection上特定于驱动程序的属性(创建Connection实例时的URL和/或属性映射)。 RESULT
  • JDBC分页(JDBC Pagination)
    问题 我想使用JDBC实现分页。 我想知道的实际事情是“如何分别从数据库中获取第1页和第2页的前50条记录,然后再获得50条记录” 我的查询是Select * from data [数据表包含20,000行] 对于第1页,我获得了50条记录,对于第2页,我想获得了下50条记录。 如何在JDBC中有效地实现它? 我搜索发现rs.absolute(row)是跳过首页记录的方法,但是在大型结果集上花费一些时间,我不想花这么多时间。 另外,我不想在查询中使用rownum和limit + offset ,因为这些在查询中不太好使用,我不知道为什么,仍然不想在查询中使用它。 谁能帮助我如何获得有限的ResultSet进行分页,或者JDBC有什么方法给我们? 回答1 没有简单的使用JDBC的有效方法。 您必须将限制设置为n行,并从第i个项目子句直接开始到SQL,这样才能有效。 根据数据库的不同,这实际上可能很容易(请参阅MySQL的LIMIT -keyword),而在其他数据库(如Oracle)上则可能会比较棘手(涉及子查询并使用rownum伪列)。 请参阅此JDBC分页教程:http://java.avdiel.com/Tutorials/JDBCPaging.html 回答2 您应该仅查询实际需要显示在当前页面上的数据。 不要将整个数据集拖入Java的内存中,然后在此处进行过滤。
  • java.lang.OutOfMemoryError:(java.lang.OutOfMemoryError:)
    问题 我正在尝试从从数据库中检索到的字节创建视频文件。 该程序在几个小时前运行良好。 上传大文件后,当我尝试检索它时,它产生错误java.lang.OutOfMemoryError: 我的代码是: conn = prepareConnection(); StringBuilder sb=new StringBuilder(1024); sb.append("select videoname,videoid,videofull from ").append(uname.trim()).append("video"); String sql=sb.toString(); stmt = conn.prepareStatement(sql); ResultSet rs = stmt.executeQuery(); while(rs.next()){ byte[] videoData = rs.getBytes("videofull"); //#57 int vid=rs.getInt("videoid"); StringBuilder sb1 = new StringBuilder(); sb1.append(vid); String videoid=sb1.toString(); String vname=rs.getString("videoname"); File file=new
  • 为什么我不应该将所有仅用于PL / SQL的VARCHAR2设置为32767字节?(Why shouldn't I make all my PL/SQL-only VARCHAR2 32767 bytes?)
    问题 还是我应该? (标题的灵感来自Gary Myers在“为什么Oracle varchar2具有强制大小作为定义参数?”中的评论。) 请考虑以下变量: declare -- database table column interfacing variable v_a tablex.a%type; -- tablex.a is varchar2 -- PL/SQL only variable v_b varchar2(32767); -- is this a poor convention ? begin select a into v_a from tablex where id = 1; v_b := 'Some arbitrary string: ' || v_a; -- ignore potential ORA-06502 insert into tabley(id, a) values(1, v_a); -- tablex.a and tabley.a types match v_b := v_b || ' More arbitrary characters'; end; / 变量v_a用于连接数据库表列,因此使用%type属性。 但是,如果我知道数据类型是varchar2为什么不使用varchar2(4000)或varchar2(32767
  • 如何从巨大的表中读取所有行?(How to read all rows from huge table?)
    问题 我在处理数据库(PostgreSQL)中的所有行时遇到问题。 我收到一个错误: org.postgresql.util.PSQLException: Ran out of memory retrieving query results. 我认为我需要一小部分地读取所有行,但是它不起作用-它只能读取100行(下面的代码)。 怎么做? int i = 0; Statement s = connection.createStatement(); s.setMaxRows(100); // bacause of: org.postgresql.util.PSQLException: Ran out of memory retrieving query results. ResultSet rs = s.executeQuery("select * from " + tabName); for (;;) { while (rs.next()) { i++; // do something... } if ((s.getMoreResults() == false) && (s.getUpdateCount() == -1)) { break; } } 回答1 在PostgreSQL中使用CURSOR或让JDBC驱动程序为您处理。 处理大型数据集时,LIMIT和OFFSET会变慢。
  • Hibernate 自定义类型以避免'Caused by: java.sql.SQLException: Stream has been closed'(Hibernate custom type to avoid 'Caused by: java.sql.SQLException: Stream has already been closed')
    问题 如何编写自定义 Long 类来处理 Oracle 中的 long 值,以避免出现以下错误? 引起:java.sql.SQLException:流已经关闭。 谢谢 回答1 Oracle 建议不要使用Long和Long Raw列(从 Oracle 8i 开始)。 它们仅出于遗留原因包含在 Oracle 中。 如果你真的需要使用它们,你应该在尝试接触ResultSet中的任何其他列之前首先处理这些列: 文档: 当查询选择一个或多个 LONG 或 LONG RAW 列时,JDBC 驱动程序以流模式将这些列传输到客户端。 在调用 executeQuery 或 next 之后,LONG 列的数据正在等待读取。 不要创建带有 LONG 列的表。 请改用大对象 (LOB) 列、CLOB、NCLOB 和 BLOB。 支持 LONG 列只是为了向后兼容。 Oracle 建议您将现有的 LONG 列转换为 LOB 列。 LOB 列受到的限制比 LONG 列少得多。 至于休眠 - 请参阅此问题。 回答2 以下内容没有回答原始问题“如何编写自定义 Long 类来处理 Oracle 中的长值”,但可能有助于在查询 Oracle 长原始列时避免“流已关闭”错误。 我们使用旧数据库遇到了这个错误,而没有机会更改列类型。 我们将 Spring 与 hibernate3 会话工厂和事务管理器一起使用。
  • 从大表中检索所有记录时,如何避免OOM(内存不足)错误?(How to avoid OOM (Out of memory) error when retrieving all records from huge table?)
    问题 我得到了一个将巨大的表转换为自定义XML文件的任务。 我将使用Java来完成这项工作。 如果我只是发出“ SELECT * FROM customer”,它可能会返回大量数据,这些数据最终会导致OOM。 我想知道,有没有一种方法可以立即处理记录,一旦可用,就可以在sql检索过程中从内存中删除记录? ---于2009年7月13日编辑 让我详细说明我的问题。 我有1个数据库服务器和1个应用程序服务器。 当我在应用程序中发出选择查询时,数据将从数据库服务器传播到应用程序服务器。 我相信(如果我错了,请纠正我)ResultSet将需要等待,直到接收到查询中的所有记录。 即使将获取大小设置为4,对于1000条记录的表,我们仍然在应用程序服务器的堆内存中仍然有1000条记录,对吗? 访存大小仅影响往返数据库服务器的往返次数。 我的问题是,如何在到达应用服务器后立即开始处理这4个(或任何数量)记录,并将其处置以释放应用服务器中的内存? 回答1 我认为您可以使用与此解决方案相同的解决方案。 可滚动的结果集。 回答2 有了更多的信息,我可以获得更有用的答案。 如果您使用的是MySQL: stmt = conn.createStatement(java.sql.ResultSet.TYPE_FORWARD_ONLY, java.sql.ResultSet.CONCUR_READ_ONLY)
  • 在带有 Java/JDBC 的 Oracle PL/SQL 中使用游标并获取结果(Using cursors and getting result in Oracle PL/SQL with Java/JDBC)
    问题 我有一个像这样构造的 PL/SQL 查询: DECLARE a NUMBER; B NUMBER; CURSOR cursor IS ( SOME SELECT QUERY); BEGIN OPEN cursor; LOOP SOME STUFF; END LOOP; CLOSE cursor; END 如何使用 jdbc 从 java 代码运行此查询并获取结果集? 我尝试在不使用游标的情况下运行查询,并且它运行正常。 我想不出在java代码中做到这一点的方法。 如果我直接在 oracle 客户端上运行查询,它就没有问题。 所以查询没有问题。 PS我不想将代码存储为存储过程并由于某些限制而调用它。 回答1 这不可能。 您不能从匿名 PL/SQL 块返回结果集(因此无法从 JDBC 获取它)。 您将需要直接从 JDBC 运行选择。 唯一的,非常丑陋的解决方法是使用dbms_output.put_line()和之后的读取。 但这是一个非常丑陋的技巧,直接在 JDBC 中处理 SELECT 查询的结果要好得多。 编辑 1 这是一个使用 dbms_output 的小例子: Connection con = ....; // turn on support for dbms_output CallableStatement cstmt = con.prepareCall("{call
  • 如何在Java中存储配置文件?(How to memory profile in Java?)
    问题 我仍在学习Java的绳索,如果对此有明确的答案,对不起。 我有一个占用大量内存的程序,我想找到一种减少其使用量的方法,但是在阅读了很多SO问题之后,我认为我需要在开始优化它之前证明问题出在哪里。 所以这就是我的工作,我在程序的开始处添加了一个断点并运行它,然后启动visualVM并对其进行了内存配置(我在netbeans中也做了同样的事情,只是为了比较结果,它们是相同的)。 我的问题是我不知道如何阅读它们,我只说了char[]就得到了最高的区域,而且我看不到任何代码或任何内容(这很有意义,因为visualvm正在连接到jvm,并且看不到我的代码。源代码,但是netbeans也不会像执行cpu分析时那样向我显示源代码。 基本上我想知道的是所有内存都在使用哪个变量(以及希望有更多详细信息,例如哪种方法),因此我可以专注于在那里工作。 有一个简单的方法可以做到这一点吗? 我现在正在使用eclipse和java进行开发(并安装了专门用于性能分析的visualVM和netbeans,但愿意安装您认为可以完成这项工作的其他任何东西)。 编辑:理想情况下,我正在寻找一种可以容纳所有对象并按大小对它们进行排序的东西(这样我就可以看到哪一个正在占用内存)。 当前,它返回诸如string []或int []之类的通用信息,但我想知道其引用的对象,因此我可以进一步优化其大小。 回答1 字符串有问题
  • Oracle体系结构之内存结构(SGA、PGA)
    Oracle体系结构之内存结构(SGA、PGA) 一、内存结构 SGA(System Global Area):由所有服务进程和后台进程共享; PGA(Program Global Area):由每个服务进程、后台进程专有;每个进程都有一个PGA。二、SGA 包含实例的数据和控制信息,包含如下内存结构: 1)Database buffer cache:缓存了从磁盘上检索的数据块。 2)Redo log buffer:缓存了写到磁盘之前的重做信息。 3)Shared pool:缓存了各用户间可共享的各种结构。 4)Large pool:一个可选的区域,用来缓存大的I/O请求,以支持并行查询、共享服务器模式以及某些备份操作。 5)Java pool:保存java虚拟机中特定会话的数据与java代码。 6)Streams pool:由Oracle streams使用。 7)Keep buffer cache:保存buffer cache中存储的数据,使其尽时间可能长。 8)Recycle buffer cache:保存buffer cache中即将过期的数据。 9)nK block size buffer:为与数据库默认数据块大小不同的数据块提供缓存。用来支持表空间传输。 database buffer cache, shared pool, large pool, streams
  • Oracle体系结构之内存结构(SGA、PGA)
    Oracle体系结构之内存结构(SGA、PGA) 一、内存结构 SGA(System Global Area):由所有服务进程和后台进程共享; PGA(Program Global Area):由每个服务进程、后台进程专有;每个进程都有一个PGA。二、SGA 包含实例的数据和控制信息,包含如下内存结构: 1)Database buffer cache:缓存了从磁盘上检索的数据块。 2)Redo log buffer:缓存了写到磁盘之前的重做信息。 3)Shared pool:缓存了各用户间可共享的各种结构。 4)Large pool:一个可选的区域,用来缓存大的I/O请求,以支持并行查询、共享服务器模式以及某些备份操作。 5)Java pool:保存java虚拟机中特定会话的数据与java代码。 6)Streams pool:由Oracle streams使用。 7)Keep buffer cache:保存buffer cache中存储的数据,使其尽时间可能长。 8)Recycle buffer cache:保存buffer cache中即将过期的数据。 9)nK block size buffer:为与数据库默认数据块大小不同的数据块提供缓存。用来支持表空间传输。 database buffer cache, shared pool, large pool, streams
  • 骆驼 jdbc 内存不足异常(camel jdbc out of memory exception)
    问题 我正在尝试将数据从 postgres 摄取到另一个数据库,并且我正在使用camel-jdbc 组件来执行此操作。 我有一个大表,所以我想一次读取几行而不是整个表。 所以我的路线如下所示(仅用于测试目的) from(fromUri).setBody("select * from table limit 10").to("jdbc://myDataSource?resetAutoCommit=false&statement.fetchSize=2").split( body()).streaming().process(test) 如上所示,出于测试目的,我一次仅获取 10 行,并且我已将 fetchSize 设置为 2 以一次仅接收 2 行。 但是,我仍然总共收到所有 10 行。 当我从查询中删除“limit 10”时,我在 split 命令之前出现内存不足错误,该错误告诉我它试图将整个结果集加载到内存中。 我在这里错过了什么或者我做错了什么? 感谢帮助。 回答1 我认为 fetchSize 更像是对 JDBC 驱动程序的提示。 您可以使用 maxRows 选项来真正限制服务器端,例如statement.maxRows=2 。 您可以在 JDBC javadoc 文档中阅读有关这些选项的更多信息。 https://docs.oracle.com/javase/7/docs
  • Oracle JDBC 预取:如何避免耗尽 RAM/如何使 oracle 更快高延迟(Oracle JDBC prefetch: how to avoid running out of RAM/how to make oracle faster high latency)
    问题 使用 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
  • 面试官:聊聊java中线程的生命周期
    面试官:你好,聊一聊java中线程的生命周期? 我:在java的Thread类中,定义了一个名字叫State的枚举类,里面有6个状态,NEW、RUNNABLE、BLOCKED、WAITING、TIMED_WAITING和TERMINATED,这6个状态就贯穿在线程的整个生命周期当中。public enum State { /** * Thread state for a thread which has not yet started. */ NEW, /** * Thread state for a runnable thread. A thread in the runnable * state is executing in the Java virtual machine but it may * be waiting for other resources from the operating system * such as processor. */ RUNNABLE, /** * Thread state for a thread blocked waiting for a monitor lock. * A thread in the blocked state is waiting for a monitor lock * to enter a
  • Oracle结果集缓存(Result Cache)--服务器、客户端、函数缓存
    Oracle结果集缓存(Result Cache)--服务器、客户端、函数缓存在11g中,Oracle提供了结果集缓存特性。该缓存是在共享内存中存储全部的结果集,如果一个查询SQL被执行,且它对应的结果集在缓存中,那么,该SQL的几乎全部开销都可以避免。这些开销包括,解析时间、逻辑读、物理读和任意的通常可能会遭遇的争用。但是,在实际的情况中,结果集缓存仅在少数的情况下是有效的,原因有如下几点: (1)有数据重叠的多个SQL会在缓存中保存冗余的数据。 (2)对依赖对象的任何改变(包括对查询中引用的任意表)都会使整个缓存的结果集变为无效,结果集缓存最适合那些只读或接近只读的表。 (3)大的结果集要么是因为结果集缓存太少不能放入,要么会强迫缓存中所有已存在的条件换出。为了防止这种情况发生,我们必须限制结果集缓存仅用于较小的结果集。 (4)在缓存中快速并发的结果集的创建可能会导致结果集闩锁的争用。因此,结果集缓存的内容必须变得相对慢一些。结果集缓存由如下一些参数控制: result_cache_mode :该参数用来控制结果集缓存的操作模式。OFF表示禁用,MANUAL表示只有使用了result_cahce提示的查询或对带有result_cache(mode force)属性的表访问的查询才会被缓存。FORCE表示所有合适的查询都会被缓存。 result_cache_max_size
  • Oracle JDBC memory allocation while fetching a resultset
    If I have a table with three columns, NAME (VARCHAR2 20), AGE (NUMBER), LOCATION (VARCHAR2 50) how much memory does Oracle JDBC driver allocate before fetching the result? If the fetch size is set at 100, does the driver allocate memory for all 100 records even if the query returns only 10? Thanks
  • java.sql.SQLException:-ORA-01000:已超过最大打开游标(java.sql.SQLException: - ORA-01000: maximum open cursors exceeded)
    问题 我收到了ORA-01000 SQL异常。 因此,我对此有一些疑问。 最大打开游标是否与JDBC连接的数量完全相关,还是与我们为单个连接创建的语句和结果集对象相关? (我们正在使用连接池) 有没有一种方法可以配置数据库中的语句/结果集对象的数量(如连接)? 是否建议在单线程环境中使用实例变量statement / resultset对象而不是方法local statement / resultset对象? 在循环中执行准备好的语句是否会导致此问题? (当然,我本可以使用sqlBatch的)注:一旦循环结束,pStmt将关闭。 { //method try starts String sql = "INSERT into TblName (col1, col2) VALUES(?, ?)"; pStmt = obj.getConnection().prepareStatement(sql); pStmt.setLong(1, subscriberID); for (String language : additionalLangs) { pStmt.setInt(2, Integer.parseInt(language)); pStmt.execute(); } } //method/try ends { //finally starts pStmt.close() } /