当前位置:首页 > 内存 > 正文

连接oracle数据库报内存溢出

  • 内存
  • 2024-08-02 05:01:28
  • 9421

一、你好,java向数据库添加大量数据时内存溢出在不改变内存的情况下如何解决?你当时是怎么解决的比如此时要将一张有1000万条数据的数据库表导出到文件中,要么执行分页,就会引起新的查询,而且随着翻页,速度会越来越慢。事实上,我们想要获得一个句柄,然后游到下游编译一部分数据(比如10,000行)并写入。文件一次(写文件的细节我就不赘述了,这是最基本的,你需要注意的是,每次使用输出流写入缓冲区中的数据时,最好将其刷新并清空缓冲区)。那么,如果运行没有where条件的SQL,内存会爆炸吗?是的,这个问题值得思考。通过API我们发现可以对SQL进行一些操作,例如通过:PreparedStatementstatement=eStatement(sql),这是标准预编译=eStatement(sql,_FORWARD_ONLY,_READ_ONLY);
设置游标,使游标不直接在本地内存缓存数据,然后每次通过设置chSize(200);来设置游标导线的大小还可以,我实际用过这个。根本就如我上面所说的一堆废话,哈哈,我只是想说Java的标准API可能效率不高。很多时候取决于厂家的实现机制,网上很多都说这个设置效,但这纯属抄袭,上面说不用担心,它不会缓存在内存中,所以Java内存不会造成一些问题。如果是mysql,首先使用版本5以上,然后在连接参数中添加useCursorFetch=true参数。至于游标大小,可以通过在连接参数中添加:defaultFetchSize=1000来指定,例如:
jdbc:mysql://。/


二、java分流读取数据库里的数据到txt,避免数据量太大读不了报内存溢出的错误这两个要点一定要分清楚,是数据库错误还是JAVA程序错误。2种相应不同的方法。
以ORACLE为例。如果确定数据库报错,DBA可以调整数据库参数或者JDBC参数。
假设JAVA程序溢出。首先,注意不要一次性读取所有记录,将它们存储在变量中,然后写入TXT。
最好根据ORACLEROWID分页,一次读取100或500行,然后写入。