jdbc如何插入clob

LOB是所有数据库以及JDBC中的PITA。 正确处理它们需要花费几行代码,并且可以确保最终会出错。 因为您必须考虑以下几点:

  • 首先,LOB是繁重的资源,需要特殊的生命周期管理。 分配LOB后,最好也“释放”它,以减轻GC的压力。 本文详细介绍了为什么需要释放吊球
  • 分配和释放吊球的时间至关重要。 它的寿命可能比ResultSetPreparedStatementConnection / transaction中的任何一个更长。 每个数据库都单独管理这样的寿命,在极端情况下,您可能必须阅读规格
  • 对于中小型LOB,您可以使用String而不是Clobbyte[]代替Blob ,但这可能并非总是如此,甚至可能会导致一些令人讨厌的错误,例如Oracle可怕的ORA-01461:可以绑定LONG值仅用于插入LONG列

因此,如果您正在使用JDBC进行低级工作(而不是通过Hibernate或jOOQ抽象JDBC),则最好编写一个小型实用程序来处理正确的LOB处理。

最近,我们至少在某些数据库中重新发现了用于jOOQ集成测试的自己的实用程序,并认为这对于直接使用JDBC的一些读者可能非常有用。 考虑以下类别:

public class LOB implements AutoCloseable {private final Connection connection;private final List<Blob> blobs;private final List<Clob> clobs;public LOB(Connection connection) {this.connection = connection;this.blobs = new ArrayList<>();this.clobs = new ArrayList<>();}public final Blob blob(byte[] bytes) throws SQLException {Blob blob;// You may write more robust dialect // detection hereif (connection.getMetaData().getDatabaseProductName().toLowerCase().contains("oracle")) {blob = BLOB.createTemporary(connection, false, BLOB.DURATION_SESSION);}else {blob = connection.createBlob();}blob.setBytes(1, bytes);blobs.add(blob);return blob;}public final Clob clob(String string) throws SQLException {Clob clob;if (connection.getMetaData().getDatabaseProductName().toLowerCase().contains("oracle")) {clob = CLOB.createTemporary(connection, false, CLOB.DURATION_SESSION);}else {clob = connection.createClob();}clob.setString(1, string);clobs.add(clob);return clob;}@Overridepublic final void close() throws Exception {blobs.forEach(JDBCUtils::safeFree);clobs.forEach(JDBCUtils::safeFree);}
}

这个简单的类有一些不错的款待:

  • 它是AutoCloseable ,因此您可以使用try-with-resources语句释放您的吊球
  • 它抽象了跨SQL方言创建LOB的过程。 无需记住Oracle的方式

要使用此类,只需编写如下内容:

try (LOB lob = new LOB(connection);PreparedStatement stmt = connection.prepareStatement("insert into lobs (id, lob) values (?, ?)")
) {stmt.setInt(1, 1);stmt.setClob(2, lob.clob("abc"));stmt.executeUpdate();
}

而已! 无需保留对lob的引用,如果它不为null,则可以安全地释放它,可以从异常中正确恢复,等等。只需将LOB容器与PreparedStatement一起放入try-with-resources语句中即可。

如果您对为什么必须首先调用Clob.free()Blob.free() ,请阅读有关它的文章 。 这将为您OutOfMemoryErrors一两个OutOfMemoryErrors

翻译自: https://www.javacodegeeks.com/2015/04/lets-review-how-to-insert-clob-or-blob-via-jdbc.html

jdbc如何插入clob

jdbc如何插入clob_让我们回顾一下如何通过JDBC插入Clob或Blob相关推荐

  1. mysql插入10万测试_[原创]java使用JDBC向MySQL数据库批次插入10W条数据测试效率

    使用JDBC连接MySQL数据库进行数据插入的时候,特别是大批量数据连续插入(100000),如何提高效率呢? 在JDBC编程接口中Statement 有两个方法特别值得注意: 通过使用addBatc ...

  2. jdbc批量插入的4种方式【百万条数据插入只需几秒】

    mysql数据库准备 #打开数据库test01; use test01; #创建表a,表a包含int型的id列.可变长度型的name[长度20个字符] create table a (id INT,N ...

