我对PostgreSQL和数据库完全陌生,并尝试对大对象进行一些测试。
我刚发现可以将8GB文件保存到Postgres。
但是文档说大对象(pg_largeobject
存储)的最大值是2GB。
http://www.postgresql.org/docs/9.2/static/lo-intro.html
我在这里错过了什么吗?
选择version()
节目:
在x86_64-unknow-linux-gnu上的PostgreSQL 9.2.1,由gcc(GCC)4.4.6 20120305(Red Hat 4.4.6-4)编译,64位
这是我感兴趣的代码:
private long insertLargeObject(UsSqlSession session, FileEntity fileEntity) throws SQLException, FileNotFoundException, IOException{
LargeObjectManager lobj = getLargeObjectAPI(session);
long oid = lobj.createLO();
LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);
try(FileInputStream fis = new FileInputStream(fileEntity.getFile())){
int bufSize = 0x8FFFFFF;
byte buf[] = new byte[bufSize];
int s = 0;
int tl = 0;
while( (s = fis.read(buf, 0, bufSize)) > 0 ) {
obj.write(buf, 0, s);
tl += s;
}
}
obj.close();
return oid;
}
更新
pg_largeobject
的大小为11GB,pg_largeobject_metadata
表示有一行表示只存在一个大对象。
select sum(length(lo.data))
from pg_largeobject lo
where lo.loid=1497980;
返回4378853347
。
更新
public File findLargeObject(UsSqlSession session, long oid) throws SQLException, FileNotFoundException, IOException{
LargeObjectManager lobj = getLargeObjectAPI(session);
LargeObject obj = lobj.open(oid, LargeObjectManager.READ);
int bufSize = 0x8FFFFFF;
byte buf[] = new byte[bufSize];
int s = 0;
int tl=0;
File file = new File("e:/target-file");
try(FileOutputStream output = new FileOutputStream(file)){
while( (s = obj.read(buf, 0, bufSize)) > 0 ){
output.write(buf, 0, s);
tl += s;
}
output.flush();
}
obj.close();
return file;
}
答案 0 :(得分:2)
我认为正确的答案是:“你的PostgreSQL是使用int64支持构建的,因此你可以在一个LO中写入超过2GB的内容。但是你可能会遇到问题。”
尝试阅读Tom Lane的回复:http://postgresql.1045698.n5.nabble.com/Large-objects-td2852592.html注意关于“lo_seek64”和“lo_tell64”函数的随机咆哮。