postgresql Postgres读写外部文件

x9ybnkn6  于 2023-01-17  发布在  PostgreSQL
关注(0)|答案(1)|浏览(180)

我也想使用我的postgres服务器来提供那些我不想存储在数据库中的文档和图像,原因有几个。
有一个扩展用于此目的https://github.com/darold/external_fileexternal fileexternal file,并更改了一些代码以满足我的需要,而不更改核心(见下文)。我使用9.5,因为我希望在完成开发之前此版本是最终版本;-)
我遇到以下问题:

  • 写作工作迅速,似乎是可靠的,但大文件导致内存不足(1Gig及以上)。
  • 读取经常挂起很长时间(选择readEFile('aPath ');)而且不可靠。
  • WAL和Database的大小都会快速增长,尽管不涉及数据库表。

我的问题:
下面的代码有什么问题吗?我怎么能从WAL中排除所有这些操作呢?有没有人写过类似的东西并愿意分享他的开发?

CREATE OR REPLACE FUNCTION public.writeefile(
    buffer bytea,
    filename character varying)
  RETURNS void AS
$BODY$
DECLARE
  l_oid oid;
  lfd integer;
  lsize integer;
BEGIN
  l_oid := lo_create(0);
  lfd := lo_open(l_oid,131072); --0x00020000 write mode
  lsize := lowrite(lfd,buffer);
  PERFORM lo_close(lfd);
  PERFORM lo_export(l_oid,filename);
  PERFORM lo_unlink(l_oid);
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.writeefile(bytea, character varying)
  OWNER TO itcms;

CREATE OR REPLACE FUNCTION public.readefile(filename character varying)
  RETURNS bytea AS
$BODY$
DECLARE
  l_oid oid;
  r record;
  buffer bytea;
BEGIN
  buffer := '';
  SELECT lo_import(filename) INTO l_oid;
  FOR r IN ( SELECT data 
             FROM pg_largeobject 
             WHERE loid = l_oid 
             ORDER BY pageno ) LOOP
    buffer = buffer || r.data;
  END LOOP;
  PERFORM lo_unlink(l_oid);
  return buffer;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION public.readefile(character varying)
  OWNER TO itcms;

为了解释我对上述内容的需求:这将是一个医疗系统的一部分,也通过不安全的连接服务和存储大量的文档和图像。存储数百GB的数据库似乎不是一个好主意,我。因为他们没有改变,只是新的文档添加文件备份是容易得多。由于数据库已经处理SSL连接,这将是伟大的,而不必部署额外的sftp服务器服务这些文件!

nhhxz33t

nhhxz33t1#

您的概念注定要失败。您将数据库服务器用作对大型文件进行磁盘操作的缓存。这显然是时间和资源的浪费,因为服务器每次都要保存文件的全部内容,以便暂时将其删除。
在我看来,使用ftp服务器将是更简单,更自然和更有效得多的解决方案。

相关问题