【问题标题】:Execute a CallableStatement blocks the application执行 CallableStatement 会阻塞应用程序
【发布时间】:2016-06-22 02:07:41
【问题描述】:

我有一个使用 Java 6 编写的后端服务器,带有 JBoss 5.1。我必须将该代码上的 Oracle 过程(存储在包中)调用为如下方法:

cs = conn.prepareCall("{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}");

        cs.setString(1, <data>);
        cs.setString(2, <data>);
        cs.setString(3, <data>);
        cs.setDate(4, <data>);
        cs.setString(5, <data>);

        cs.registerOutParameter(6, Types.VARCHAR);
        cs.registerOutParameter(7, Types.VARCHAR);
        cs.registerOutParameter(8, Types.BIGINT);

        cs.setInt(9, <data>);


        try{
            cs.execute();
        }catch (RuntimeException e){
            e.getMessage();
        }catch (Exception e){
            e.getMessage();
        }


        Long numerr   = cs.getLong(8);

当我调用cs.execute() 时出现问题。该调用会阻塞执行,无法继续正常执行和持久化数据。

有必要说这个过程正常执行 insert 数据到另一个基于第三个表的表中,我之前在其中插入了具有正常类创建和EntityManager.persist(&lt;entity&gt;)EntityManager.flush() 的数据.

这不是授予权限问题,因为我可以在SQLDeveloper上使用正确的句子和正确的用户/密码执行该过程。

【问题讨论】:

  • 在 SQL Developer 中调用过程完成的插入是提交还是回滚?听起来插入只是被另一个会话阻止了。
  • 嗯,我不这么认为,虽然我尝试插入我之前的数据,关闭连接,创建另一个连接,创建可调用语句然后执行,问题仍然存在,cs.execute() 仍然阻塞
  • 但是您说您从 SQL Developer 成功运行了它。我说的是那个会话,而不是你之前在 Java 中所做的事情。
  • 不,这不是问题。即使我关闭 SQL Developer,甚至重新启动计算机。问题依然存在。
  • 可能是Java坚持阻塞调用过程语句?

标签: java oracle stored-procedures hibernate-entitymanager


【解决方案1】:

最后我发现了问题所在。您不能同时使用 EntityManager 来持久化一个实体,然后再执行一个您必须在本机调用的过程。所以解决方案是本地持久化我的实体(通过插入,使用PreparedStatemnt);

"Insert into <table> (<column1>, <column2>,...,<columnN>) values (?, ?,...,?)"

然后以正确的方式执行程序:

"{call <user>.<package>.<procedure_name>(?,?,?,?,?,?,?,?,?)}"

原因似乎是你不能在同一个@Transactional 方法中执行两种不同的执行方式:EntityManager persist-way 和 native procedure execution-way。

我希望这可以帮助任何人:-)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多