让我们回顾一下如何通过JDBC插入Clob或Blob
生活随笔
收集整理的這篇文章主要介紹了
让我们回顾一下如何通过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的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 纪念币怎样预约?
- 下一篇: 不可变的基础架构,热部署和JVM