使用Java处理postgreSQL中的大量数据

使用Java处理postgreSQL中的大量数据,java,database,postgresql,jpa,Java,Database,Postgresql,Jpa,我需要用Java编写一个小程序,从postgreSQL数据库中读取大量记录,将它们转换为JSON并将它们写到其他地方 显然,如果我不想出现内存不足错误,我无法同时加载所有记录(500000行) 在内存中加载1000条记录、处理并转到下一个1000条记录的最佳方式是什么? 有人有主意吗 默认情况下,Postgres JDBC驱动程序将完整的ResultSet加载到内存中。这可以通过关闭自动提交并通过设置大于0的获取大小来启用基于光标的检索来防止 详情请参阅手册: 因此,如果您执行以下操作: Con

我需要用Java编写一个小程序,从postgreSQL数据库中读取大量记录,将它们转换为JSON并将它们写到其他地方

显然,如果我不想出现内存不足错误,我无法同时加载所有记录(500000行)

在内存中加载1000条记录、处理并转到下一个1000条记录的最佳方式是什么?
有人有主意吗

默认情况下,Postgres JDBC驱动程序将完整的
ResultSet
加载到内存中。这可以通过关闭自动提交并通过设置大于0的获取大小来启用基于光标的检索来防止

详情请参阅手册:

因此,如果您执行以下操作:

Connection con = ....; // open the connection
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.setFetchSize(1000);
ResultSet rs = stmt.executeQuery("select ...");
while (rs.next()) 
{
   // do something with the row
}
这将永远不会在内存中加载超过1000行。可以通过更改提取大小来控制内存中保留的行数


我不知道JPA,但是控制自动提交应该是向前的,但是我不知道如何通过JPA控制获取大小。可能还取决于您的JPA提供商。

默认情况下,Postgres JDBC驱动程序将完整的
结果集加载到内存中。这可以通过关闭自动提交并通过设置大于0的获取大小来启用基于光标的检索来防止

详情请参阅手册:

因此,如果您执行以下操作:

Connection con = ....; // open the connection
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.setFetchSize(1000);
ResultSet rs = stmt.executeQuery("select ...");
while (rs.next()) 
{
   // do something with the row
}
这将永远不会在内存中加载超过1000行。可以通过更改提取大小来控制内存中保留的行数


我不知道JPA,但是控制自动提交应该是向前的,但是我不知道如何通过JPA控制获取大小。可能还取决于您的JPA提供商。

默认情况下,Postgres JDBC驱动程序将完整的
结果集加载到内存中。这可以通过关闭自动提交并通过设置大于0的获取大小来启用基于光标的检索来防止

详情请参阅手册:

因此,如果您执行以下操作:

Connection con = ....; // open the connection
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.setFetchSize(1000);
ResultSet rs = stmt.executeQuery("select ...");
while (rs.next()) 
{
   // do something with the row
}
这将永远不会在内存中加载超过1000行。可以通过更改提取大小来控制内存中保留的行数


我不知道JPA,但是控制自动提交应该是向前的,但是我不知道如何通过JPA控制获取大小。可能还取决于您的JPA提供商。

默认情况下,Postgres JDBC驱动程序将完整的
结果集加载到内存中。这可以通过关闭自动提交并通过设置大于0的获取大小来启用基于光标的检索来防止

详情请参阅手册:

因此,如果您执行以下操作:

Connection con = ....; // open the connection
con.setAutoCommit(false);
Statement stmt = con.createStatement();
stmt.setFetchSize(1000);
ResultSet rs = stmt.executeQuery("select ...");
while (rs.next()) 
{
   // do something with the row
}
这将永远不会在内存中加载超过1000行。可以通过更改提取大小来控制内存中保留的行数


我不知道JPA,但是控制自动提交应该是向前的,但是我不知道如何通过JPA控制获取大小。可能还取决于您的JPA提供商。

请注意,有许多类似的问题,但另一个是请注意,有许多类似的问题,但另一个是请注意,有许多类似的问题,但另一个是请注意,有许多类似的问题,但另一个是谢谢你的解释;)谢谢你的解释;)谢谢你的解释;)谢谢你的解释;)