簡體   English   中英

Oracle+JDBC 掛起故障排除

[英]Troubleshooting Oracle+JDBC hang

我們經常看到 Oracle (11gR2) 在嘗試通過 JDBC 進行更新時掛起。 訪問 Oracle 的線程是應用程序中連接到數據庫的唯一線程,它只是永遠等待 Oracle 返回數據。 另一個進程可能已經訪問了同一個數據庫並更新了一個表,但我的印象是 Oracle 會自動檢測到死鎖並返回一個錯誤。 在我們的例子中,數據庫只是掛起。 關於什么可能導致這種情況或通過某些 DBA 命令進行調試的任何想法? 這是我在卡住時看到的堆棧跟蹤:

Thread 7315: (state = IN_NATIVE)
 - java.net.SocketInputStream.socketRead0(java.io.FileDescriptor, byte[], int, int, int) @bci=0 (Compiled frame; information may be imprecise)
 - java.net.SocketInputStream.read(byte[], int, int, int) @bci=79 (Compiled frame)
 - java.net.SocketInputStream.read(byte[], int, int) @bci=11 (Compiled frame)
 - oracle.net.ns.Packet.receive() @bci=180, line=308 (Compiled frame)
 - oracle.net.ns.DataPacket.receive() @bci=1, line=106 (Compiled frame)
 - oracle.net.ns.NetInputStream.getNextPacket() @bci=48, line=324 (Compiled frame)
 - oracle.net.ns.NetInputStream.read(byte[], int, int) @bci=33, line=268 (Compiled frame)
 - oracle.net.ns.NetInputStream.read(byte[]) @bci=5, line=190 (Compiled frame)
 - oracle.net.ns.NetInputStream.read() @bci=73, line=107 (Compiled frame)
 - oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket() @bci=94, line=143 (Compiled frame)
 - oracle.jdbc.driver.T4CSocketInputStreamWrapper.read() @bci=18, line=80 (Compiled frame)
 - oracle.jdbc.driver.T4CMAREngine.unmarshalUB1() @bci=6, line=1137 (Compiled frame)
 - oracle.jdbc.driver.T4CTTIfun.receive() @bci=11, line=350 (Compiled frame)
 - oracle.jdbc.driver.T4CTTIfun.doRPC() @bci=63, line=227 (Compiled frame)
 - oracle.jdbc.driver.T4C8Oall.doOALL(boolean, boolean, boolean, boolean, boolean, oracle.jdbc.internal.OracleStatement$SqlKind, int, byte[], int, oracle.jdbc.driver.Accessor[], int, oracle.jdbc.driver.Accessor[], int, byte[], char[], short[], int, oracle.jdbc.driver.DBConversion, byte[], java.io.InputStream[][], byte[][][], oracle.jdbc.oracore.OracleTypeADT[][], oracle.jdbc.driver.OracleStatement, byte[], char[], short[], oracle.jdbc.driver.T4CTTIoac[], int[], int[], int[], oracle.jdbc.driver.NTFDCNRegistration) @bci=769, line=531 (Compiled frame)
 - oracle.jdbc.driver.T4CPreparedStatement.doOall8(boolean, boolean, boolean, boolean, boolean) @bci=749, line=208 (Compiled frame)
 - oracle.jdbc.driver.T4CPreparedStatement.executeForRows(boolean) @bci=226, line=1046 (Compiled frame)
 - oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout() @bci=301, line=1336 (Compiled frame)
 - oracle.jdbc.driver.OraclePreparedStatement.executeInternal() @bci=119, line=3613 (Compiled frame)
 - oracle.jdbc.driver.OraclePreparedStatement.executeUpdate() @bci=13, line=3694 (Compiled frame)
 - oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate() @bci=4, line=1354 (Compiled frame)
 - sun.reflect.GeneratedMethodAccessor16.invoke(java.lang.Object, java.lang.Object[]) @bci=40 (Compiled frame)
 - sun.reflect.DelegatingMethodAccessorImpl.invoke(java.lang.Object, java.lang.Object[]) @bci=6 (Compiled frame)
 - java.lang.reflect.Method.invoke(java.lang.Object, java.lang.Object[]) @bci=57 (Compiled frame)
 - oracle.ucp.jdbc.proxy.StatementProxyFactory.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) @bci=513, line=294 (Compiled frame)
 - oracle.ucp.jdbc.proxy.PreparedStatementProxyFactory.invoke(java.lang.Object, java.lang.reflect.Method, java.lang.Object[]) @bci=122, line=137 (Compiled frame)
 - com.sun.proxy.$Proxy3.executeUpdate() @bci=9 (Compiled frame)

死鎖是指會話 1 持有會話 2 正在等待的鎖,而會話 2 同時持有會話 1 正在等待的鎖。 聽起來您所描述的是一個簡單的阻塞鎖,其中會話 1(您的應用程序)被阻塞,等待會話 2(其他一些應用程序)持有的鎖尚未結束其事務。 在這種情況下,會話 1 將無限期地阻塞等待會話 2。

如果您想從后端查看, gv$session將為數據庫中打開的每個會話都有一行。 由於您的應用程序只有一個線程訪問數據庫,我猜想osuserprocessmachineterminalprogram某種組合將允許您識別與您的應用程序關聯的會話。 完成此操作后,查看blocking_instanceblocking_session列。 如果填充了這些,則您的會話將被阻止,等待其他會話提交或回滾。 您可以使用該v$sessionv$session行來嘗試找出哪個應用程序錯誤地持有鎖的時間過長。

這里的“經典”問題往往是在用戶交互中鎖定行的應用程序。 例如,如果我編寫了一個執行悲觀鎖定的應用程序,我會在向用戶顯示一行時鎖定一行,並等待用戶修改該行后再釋放鎖定。 但問題是,如果用戶沒有做任何其他事情就去吃午飯(或者如果應用程序崩潰),該行將在數據庫中無限期地保持鎖定狀態,直到 DBA 出現並終止持有鎖定的會話。

查看 v$active_session_history ,它顯示了會話正在等待的最后一個等待事件。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM