openGauss/MogDB数据库里bytea二进制类型受segment size编译参数限制,默认不能超过1GB,如果字段存储数据超过1GB可以使用lo(Large Object)扩展类型。

01

lo类型需要先创建lo extension

$ gsql -p5432 -Uomm postgres -r
gsql ((MogDB 2.0.1 build f892ccb7) compiled at 2021-07-09 16:15:21 commit 0 last mr  )
Non-SSL connection (SSL connection is recommended when requiring high-security)
Type "help" for help.postgres=# create extension lo;
CREATE EXTENSION

创建完lo扩展,我们新建test_lo表,info字段使用lo类型。

postgres=# create table test_lo(id int,info lo);
CREATE TABLE

创建test_lo表管理触发器,对update和delete操作使用lo_manage函数管理,不然会产生孤立大对象。

postgres=# create trigger test_lo before UPDATE OR DELETE ON test_lo FOR EACH ROW EXECUTE procedure lo_manage(info);
WARNING:  Trigger function with non-plpgsql type is not recommended.
DETAIL:  Non-plpgsql trigger function are not shippable by default.
HINT:  Unshippable trigger may lead to bad performance.
CREATE TRIGGER

使用dd生成2GB文件:

postgres=#  \! dd if=/dev/zero of=test_lo bs=1M count=2048 && sync
记录了2048+0 的读入
记录了2048+0 的写出
2147483648字节(2.1 GB,2.0 GiB)已复制,0.805435 s,2.7 GB/s

02

测试lo_import函数导入数据到数据表

postgres=# insert into test_lo values(1,lo_import('/home/omm/test_lo'));
INSERT 0 1

可以看到数据可以正常导入,如果不使用lo类型,使用bytea类型会提示下面的报错。

ERROR:  requested length too large

03

测试lo_export函数导出数据表数据到文件

postgres=# select lo_export(test_lo.info,'/home/omm/test_ext_lo') from test_lo where id=1;lo_export
-----------1
(1 row)

可以看到数据正常导出。

查看导入导出的数据文件,也可以使用diff命令进行比对。

postgres=# \! ls -lh test_*
-rw-r--r-- 1 omm dbgrp 2.0G 12月 17 13:00 test_ext_lo
-rw------- 1 omm dbgrp 2.0G 12月 17 12:58 test_lo

04

查看数据表大对象字段大小

分两步进行,首先查大对象字段的oid(lo类型字段在用户表里面只存储一个oid引用指针,并不实际存数据)

postgres=# select * from test_lo;id | info
----+-------1 | 16392
(1 row)

实际数据使用多条bytea记录存储在pg_largeobject表,可以根据oid查询统计字段的大小。

postgres=# select loid,pg_size_pretty(sum(octet_length(data)))
from pg_largeobject
where loid =16392
group by loid;loid  | pg_size_pretty
-------+----------------16392 | 2048 MB
(1 row)

也可以使用如下函数来查询:

create or replace function get_lo_size(oid)
returns bigint
volatile strict
as $function$
declarefd integer;sz bigint;
beginfd := lo_open($1, x'40000'::int);perform lo_lseek64(fd, 0, 2);sz := lo_tell64(fd);perform lo_close(fd);return sz;
end;
$function$ language plpgsql;

查询结果如下:

postgres=# select pg_size_pretty(get_lo_size(16392));pg_size_pretty
----------------2048 MB
(1 row)

再来测试JDBC应用层的使用:

05

JDBC-Java文件入库

public static void main(String[] args) throws Exception{ Class.forName("org.postgresql.Driver");Connection conn = DriverManager.getConnection("jdbc:postgresql://ip:port/dbname","username","password");conn.setAutoCommit(false);LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();long oid = lobj.createLO(LargeObjectManager.READ | LargeObjectManager.WRITE);LargeObject obj = lobj.open(oid, LargeObjectManager.WRITE);File file = new File("c:/work/test_lo");FileInputStream fis = new FileInputStream(file);byte buf[] = new byte[10*1024*1024];int s, tl = 0;while ((s = fis.read(buf, 0, 2048)) > 0){obj.write(buf, 0, s);tl += s;}obj.close();PreparedStatement ps = conn.prepareStatement("INSERT INTO test_lo VALUES (?, ?)");ps.setInt(1, 100);ps.setLong(2, oid);ps.executeUpdate();ps.close();fis.close();conn.commit();conn.close();}

06

JDBC-Java读数据输出到文件

public static void main(String[] args) throws Exception{ Class.forName("org.postgresql.Driver");Connection conn = DriverManager.getConnection("jdbc:postgresql://ip:port/dbname","username","password");conn.setAutoCommit(false);LargeObjectManager lobj = conn.unwrap(org.postgresql.PGConnection.class).getLargeObjectAPI();PreparedStatement ps = conn.prepareStatement("SELECT info FROM test_lo WHERE id = ?");ps.setInt(1, 100);ResultSet rs = ps.executeQuery();File file = new File("c:/work/test_out_lo");FileOutputStream fos = new FileOutputStream(file);while (rs.next()){long oid = rs.getLong(1);LargeObject obj = lobj.open(oid, LargeObjectManager.READ);byte buf[] = new byte[10*1024*1024];int s, tl = 0;while ((s = obj.read(buf, 0, 2048)) > 0){fos.write(buf, 0, s);tl += s;}obj.close();}rs.close();ps.close();fos.close();conn.commit();conn.close();}

Jdbc-Java Large Object示例参考:(复制链接至浏览器中浏览)

https://jdbc.postgresql.org/documentation/head/binary-data.html


墨天轮原文链接:https://www.modb.pro/db/214758?sjhy复制链接至浏览器或点击文末阅读原文查看)

关于作者

