gpt4 book ai didi

java - 使用 JdbcTemplate 将大型 CLOB 插入 Oracle 失败

转载 作者:行者123 更新时间:2023-12-02 12:58:47 28 4
gpt4 key购买 nike

我通过 Spring 的 JdbcTemplate 实用程序类与 Oracle 数据库进行交互,并且我尝试了这两种代码变体:

jdbcTemplate.update("INSERT INTO my_table (title, content) VALUES (?, ?)", title, content);

-- 或 --

jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection conn) throws SQLException {
OraclePreparedStatement ps = (OraclePreparedStatement)conn.prepareStatement("INSERT INTO my_table (title, content) VALUES (?, ?)");
ps.setString(1, title);
ps.setStringForClob(2, content);
return ps;
}
});

其中 title 是传统的 VARCHAR2contentCLOB

这些替代方案都适用于较小的内容值。但是,当我有大量内容时,CLOB 列中不会插入任何内容。

有趣的是,在这两种情况下,title 都会更新。就好像查询只是忽略内容(如果内容太多),但永远不会抛出错误。

有人知道我应该如何解决这个问题吗?

谢谢。

编辑:

根据 @GreyBeardedGeek 的回答,我尝试使用 OracleLobHandlerDefaultLobHandler 达到相同的效果。在我的 CLOB 达到一定大小之前,一切都会正常进行。

我还尝试了以下代码,再次达到相同的效果:

Connection conn = db.getDataSource().getConnection();
CLOB clob = CLOB.createTemporary(conn, false, CLOB.DURATION_SESSION);
clob.setString(1, myString);

OraclePreparedStatement ps = (OraclePreparedStatement)conn.prepareStatement("UPDATE my_table SET blob = ?");
ps.setCLOB(1, clob);
ps.execute();

我很困惑为什么这些方法中的每一种都适用于较小的CLOB,但随后突然破坏了较大的。数据库中是否缺少某种类型的配置?还是代码有问题?

最佳答案

好吧,我觉得自己很傻。事实证明,即使这个简单的代码也能正确存储 CLOB:

jdbcTemplate.update("UPDATE my_table SET title = ?, content = ? WHERE id = ?", getTitle(), getContentString(), getId());

问题是我的代码从数据库检索了CLOB。以下是我基于我的代码(和修复)的推测:似乎较小的 CLOB 被缓存在内存中,并且可以在稍后的时间读取(即,在连接之后)已关闭,但仍可阅读)。但是,对于较大的 CLOB,必须在连接仍处于打开状态时读取它们。

对我来说,这意味着修复就像在我的对象可用时立即读取 CLOB 的内容一样简单。就我而言,我并不真正担心内存问题,因为我不希望我的 CLOB 会包含大小过大的内容,因此立即将值读入内存是一种可以接受的方法.

关于java - 使用 JdbcTemplate 将大型 CLOB 插入 Oracle 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22518991/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com