【问题标题】:Database Lock while updating table in oracle在 oracle 中更新表时数据库锁定
【发布时间】:2014-09-17 10:54:59
【问题描述】:

我的应用程序正在对表执行非常简单的更新:

UPDATE TABLE SET COLUMN = 'XYZ' WHERE PK = 123

问题是,当 Hibernate 尝试像这样更新表时,表会被锁定 ORA 事件:SQL*Net 更多来自客户端的数据

我试图在我的本地数据库上复制错误,但我不能。

有人知道发生了什么吗?

发生错误的数据库版本:Oracle Database 10g Release 10.2.0.3.0 - 64bit Production

我的本​​地数据库版本:Oracle Database 10g Release 10.2.0.5.0 - 64bit Production

PS:正在更新的列是CLOB类型,OJDBC驱动版本是1.4

【问题讨论】:

  • 影子进程在第一个网络包中收到了来自客户端进程(例如SQLPlus、ProC、JDBC)的部分调用,正在等待更多数据以完成通话。示例是包含大量数据的大型 SQL 或 PL/SQL 块和插入语句。
  • 正在发送 101292 个字符长度的 clob(这是在列中设置的值的大小)。你知道怎么解决吗?

标签: java database oracle hibernate


【解决方案1】:

应使用准备好的语句。我们不应该直接赋值。 例如:

String updateSQL = UPDATE TABLE SET COLUMN = ? WHERE PK = ? . 
PreparedStatement pstmt = null;
pstmt=dbresourceAgent.getPreparedStatement(updateSQL);
pstmt.setString(1,"XYZ");
pstmt.setString(2,"123");
pstmt.executeUpdate();

【讨论】:

    【解决方案2】:

    您知道发送到 oracle db 的具体内容是什么吗?当 Hibernate 发送很长的 sql 命令并且它在 JDBC 驱动程序上失败时,我看到过类似的情况。

    我建议从获取最新的 JDBC 驱动程序版本开始。

    【讨论】:

    • 正在发送 101292 个字符长度的 clob(这是在列中设置的值的大小)。
    • 如何管理休眠映射?您可以发送您使用的配置吗?还要检查这个:stephou.wordpress.com/2009/09/24/…
    • 我将我的 jdbc 驱动程序版本更新为最新版本(在我的情况下为 ojdbc6),但它没有解决我的问题。我将列(数据库中的 CLOB)映射为字符串,或多或少像这样:
    • 好的,试试这样的:<property name="content" type="java.sql.Clob" .. />,可能你遇到了和here类似的问题
    猜你喜欢
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 2013-03-24
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多