Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/394.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将数据库拆分为较小的数据库。单次提交中数据过多_Java_Postgresql_Hibernate - Fatal编程技术网

Java 将数据库拆分为较小的数据库。单次提交中数据过多

Java 将数据库拆分为较小的数据库。单次提交中数据过多,java,postgresql,hibernate,Java,Postgresql,Hibernate,我需要一个建议: 我有一个数据库,有将近70个表,其中许多有超过一千万条大记录。我想把它分成几个小的。每个大客户机数据一个,其余客户机数据一个主数据库,同时将部分数据移动到NoSQL数据库中。由于表之间有许多复杂的关系,在复制数据之前,我禁用触发器,检查外键的正确性,然后,在提交之前,我再次启用它们 它只处理少量数据,但现在,当我试图复制一个大客户机数据时,我遇到了java堆大小/GC内存不足的问题 我可以增加堆的大小,但这不是重点 我从每个与客户机数据有任何关系的表中通过特定id选择数据,并将

我需要一个建议:

我有一个数据库,有将近70个表,其中许多有超过一千万条大记录。我想把它分成几个小的。每个大客户机数据一个,其余客户机数据一个主数据库,同时将部分数据移动到NoSQL数据库中。由于表之间有许多复杂的关系,在复制数据之前,我禁用触发器,检查外键的正确性,然后,在提交之前,我再次启用它们

它只处理少量数据,但现在,当我试图复制一个大客户机数据时,我遇到了java堆大小/GC内存不足的问题

我可以增加堆的大小,但这不是重点

我从每个与客户机数据有任何关系的表中通过特定id选择数据,并将其复制到另一个数据库。过程如下所示:

从表中选择数据 将数据插入另一个数据库 正在复制的数据的复制序列maxid 冲洗/清除 对包含客户端数据的每个表重复此操作 我试图选择数据集的一部分,比如选择5000行的部分,而不是一次选择全部50000行,但在完全相同的位置失败了

在这里我想征求一个建议,如何处理这个问题。我认为这一切都是因为我试图在一个大文件中复制所有数据。原因是我必须在复制时禁用触发器,但在提交更改之前必须启用触发器

当我试图复制一个大客户机数据时,我遇到了java堆大小/GC内存不足的问题

复制数据不应该使用堆,因此您似乎没有使用基于游标的查询

请参阅PostgreSQL JDBC文档中的:

默认情况下,驱动程序一次收集查询的所有结果。这对于大型数据集来说是不方便的,因此JDBC驱动程序提供了一种基于数据库游标的结果集,并且只获取少量行的方法

少量行缓存在连接的客户端,当耗尽时,通过重新定位光标检索下一个行块

[……]

将代码更改为游标模式非常简单,只需将语句的获取大小设置为适当的大小。将fetch size设置回0将导致缓存所有行的默认行为

因此,在代码中添加stmt.setFetchSize1000或类似的东西将确保JDBC驱动程序不会耗尽堆


如果在那之后您仍然有问题,那是因为您的代码保留了所有数据,这意味着它在复制操作中编码错误。

我想将其拆分为几个较小的数据-为什么?如今,一千万行已经不是一张大桌子了。您认为拆分这些表有什么好处?这些表的主要用例是什么?一千万算不上太多。主要目标是每个大客户都有自己的应用程序实例,使用自己的数据库实例。你只是想将数据从一个数据库复制到另一个数据库?您是否考虑过另一种方法,如国外表格?这会更直接。数据库的设计和规范化是否正确?是的,你是对的。再看一眼,代码就错了。但作为一个快速解决方案,我设法在数据10k行的每一部分之后进行提交,而不是对所有内容进行一次大的提交。之后,我再次启用触发器。用户不会立即使用这个数据库,所以我想应该是这样ok@kamilke更频繁地执行提交无助于Java堆。它将有助于降低数据库服务器事务日志的大小,但对Java内存没有影响。