Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.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 使用JDBC将大文件从postgres数据库流式传输到文件系统_Java_Postgresql_Jdbc_Blob - Fatal编程技术网

Java 使用JDBC将大文件从postgres数据库流式传输到文件系统

Java 使用JDBC将大文件从postgres数据库流式传输到文件系统,java,postgresql,jdbc,blob,Java,Postgresql,Jdbc,Blob,我将文件存储在postgres数据库中的bytea类型的列中,其大小可能超过分配的Java堆空间,因此在尝试将这些文件写入文件系统时,我很快就会遇到内存不足的问题 我使用JDBC执行查询,然后将内容提取为二进制流 这是我的代码的简化版本: public File readContent(String contentId) { PreparedStatement statement = jdbcTemplate.getDataSource().getConnection()

我将文件存储在postgres数据库中的
bytea
类型的列中,其大小可能超过分配的Java堆空间,因此在尝试将这些文件写入文件系统时,我很快就会遇到内存不足的问题

我使用JDBC执行查询,然后将内容提取为二进制流

这是我的代码的简化版本:

    public File readContent(String contentId) {
        PreparedStatement statement = jdbcTemplate.getDataSource().getConnection().prepareStatement("SELECT content from table.entry WHERE id=?");
        statement.setString(1, contentId);
        ResultSet resultSet = statement.executeQuery();
        resultSet.next();
        File file = writeToFileSystem(resultSet.getBinaryStream(1));
        resultSet.close();
        return file;
    }


    private File writeToFileSystem(InputStream inputStream) {
        File dir = createDirectories(Paths.get(properties.getTempFolder(), UUID.randomUUID().toString())).toFile();
        File file = new File(dir, "content.zip");
        FileUtils.copyInputStreamToFile(inputStream, file);
        return file;
    }
我的期望是,这将允许我将数据从数据库流式传输到文件中,而无需将其完全加载到内存中。但是,这种方法不起作用,因为在执行查询时,我仍然会得到
OutOfMemoryErrors

Caused by: java.lang.OutOfMemoryError: Java heap space
    at org.postgresql.core.PGStream.receiveTupleV3(PGStream.java:395)
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2118)
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:288)
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:430)
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:356)
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:168)
    at org.postgresql.jdbc.PgPreparedStatement.executeQuery(PgPreparedStatement.java:116)
    at sun.reflect.GeneratedMethodAccessor201.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at org.apache.tomcat.jdbc.pool.StatementFacade$StatementProxy.invoke(StatementFacade.java:114)
    at com.sun.proxy.$Proxy149.executeQuery(Unknown Source)
    at [...].ContentRepository.readContent(ContentRepository.java:111)  

是否有任何方法可以将数据从数据库流式传输到文件中,而不必增加Java虚拟机的可用内存?

根据您的情况,对于此用例,您不应使用
bytea

在pg中存储二进制数据有两种方法,它们有不同的定义 访问方法和性能特征。Bytea的数据预计将 将更短,并由服务器返回整个结果集。对于 要使用返回指针(oid)的大型对象的较大数据 您可以随意从服务器流式传输的实际数据

本页介绍了两者之间的一些差异 演示如何使用特定于pg的api访问大型对象,但 getBlob/setBlob将很好地工作

请参见显示示例代码和详细信息的部分:

PostgreSQL有一个大型对象工具,它提供对存储在特殊大型对象结构中的用户数据的流式访问。当处理太大而无法作为一个整体方便地操作的数据值时,流式访问非常有用

根据,对于此用例,您不应使用
bytea

在pg中存储二进制数据有两种方法,它们有不同的定义 访问方法和性能特征。Bytea的数据预计将 将更短,并由服务器返回整个结果集。对于 要使用返回指针(oid)的大型对象的较大数据 您可以随意从服务器流式传输的实际数据

本页介绍了两者之间的一些差异 演示如何使用特定于pg的api访问大型对象,但 getBlob/setBlob将很好地工作

请参见显示示例代码和详细信息的部分:

PostgreSQL有一个大型对象工具,它提供对存储在特殊大型对象结构中的用户数据的流式访问。当处理太大而无法作为一个整体方便地操作的数据值时,流式访问非常有用


为什么不直接链接到文档的最新版本?为什么不直接链接到文档的最新版本?