`

jdbc分配内存分析

 
阅读更多
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数据库的内存结构和配置,这对于优化数据库性能至关重要。Oracle内存主要分为两大类:系统全局区域(SGA)和进程独享部分(PGA和UGA)。下面将对这两个主要内存区域进行详细阐述...

    tomcat内存泄漏备份方法

    - **使用内存泄漏检测库**:如使用FindBugs、PMD等静态代码分析工具,或者引入如MAT (Memory Analyzer Tool) 进行动态内存分析。 6. **备份策略** 在尝试修复内存泄漏之前,建议先备份当前的Tomcat配置和运行环境...

    多线程以JDBC的方式返回海量数据

    总结起来,通过多线程和JDBC的结合,我们可以高效地处理和返回海量数据,避免内存压力和单线程的性能瓶颈。这种技术适用于大数据分析、后台服务或其他需要大量读取数据库的应用场景。在实际操作中,应根据具体的业务...

    java_jdbc数据库连接池总结

    使用 JDBC 访问数据库存在一些问题,如每一次 Web 请求都要建立一次数据库连接,建立连接是一个费时的活动,每次都得花费 0.05s~1s 的时间,而且系统还要分配内存资源。 数据库连接池(Connection Pool)的工作...

    MemoryAnalyzer JVM堆内存分析工具

    《深入解析MemoryAnalyzer:JVM堆内存分析利器》 在Java开发中,内存管理是至关重要的环节,良好的内存管理能够优化应用性能,防止内存泄漏,提升系统稳定性。MemoryAnalyzer(MAT)是一款强大的JVM堆内存分析工具...

    jdbc数据库连接池工程文件

    通过分析和学习这个“jdbc数据库连接池工程文件”的“demo”,开发者能够掌握如何在实际项目中集成和使用数据库连接池,提升应用的性能和稳定性。同时,理解连接池的工作原理有助于进行更高效的数据库操作和问题排查...

    Java jdbc数据库连接池总结2

    4. **Druid**:阿里巴巴开源的数据库连接池,除了基础功能外,还提供了监控、日志、SQL解析等功能。 5. **Tomcat JDBC Pool**:Tomcat服务器自带的连接池,适合在Tomcat环境中使用。 ### 连接池的优点 1. **资源...

    内存数据库代码有详细设计说明(java版)

    4. 内存管理:Java的垃圾回收机制在内存数据库中扮演重要角色,需要合理分配和管理内存,避免内存溢出。开发者需要理解对象生命周期、内存池和垃圾回收策略,以优化内存使用。 5. 缓存策略:为了进一步提升性能,...

    jdbc api 第三板

    5. **结果集缓存**: 对于经常查询的数据,可以考虑使用缓存技术,如`ResultSet.TYPE_SCROLL_INSENSITIVE`,在内存中保留结果集。 ### JDBC API的安全性 1. **参数化查询**: 使用`PreparedStatement`避免拼接SQL...

    JDBC数据库连接池总结.doc

    然而,使用JDBC技术进行Web应用程序开发,存在许多问题,如每一次Web请求都要建立一次数据库连接,建立连接是一项费时的活动,每次都得花费0.05s~1s的时间,而且系统还要分配内存资源。 二、数据库连接池的工作...

    Oracle内存管理

    Oracle内存管理是数据库系统中至关重要的一环,它涉及到如何高效地使用和分配内存资源,以满足数据库处理大量数据和并发事务的需求。Oracle数据库使用多种内存结构来优化性能和提高资源利用率。 首先,我们要理解...

    MemoryAnalyzer.rar

    《深入解析MemoryAnalyzer:JVM堆内存分析利器》 在Java开发中,内存管理是优化应用性能的关键环节。当应用程序出现内存泄漏或者性能下降时,理解JVM内存的状态至关重要。MemoryAnalyzer,作为一款专业的JVM堆内存...

    全程精确营销-内存数据库

    其产品特性包括先进的内存管理技术,支持SQL、ODBC和JDBC等标准,以及全面的事务处理机制,包括自动恢复和乐观锁/悲观锁策略,保证了数据的完整性和一致性。在电信行业,SolidDB常用于OSS(Operations Support ...

    RAM管理系统 全新

    1. 内存分配:系统需要根据应用程序的需求动态分配内存,保证程序运行所需的空间。 2. 内存回收:当不再需要内存时,系统需及时回收,防止内存泄漏。 3. 垃圾收集:垃圾收集器是RAM管理的核心部分,它自动识别并...

    MemoryAnalyze

    《深入理解Java内存分析工具MemoryAnalyze》 在Java编程中,内存管理是至关重要的一个环节,它直接影响到程序的性能、稳定性和可扩展性。本文将深入探讨Java内存分析工具Memory Analyzer Tool(MAT),帮助开发者更...

    Jdbc以及常用数据库连接池Jar包合集

    数据库连接池的主要功能是管理数据库连接,包括创建、分配、回收和释放连接,从而提高数据库操作的效率和并发性能。 1. JDBC基础: - 驱动注册:JDBC驱动通常是一个实现了特定接口的Java类,如`java.sql.Driver`。...

    WEBLOGIC门户挂起分析

    总结:在分析和解决WEBLOGIC门户系统挂起问题时,需要关注数据库连接池的管理、系统资源限制、JVM内存配置、日志管理、JDBC线程池优化、错误日志分析、目录权限以及应用程序代码质量等多个方面。通过对这些环节的...

    DBPoolDemo:jdbc 池,包含 C3P0、DBCP、Proxool、Druid、tomcat-jdbc

    本篇文章将详细讲解标题中提到的五种主流Java数据库连接池:C3P0、DBCP、Proxool、Druid以及tomcat-jdbc,并逐一分析它们的特点、使用方法以及优缺点。 1. **C3P0** C3P0是一个开源的JDBC连接池,它实现了数据源和...

    javase分析图介绍

    通过内存分析图,我们可以理解对象的生命周期、内存分配和回收过程,这对于避免内存泄漏和优化性能至关重要。 总的来说,“javase分析图介绍”涵盖了JavaSE中的核心概念和技术,通过图形化的方式帮助开发者更直观地...

    EJ Technologies JProfiler 11.0 x64.rar破解版

    软件介绍/下载地址/猜你喜欢/网友评论/JProfiler10破解版是一款非常好用且功能强大的Java开发分析工具,可以有效地查看java运行内存使用情况,并拥有JDBC、JPA和NOSQL数据库分析、内存泄漏分析等实用功能,它可以...

Global site tag (gtag.js) - Google Analytics