  3. 通过JDBC和Hibernate对Clob和Blob的操作

    通过JDBC和Hibernate对Clob和Blob的操作,插入和读取. 一,JDBC方式: 1,当lob的内容很小的时候,用sta.setString(2, "clob content&q ...

  4. jdbc连接sqlserver报错java.lang.ClassNotFoundException: com.microsoft.jdbc.sqlserver.SQLServerDriver...

    使用2008的数据库, 我已经引入的sqljdbc4的包,单还是报这个错,很奇怪突然想到在配置hibernate的时候,是拷贝下来的代码 然后到网上查了下, 因为是2008的版本驱动和2000的有点不 ...

  5. JDBC学习笔记02【ResultSet类详解、JDBC登录案例练习、PreparedStatement类详解】

    黑马程序员-JDBC文档(腾讯微云)JDBC笔记.pdf:https://share.weiyun.com/Kxy7LmRm JDBC学习笔记01[JDBC快速入门.JDBC各个类详解.JDBC之CR ...

  6. 表的插入、更新、删除、合并操作_2_插入含自增列的记录

    插入含自增列的记录 需求描述 需求:向dept表中插入部门编号为50,部门名称为Production,部门位置为Shanghai的数据. 解决方法:这里通过INSERT INTO TableName ...

  7. mysql不存在就批量新增_mysql批量插入,存在则修改,不存在则插入

    批量插入,存在则修改,不存在则插入 INSERT INTO 表名 (字段1,字段2,字段3,字段4) VALUES (字段1值,字段2值,字段3值,字段4值) ON DUPLICATE KEY UPD ...

  8. SQLite在指定列后面插入字段_个人学习系列 - 防止MySQL重复插入数据

    新建表格 CREATE TABLE `person` (`id` int NOT NULL COMMENT '主键',`name` varchar(64) CHARACTER SET utf8 COL ...

  9. 插入模板_WordPress在文章列表和内容页插入广告

    本文已同步到专业技术网站 www.sufaith.com, 该网站专注于前后端开发技术与经验分享, 包含Web开发.Nodejs.Python.Linux.IT资讯等板块. 一.在文章列表插入广告 文 ...

最新文章

  1. c语言实现 十进制到二进制的转换
  2. html 视频兼容苹果,video苹果兼容flash播放
  3. 操作系统(六)系统调用
  4. Ubuntu下Topcoder配置
  5. R-FCN+ResNet-50用自己的数据集训练模型(python版本)
  6. 四针手表指的是什么_1000~1500元的男士手表推荐
  7. web应用的目录结构
  8. Shortcut setting in Webclient UI
  9. java序列化kr_序列化专用列表
  10. mysql int 转string_mysql的这些坑你踩过吗?快来看看怎么优化mysql
  11. 51Nod-2149 字符串出现位置【水题】
  12. Docker 多模块打包启动(kitty-generator)
  13. android地图搜索功能,[Android]百度地图POI检索
  14. 实施工程师职业的前景和发展思考
  15. <零售数据分析-Pandas> 通过环比销售和库存对产品进行分类
  16. oppoa5降级教程_OPPO A5官方原厂固件rom刷机包_全量系统降级包回退包下载A.14版
  17. 硬盘分区形式之MBR、GPT
  18. 2021/08/09模拟赛总结
  19. 微信小程序iphone11 wx.openBluetoothAdapter 返回状态10001 当前蓝牙适配器不可用
  20. Code Review 在丁香医生前端团队的实践

热门文章

  1. P4284-[SHOI2014]概率充电器【树形dp,换根法,数学期望】
  2. jzoj4015-数列【循环节,数论】
  3. nssl1230-序列【位运算】
  4. 【模板】EK求最大流、dinic求最大流
  5. Spark SQL(三)之视图与执行SQL
  6. Spark入门(十八)之多表关联
  7. Spark入门(十四)之分组求最大值
  8. Spring 基于注解的配置
  9. Jdk8一行代码读取文件
  10. 小学计算机学情分析报告,小学信息技术_重点文字图说话教学设计学情分析教材分析课后反思...