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