Java 将数据库拆分为较小的数据库。单次提交中数据过多
我需要一个建议: 我有一个数据库,有将近70个表,其中许多有超过一千万条大记录。我想把它分成几个小的。每个大客户机数据一个,其余客户机数据一个主数据库,同时将部分数据移动到NoSQL数据库中。由于表之间有许多复杂的关系,在复制数据之前,我禁用触发器,检查外键的正确性,然后,在提交之前,我再次启用它们 它只处理少量数据,但现在,当我试图复制一个大客户机数据时,我遇到了java堆大小/GC内存不足的问题 我可以增加堆的大小,但这不是重点 我从每个与客户机数据有任何关系的表中通过特定id选择数据,并将其复制到另一个数据库。过程如下所示: 从表中选择数据 将数据插入另一个数据库 正在复制的数据的复制序列maxid 冲洗/清除 对包含客户端数据的每个表重复此操作 我试图选择数据集的一部分,比如选择5000行的部分,而不是一次选择全部50000行,但在完全相同的位置失败了 在这里我想征求一个建议,如何处理这个问题。我认为这一切都是因为我试图在一个大文件中复制所有数据。原因是我必须在复制时禁用触发器,但在提交更改之前必须启用触发器 当我试图复制一个大客户机数据时,我遇到了java堆大小/GC内存不足的问题 复制数据不应该使用堆,因此您似乎没有使用基于游标的查询 请参阅PostgreSQL JDBC文档中的: 默认情况下,驱动程序一次收集查询的所有结果。这对于大型数据集来说是不方便的,因此JDBC驱动程序提供了一种基于数据库游标的结果集,并且只获取少量行的方法 少量行缓存在连接的客户端,当耗尽时,通过重新定位光标检索下一个行块 [……] 将代码更改为游标模式非常简单,只需将语句的获取大小设置为适当的大小。将fetch size设置回0将导致缓存所有行的默认行为 因此,在代码中添加stmt.setFetchSize1000或类似的东西将确保JDBC驱动程序不会耗尽堆Java 将数据库拆分为较小的数据库。单次提交中数据过多,java,postgresql,hibernate,Java,Postgresql,Hibernate,我需要一个建议: 我有一个数据库,有将近70个表,其中许多有超过一千万条大记录。我想把它分成几个小的。每个大客户机数据一个,其余客户机数据一个主数据库,同时将部分数据移动到NoSQL数据库中。由于表之间有许多复杂的关系,在复制数据之前,我禁用触发器,检查外键的正确性,然后,在提交之前,我再次启用它们 它只处理少量数据,但现在,当我试图复制一个大客户机数据时,我遇到了java堆大小/GC内存不足的问题 我可以增加堆的大小,但这不是重点 我从每个与客户机数据有任何关系的表中通过特定id选择数据,并将
如果在那之后您仍然有问题,那是因为您的代码保留了所有数据,这意味着它在复制操作中编码错误。我想将其拆分为几个较小的数据-为什么?如今,一千万行已经不是一张大桌子了。您认为拆分这些表有什么好处?这些表的主要用例是什么?一千万算不上太多。主要目标是每个大客户都有自己的应用程序实例,使用自己的数据库实例。你只是想将数据从一个数据库复制到另一个数据库?您是否考虑过另一种方法,如国外表格?这会更直接。数据库的设计和规范化是否正确?是的,你是对的。再看一眼,代码就错了。但作为一个快速解决方案,我设法在数据10k行的每一部分之后进行提交,而不是对所有内容进行一次大的提交。之后,我再次启用触发器。用户不会立即使用这个数据库,所以我想应该是这样ok@kamilke更频繁地执行提交无助于Java堆。它将有助于降低数据库服务器事务日志的大小,但对Java内存没有影响。