Postgresql 用JDBC在Postgres中存储大型JSONB文件

Postgresql 用JDBC在Postgres中存储大型JSONB文件,postgresql,scala,jdbc,jsonb,Postgresql,Scala,Jdbc,Jsonb,我们正在考虑使用Scala在Postgres表的JSONB列中存储一些大型JSON文档(大约500MB大小)。我已经编写了一些Scala代码,如下所示,用于将数据写入数据库。但是,insert有一些问题(抛出的异常显然太大,语句代理无法处理,因此它只是一个OutOfMemoryException)。有没有更好的方法来插入这么大的文件?我尝试将JSONB列作为PGobject和InputStream插入 implicit val conn = TransactionHelper.conn() v

我们正在考虑使用Scala在Postgres表的JSONB列中存储一些大型JSON文档(大约500MB大小)。我已经编写了一些Scala代码,如下所示,用于将数据写入数据库。但是,insert有一些问题(抛出的异常显然太大,语句代理无法处理,因此它只是一个OutOfMemoryException)。有没有更好的方法来插入这么大的文件?我尝试将JSONB列作为
PGobject
InputStream
插入

implicit val conn = TransactionHelper.conn()

var pstmt: Option[PreparedStatement] = None
var rset: Option[ResultSet] = None
var id: Option[Long] = None

try {
  pstmt = Some(conn.prepareStatement(
    "INSERT INTO configuration_record (configuration_id, state, config_info) VALUES (?, ?, encode(?, 'escape')::JSONB)"
  ))

  val bais = new ByteArrayInputStream(jsonData.getBytes())

  pstmt.get.setString(1, configurationId)
  pstmt.get.setString(2, "Begin")
  pstmt.get.setBinaryStream(3, bais, jsonData.getBytes().length)

  pstmt.get.executeUpdate()

  rset = Some(pstmt.get.getGeneratedKeys)

  rset.get.next()

  id = Some(rset.get.getLong(1))
} finally {
  rset.foreach(_.close())
  pstmt.foreach(_.close())
}
表结构如下所示:

CREATE TABLE configuration_record (
  id SERIAL PRIMARY KEY,
  state TEXT,
  config_info JSONB
);
An exception or error caused a run to abort: Java heap space 
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:649)
    at java.lang.StringBuilder.append(StringBuilder.java:202)
    at com.mohaine.db.SqlPrinterAbstract.getBindSqlString(SqlPrinterAbstract.java:49)
    at com.mohaine.db.PrintablePreparedStatementProxy.getBindSqlString(PrintablePreparedStatementProxy.java:120)
    at com.mohaine.db.PrintablePreparedStatementProxy.appendBindByIndex(PrintablePreparedStatementProxy.java:109)
    at com.mohaine.db.PrintablePreparedStatementProxy.bindSql(PrintablePreparedStatementProxy.java:85)
    at com.mohaine.db.PrintablePreparedStatementProxy.toString(PrintablePreparedStatementProxy.java:66)
    at data.SqlPrinter.outputSqlError(SqlPrinter.scala:79)
    at com.mohaine.db.PrintableStatementProxy.printError(PrintableStatementProxy.java:53)
    at com.mohaine.db.PrintablePreparedStatementProxy.executeUpdate(PrintablePreparedStatementProxy.java:379)...
抛出的异常(看起来不是数据库抛出的异常,而是语句代理抛出的异常)如下所示:

CREATE TABLE configuration_record (
  id SERIAL PRIMARY KEY,
  state TEXT,
  config_info JSONB
);
An exception or error caused a run to abort: Java heap space 
java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:649)
    at java.lang.StringBuilder.append(StringBuilder.java:202)
    at com.mohaine.db.SqlPrinterAbstract.getBindSqlString(SqlPrinterAbstract.java:49)
    at com.mohaine.db.PrintablePreparedStatementProxy.getBindSqlString(PrintablePreparedStatementProxy.java:120)
    at com.mohaine.db.PrintablePreparedStatementProxy.appendBindByIndex(PrintablePreparedStatementProxy.java:109)
    at com.mohaine.db.PrintablePreparedStatementProxy.bindSql(PrintablePreparedStatementProxy.java:85)
    at com.mohaine.db.PrintablePreparedStatementProxy.toString(PrintablePreparedStatementProxy.java:66)
    at data.SqlPrinter.outputSqlError(SqlPrinter.scala:79)
    at com.mohaine.db.PrintableStatementProxy.printError(PrintableStatementProxy.java:53)
    at com.mohaine.db.PrintablePreparedStatementProxy.executeUpdate(PrintablePreparedStatementProxy.java:379)...

getBytes
(不特定于postgres)将所有数据加载到内存中,因此对于大的
jsonData
is来说,可能会引发内存问题也就不足为奇了……关于将字符串更改为不使用该方法的InputStream的另一种方法的建议?使用可以直接流式传输的JSON源