jdbc查询数据库时,内存是怎么分配的?
对这个问题感兴趣是因为在一次项目中,经常碰到多线程查询导出oracle数据时,发生oom。但是websphere已经设置到2G,情况依然时有发送,也没有内存泄露的情况发生。最后调试,发现fetchSize设置过大为5000,每次查询数据时,不管实际返回多少条数据,都会分配5000*每行大小的内存,最后调小fetchSize,问题解决(调至分页查询时的页大小)。
分配内存猜想可能有以下几种方式:
1.jdbc查询数据库根据加载的实际数据大小,在jvm中分配内存,以性能换线程
2.jdbc查询数据库时,提前根据数据库中表结构,预加载内存,以内存换性能
现在一般都是通过jdbc接口操作数据库,而fetchSize是jdbc的一个属性,所查询数据库时,一般都是预分配内存
3.jdbc查询的结果集放在ResultSet里面,其设置到java对象的map或pojo中是引用buffers还是复制相同的令一份
猜想应该不是引用的方式,而是创建新对象去接收,要不然jdbc的connection关闭,buffers就被回收了
分配内存的方式,不同的厂商有不同的处理方式:
以oracle为例,其采用了第二种方式,
例如
create table (id number(10),name varchar2(40),birth date);
查询数据库时,通过Statement或PrepareStatement来执行的,每个Statement会持有2个buffers,这些buffers又在一个叫做Implicit Statement Cache的cache中。2个buffers一个为char[],另一个为byte[]。char[]存放varchar2,char等数据类型,byte[]存放其他类型。
id number(10) 占用22bytes
birth date 占用22bytes
name varchar2(40) 占用40*2bytes
所有在查询数据库之前,分配内存数为:
22+22+40*2=124bytes
这只是一行的数据,Oracle JDBC默认是取十行,那分配的大小就是1240 bytes了。
如果将fetchSize设置为5000,那么就有500M了,对于jvm来说,是惊人的
而对于mysql数据库驱动,fetchSize默认是查询全部的数据,如果查询数据过大,需要调小fetchSize,通过ResultSet滚动读取数据
执行一个select语句,不是只查询一次数据库。
oracle jdbc 内存管理
http://solitary.iteye.com/blog/1431704
Fetch Size 与 JDBC 内存管理
http://allenn.cn/articles/2016-12/2016-12-13-fetchsize-jdbc-memory/
提高JDBC应用程序的性能
http://www.voidcn.com/blog/hwctl/article/p-4547155.html
分享到:
相关推荐
Oracle内存全面分析主要聚焦在Oracle数据库的内存结构和配置,这对于优化数据库性能至关重要。Oracle内存主要分为两大类:系统全局区域(SGA)和进程独享部分(PGA和UGA)。下面将对这两个主要内存区域进行详细阐述...
### JDBC 书籍学习之 Oracle 连接与内存管理 #### 一、引言 随着数据库技术的发展,Java Database Connectivity (JDBC) 成为了 Java 应用程序与多种数据库进行交互的标准方式之一。JDBC 提供了一套标准接口,使得...
总结起来,通过多线程和JDBC的结合,我们可以高效地处理和返回海量数据,避免内存压力和单线程的性能瓶颈。这种技术适用于大数据分析、后台服务或其他需要大量读取数据库的应用场景。在实际操作中,应根据具体的业务...
- **使用内存泄漏检测库**:如使用FindBugs、PMD等静态代码分析工具,或者引入如MAT (Memory Analyzer Tool) 进行动态内存分析。 6. **备份策略** 在尝试修复内存泄漏之前,建议先备份当前的Tomcat配置和运行环境...
使用 JDBC 访问数据库存在一些问题,如每一次 Web 请求都要建立一次数据库连接,建立连接是一个费时的活动,每次都得花费 0.05s~1s 的时间,而且系统还要分配内存资源。 数据库连接池(Connection Pool)的工作...
《深入解析MemoryAnalyzer:JVM堆内存分析利器》 在Java开发中,内存管理是至关重要的环节,良好的内存管理能够优化应用性能,防止内存泄漏,提升系统稳定性。MemoryAnalyzer(MAT)是一款强大的JVM堆内存分析工具...
通过分析和学习这个“jdbc数据库连接池工程文件”的“demo”,开发者能够掌握如何在实际项目中集成和使用数据库连接池,提升应用的性能和稳定性。同时,理解连接池的工作原理有助于进行更高效的数据库操作和问题排查...
UCP提供了一个全功能的连接池实现,能够自动管理数据库连接的创建、分配和回收,支持多种高级特性,如连接泄漏检测、连接验证等。使用UCP,开发者可以专注于业务逻辑,而无需担心底层数据库连接的管理细节。 #### ...
1. **Java堆**:这是JVM(Java虚拟机)用来分配Java对象的内存区域,其最大值可以通过启动参数`-Xmx`来设置。如果不指定最大堆大小,JVM会根据系统物理内存等因素动态调整。建议显式设定最大Java堆大小以避免不可...
4. **Druid**:阿里巴巴开源的数据库连接池,除了基础功能外,还提供了监控、日志、SQL解析等功能。 5. **Tomcat JDBC Pool**:Tomcat服务器自带的连接池,适合在Tomcat环境中使用。 ### 连接池的优点 1. **资源...
4. 内存管理:Java的垃圾回收机制在内存数据库中扮演重要角色,需要合理分配和管理内存,避免内存溢出。开发者需要理解对象生命周期、内存池和垃圾回收策略,以优化内存使用。 5. 缓存策略:为了进一步提升性能,...
5. **结果集缓存**: 对于经常查询的数据,可以考虑使用缓存技术,如`ResultSet.TYPE_SCROLL_INSENSITIVE`,在内存中保留结果集。 ### JDBC API的安全性 1. **参数化查询**: 使用`PreparedStatement`避免拼接SQL...
然而,使用JDBC技术进行Web应用程序开发,存在许多问题,如每一次Web请求都要建立一次数据库连接,建立连接是一项费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。 二、数据库连接池的工作...
数据库连接池是一种用于管理数据库连接的技术,其基本思想是在程序启动时预创建一定数量的数据库连接,这些连接被存放在内存中的“连接池”内。当应用程序需要访问数据库时,连接池负责分配一个空闲的连接供应用程序...
Oracle内存管理是数据库系统中至关重要的一环,它涉及到如何高效地使用和分配内存资源,以满足数据库处理大量数据和并发事务的需求。Oracle数据库使用多种内存结构来优化性能和提高资源利用率。 首先,我们要理解...
- **添加学生信息**:从控制台输入学生的姓名,并为其随机分配一个成绩。 - **查询学生信息**: - 按成绩排序查询并显示所有学生的信息。 - 按学号排序查询并显示所有学生的信息。 #### 四、代码分析 ##### 4.1 ...
【Java内存泄漏问题相关总结】 在Java编程中,内存泄漏是一个严重的问题,它指的是...通过良好的编程习惯和工具(如内存分析工具)的帮助,可以有效地预防和诊断Java中的内存泄漏问题,确保应用程序的稳定性和效率。