我在运行独立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();
}
}
我观察到该过程完全在数据库服务器上执行,并且在AWR报告中没有发现任何问题。
我随机遇到此问题,无法追查确切原因。为此方案找到了一篇好文章here。请帮我解决这个问题。
发生问题时进行的线程转储。
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)
答案 0 :(得分:0)
从您发布的相同链接,建议设置套接字超时以避免此问题:
为了防止和减少服务提供商的这种不稳定性的影响,关键的解决方案是实现正确的超时
你应该这样做。
您可能还想更改应用的行为,以便在打开连接的服务器上花费的时间更少,从而导致此问题开始。