我也想使用我的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服务器服务这些文件!
1条答案
按热度按时间nhhxz33t1#
您的概念注定要失败。您将数据库服务器用作对大型文件进行磁盘操作的缓存。这显然是时间和资源的浪费,因为服务器每次都要保存文件的全部内容,以便暂时将其删除。
在我看来,使用ftp服务器将是更简单,更自然和更有效得多的解决方案。