jdbc如何插入clob_让我们回顾一下如何通过JDBC插入Clob或Blob
jdbc如何插入clob
LOB是所有數(shù)據(jù)庫以及JDBC中的PITA。 正確處理它們需要花費幾行代碼,并且可以確保最終會出錯。 因為您必須考慮以下幾點:
- 首先,LOB是繁重的資源,需要特殊的生命周期管理。 分配LOB后,最好也“釋放”它,以減輕GC的壓力。 本文詳細(xì)介紹了為什么需要釋放吊球
- 分配和釋放吊球的時間至關(guān)重要。 它的壽命可能比ResultSet , PreparedStatement或Connection / transaction中的任何一個更長。 每個數(shù)據(jù)庫都單獨管理這樣的壽命,在極端情況下,您可能必須閱讀規(guī)格
- 對于中小型LOB,您可以使用String而不是Clob或byte[]代替Blob ,但這可能并非總是如此,甚至可能會導(dǎo)致一些令人討厭的錯誤,例如Oracle可怕的ORA-01461:可以綁定LONG值僅用于插入LONG列
因此,如果您正在使用JDBC進(jìn)行低級工作(而不是通過Hibernate或jOOQ抽象JDBC),則最好編寫一個小型實用程序來處理正確的LOB處理。
最近,我們至少在某些數(shù)據(jù)庫中重新發(fā)現(xiàn)了用于jOOQ集成測試的自己的實用程序,并認(rèn)為這對于直接使用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方言創(chuàng)建LOB的過程。 無需記住Oracle的方式
要使用此類,只需編寫如下內(nèi)容:
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,則可以安全地釋放它,可以從異常中正確恢復(fù),等等。只需將LOB容器與PreparedStatement一起放入try-with-resources語句中即可。
如果您對為什么必須首先調(diào)用Clob.free()或Blob.free() ,請閱讀有關(guān)它的文章 。 這將為您OutOfMemoryErrors一兩個OutOfMemoryErrors
翻譯自: https://www.javacodegeeks.com/2015/04/lets-review-how-to-insert-clob-or-blob-via-jdbc.html
jdbc如何插入clob
總結(jié)
以上是生活随笔為你收集整理的jdbc如何插入clob_让我们回顾一下如何通过JDBC插入Clob或Blob的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 华硕的快捷键驱动程序(华硕快捷键驱动下载
- 下一篇: huni凯南天赋(新赛季凯南天赋)