日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

让我们回顾一下如何通过JDBC插入Clob或Blob

發布時間:2023/12/3 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 让我们回顾一下如何通过JDBC插入Clob或Blob 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

LOB是所有數據庫以及JDBC中的PITA。 正確處理它們需要花費幾行代碼,并且可以確保最終會出錯。 因為您必須考慮以下幾點:

  • 首先,LOB是繁重的資源,需要特殊的生命周期管理。 分配LOB后,最好“釋放”它,以減輕GC的壓力。 本文詳細介紹了為什么需要釋放吊球
  • 分配和釋放吊球的時間至關重要。 它的壽命可能比ResultSet , PreparedStatement或Connection / Transactions中的任何一個都更長。 每個數據庫都單獨管理這樣的生命周期,在極端情況下,您可能必須閱讀規格
  • 對于中小型LOB,您可以使用String而不是Clob或byte[]代替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或Blob的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。