彭冲,云和恩墨PG技术顾问,网名“多米爸比”,PG社区认证专家,中国首期PostgreSQL ACE Partner,多年从事基于PostgreSQL数据库的软件研发,擅长于PL/PGSQL业务迁移及优化,Oracle到PostgreSQL的迁移升级,异构数据库整合;作为墨天轮PostgreSQL实践专栏作者,热衷于PostgreSQL实践技术分享,在自己的岗位积极推广PostgreSQL,致力为PG社区多做奉献。

END

推荐阅读:2021数据技术嘉年华视频回放及PPT下载

2021数据技术嘉年华50余个PPT下载、视频回放已上传墨天轮平台,可在“数据和云”公众号回复关键词“2021DTC”获得!

你知道吗?我们的视频号里已经发布了很多精彩的内容,快去看看吧!↓↓↓

点击下图查看更多 ↓

云和恩墨大讲堂 | 一个分享交流的地方

长按,识别二维码,加入万人交流社群

请备注:云和恩墨大讲堂

  点个“在看”

你的喜欢会被看到❤

MogDB大对象LargeObject存取测试相关推荐

  1. 【参赛作品61】openGauss/MogDB大对象LargeObject存取测试

    作者:彭冲 penGauss/MogDB数据库里bytea二进制类型受segment size编译参数限制,默认不能超过1GB,如果字段存储数据超过1GB可以使用lo(Large Object)扩展类 ...

  2. java的知识点45——CLOB 存储大量的文本数据与 BLOB 二进制大对象

    CLOB(Character Large Object) 用于存储大量的文本数据 大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理的. 测试CLOB 文本大对象的使用   ...

  3. JVM中GC大对象配置

    大对象配置 -XX:PretenureSizeThreshold 配置直接进入老年代的对象大小 如果,对象不是太大TLAN区,优先分配空间 大对象 新生代eden区,无法装入时,会直接进入老年代 可以 ...

  4. 第一百一十四期:盘点十大最新Web UI测试工具

    本文为您盘点目前十大最新Web UI测试工具的各自优缺点,以方便您根据实际情况进行选择. 作者:陈峻 在过去的几年中,业界至少出现了十二种全新的UI测试自动化工具.虽然每一种工具都有各自的侧重点,但是 ...

  5. 11g大对象数据新技术

    2019独角兽企业重金招聘Python工程师标准>>> Oracle Acs资深顾问罗敏 老罗技术核心感悟: 11g大对象数据新技术 2016/02/15 by Maclean Li ...

  6. Spring 让 LOB 数据操作变得简单易行,LOB 代表大对象数据,包括 BLOB 和 CLOB 两种类型

    http://www.ibm.com/developerworks/cn/java/j-lo-spring-lob/index.html 本文讲解了在 Spring 中处理 LOB 数据的原理和方法, ...

  7. HBase技术与应用实践 | HBase2.0重新定义小对象实时存取

    本次分享来自中国HBase技术社区第七届MeetUp成都站,分享嘉宾天引 阿里巴巴 技术专家专注在大数据领域,拥有多年分布式.高并发.大规模系统的研发与实践经验,先后参与HBase.Phoenix.L ...

  8. 【greenplum】greenplum pg_largeobject 大对象处理实践

    作者:lianghc 1. postgresql的大对象处理      由于greenplum 的底层是postgresql ,所以gp的大对象存储的基本知识先看postgreql的大对象存储,先看看 ...

  9. JVM_Parallel Scavenge 实例证明,说些你不知道的东西,大对象的规则!!策略的验证

    前言 最近几天学了JVM的几种GC还有内存分配,<深入理解JVM>的日志部分是Serial 收集器,由于JAVA8的默认是ParallelGC 所以,自己测试并且阅读ParallelGC的 ...

最新文章

  1. 使用webpack构建多页应用
  2. C51汇编伪指令 CSEG DSEG
  3. Ubuntu下安装Nginx,PHP5(及PHP-FPM),MySQL
  4. 在python中使用Ansible实现Devops的相关总结
  5. python的sorted函数用法_Python sorted函数及用法
  6. 1021 个位数统计 (15分)——10行代码AC(解题报告)
  7. xxxx must either be declared abstract or implement abstract method ‘map(T)‘ in ‘MapFunction‘
  8. python api调用百度ai平台_Python 百度AI接口调用
  9. (转)淘淘商城系列——分布式文件系统FastDFS
  10. java字符串处理截取和替换字符
  11. HIVE json格式数据的处理
  12. 算法导论答案(第一章)
  13. deeplinux 热点_在deepin linux系统中连接无线的同时开启热点(即网络共享)的步骤
  14. GPU并行计算版函数图像生成器
  15. 怎么查看电脑磁盘的分区是GPT还是MBR
  16. 算法训练 Beaver's Calculator
  17. lo流讲解 和使用(大纲)
  18. v2.error: C:\projects\opencv-python\opencv\modules\imgproc\src\imgwarp.cpp:5594: error: (-215) (M0.t
  19. OSCP-Pelican(Exhibitor、gcore提权)
  20. [2020 年百度之星·程序设计大赛 - 复赛] Binary Addition

热门文章

  1. bundle文件解压_通过sourcemap解压缩webpack 实战
  2. 您是如何开始使用Linux的?
  3. 教师新学年工作愿景_新学年的3个创新开源项目
  4. Bootstrap CSS 编码规范之Class 命名规范
  5. Bootstrap CSS 编码规范之单行规则声明
  6. Cs231N_学习笔记
  7. 用linux上网有什么优点,Linux系统的介绍,有什么优点,怎么使用
  8. pause容器作用_容器编排之战(四)连载
  9. python 递归遍历目录排序_python下递归遍历目录和文件
  10. sql case when then else多个条件_SQL-多表查询