Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从Java类执行Oracle过程时阻塞线程_Java_Oracle_Jdbc - Fatal编程技术网

从Java类执行Oracle过程时阻塞线程

从Java类执行Oracle过程时阻塞线程,java,oracle,jdbc,Java,Oracle,Jdbc,我在运行独立Java应用程序时遇到了一个问题 此应用程序连接到Oracle 10g数据库并执行一个存储过程,该过程返回一个游标对象。问题是,在执行该过程之后,控件并没有返回到Java类 下面是使用的代码 public String execStoredProcedure(){ Connection l_Connection = null; CallableStatement l_CStatement = null; ResultSet l_

我在运行独立Java应用程序时遇到了一个问题

此应用程序连接到Oracle 10g数据库并执行一个存储过程,该过程返回一个游标对象。问题是,在执行该过程之后,控件并没有返回到Java类

下面是使用的代码

    public String execStoredProcedure(){
        Connection l_Connection = null;
        CallableStatement l_CStatement = null;
        ResultSet l_ResultSet = null;            
        try{
            l_Connection1 = getConnection();
            l_CStatement = l_Connection.prepareCall("{call " + retrievestprName() + "(?,?)}");
            l_CStatement.registerOutParameter(2, -10);
            l_CStatement.setString(1, ApplicationProperties.loggedUser);
            this.m_Logger.debug("before");
            l_CStatement.execute();
            this.m_Logger.debug("after");
            l_ResultSet = (ResultSet)l_CStatement.getObject(2);
        }catch (SQLException se){
            //se.printStackTrace();
        }
    }
我观察到,该过程完全在db服务器上执行,在AWR报告中未发现任何问题

我随机遇到这个问题,无法找到确切的原因。找到了一篇适合此场景的好文章。请帮助我克服这个问题

问题发生期间执行的线程转储

    bash-3.2$ jstack -F 3390
    Attaching to process ID 3390, please wait...
    Debugger attached successfully.
    Server compiler detected.
    JVM version is 20.65-b04
    Deadlock Detection:

    No deadlocks found.

    Thread t@27: (state = BLOCKED)
     - java.net.SocketInputStream.socketRead0(java.io.FileDescriptor, byte[], int, int, int) @bci=0 (Interpreted frame)
     - java.net.SocketInputStream.read(byte[], int, int) @bci=84, line=129 (Interpreted frame)
     - oracle.net.ns.Packet.receive() @bci=25 (Interpreted frame)
     - oracle.net.ns.DataPacket.receive() @bci=1 (Interpreted frame)
     - oracle.net.ns.NetInputStream.getNextPacket() @bci=48 (Interpreted frame)
     - oracle.net.ns.NetInputStream.read(byte[], int, int) @bci=33 (Compiled frame)
     - oracle.net.ns.NetInputStream.read(byte[]) @bci=5 (Interpreted frame)
     - oracle.net.ns.NetInputStream.read() @bci=5 (Interpreted frame)
     - oracle.jdbc.driver.T4CMAREngine.unmarshalUB1() @bci=6, line=978 (Interpreted frame)
     - oracle.jdbc.driver.T4CMAREngine.unmarshalSB1() @bci=1, line=950 (Interpreted frame)
     - oracle.jdbc.driver.T4C8Oall.receive() @bci=54, line=434 (Interpreted frame)
     - oracle.jdbc.driver.T4CCallableStatement.doOall8(boolean, boolean, boolean, boolean) @bci=547, line=180 (Interpreted frame)
     - oracle.jdbc.driver.T4CCallableStatement.execute_for_rows(boolean) @bci=10, line=869 (Interpreted frame)
     - oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout() @bci=316, line=1080 (Interpreted frame)
     - oracle.jdbc.driver.OraclePreparedStatement.executeInternal() @bci=100, line=2904 (Interpreted frame)
     - oracle.jdbc.driver.OraclePreparedStatement.execute() @bci=19, line=2995 (Interpreted frame)
     - oracle.jdbc.driver.OracleCallableStatement.execute() @bci=58, line=4119 (Interpreted frame)
     - com.sdgsoftware.managedinterface.staticimport.bulkimport.BulkImportOracleImpl.execStoredProcedure() @bci=453, line=299 (Interpreted frame)
     - com.sdgsoftware.managedinterface.staticimport.bulkimport.BulkImportOracleImpl.executeBulkInsert(java.lang.String, com.sdgsoftware.managedinterface.main.gui.StatusMessages) @bci=514, line=207 (Interpreted frame)
     - com.sdgsoftware.managedinterface.schedulingimpl.main.DataImportImpl.doBulkImort(int, java.lang.String, java.lang.String, java.lang.String) @bci=49, line=46 (Interpreted frame)
     - com.sdgsoftware.managedinterface.schedulingimpl.main.ScheduledImportImpl.doBulkImport(int, java.lang.String) @bci=77, line=697 (Interpreted frame)
     - com.sdgsoftware.managedinterface.schedulingimpl.main.ScheduledImportImpl.doImport(int, java.lang.String) @bci=118, line=582 (Interpreted frame)
     - com.sdgsoftware.managedinterface.schedulingimpl.main.ScheduledImportImpl.process() @bci=739, line=410 (Interpreted frame)
     - com.sdgsoftware.managedinterface.schedulingimpl.main.ScheduledImportImpl.run() @bci=1, line=282 (Interpreted frame)
     - java.lang.Thread.run() @bci=11, line=680 (Interpreted frame)


    Thread t@2: (state = BLOCKED)


    Thread t@26: (state = IN_JAVA)
    Error occurred during stack walking:
    java.lang.NullPointerException
            at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:78)
            at sun.jvm.hotspot.tools.StackTrace.run(StackTrace.java:45)
            at sun.jvm.hotspot.tools.JStack.run(JStack.java:60)
            at sun.jvm.hotspot.tools.Tool.start(Tool.java:221)
            at sun.jvm.hotspot.tools.JStack.main(JStack.java:86)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
            at java.lang.reflect.Method.invoke(Method.java:597)
            at sun.tools.jstack.JStack.runJStackTool(JStack.java:118)
            at sun.tools.jstack.JStack.main(JStack.java:84)


    Thread t@21: (state = BLOCKED)


    Thread t@20: (state = BLOCKED)
     - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
     - java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=118 (Interpreted frame)
     - java.lang.ref.ReferenceQueue.remove() @bci=2, line=134 (Interpreted frame)
     - java.lang.ref.Finalizer$FinalizerThread.run() @bci=16, lne=171 (Interpreted frame)


    Thread t@19: (state = BLOCKED)
     - java.lang.Object.wait(long) @bci=0 (Interpreted frame)
     - java.lang.Object.wait() @bci=2, line=485 (Interpreted frame)
     - java.lang.ref.Reference$ReferenceHandler.run() @bci=46, line=116 (Interpreted frame)

在您发布的同一链接中,它建议设置套接字超时以避免此问题:

为了防止和减少这种不稳定对服务提供商的影响,关键的解决方案是实现适当的超时

你应该这样做


您可能还想更改应用程序的行为,以便在服务器上花费更少的时间来打开连接,从而导致此问题的出现。

谢谢您的输入。我会加上超时。然而,问题并不是将控件返回到Java类。这是向DBA提出的,并验证了AWR报告,但在db级别未发现任何问题。忘记AWR吧。在这种情况下,您应该使用会话跟踪。此外,如果过程执行花费大量时间,则应使用TCP keepalive。看见这必须在应用程序级别和操作系统内核级别进行设置。谢谢您的评论。通过重新启动Oracle实例解决了该问题,但未找到原始问题的根本原因。您的过程在做什么?只是打开一个游标,还是先执行任何DML,这可能会在DB级别阻塞,例如,来自另一个具有未提交更改的会话?