2010年7月30日金曜日

Oracle JdbcConnectionのclose問題

AdvancedQueuingを扱っていて、JMSConnection#close()でThreadがHANGするので調査したところ、どうもOracleのJDBCの古いもの(ojdbc14以前)のバグの様でojdbc5以降でHANGしなくなっているようだ。
以下に、関連情報を載せるが、close()自体は成功しても実際のTCP-Connectionは解放されないため、調査続行中:

1) 2009/12 Thread stuck waiting on java.net.SocketInputStream.socketRead : Weblogic
http://objectmix.com/weblogic/532984-thread-stuck-waiting-java-net-socketinputstream-socketread.html

ojdbcのバグだから新しいのを使え;
Hangした時に以下のSQLを実行する;

select
vse.username, vse.osuser, vse.status, vse.sql_address, vs.piece, vs.sql_text
from v$sqltext_with_newlines vs, v$session vse
where vse.sql_address = vs.address and vse.status = 'ACTIVE'
order by sql_address, piece


2) 2003/01-2006/12 thread deadlock but no other thread holds lock??
http://forums.sun.com/thread.jspa?threadID=343023

DaemonThreadからclose()すればいい;

3) 2003/08-2009/04 Thread Hangs at SocketInputStream.read
http://www.dbforums.com/oracle/894519-thread-hangs-socketinputstream-read.html

TableSpaceが不足した場合に発生する;


4) 2009/09 JDBC insert query to Oracle sometimes hangs
http://dbaspot.com/forums/oracle-server/19570-jdbc-insert-query-oracle-sometimes-hangs.html

複数のInsertによるブロック;

5) 2004/06 ds.getConnection( )返ってこない
http://otn.oracle.co.jp/forum/message.jspa?messageID=11004716

DBCPの設定とOracle-SharedServerの設定の問題?;
v$session周りを調べると共有サーバに設定してあるのですが、server列がNONEだったりSHAREDだったりまちまち;

共有サーバの設定値を具体的には、
alter system set shared_servers=5 scope=both;
にすると、ds.getConnection()で待つことなく正常に返ってくるようになりました。
接続セッション数は40くらいだったのですが、マニュアルには
「shared_serversの値1に対し10セッションで安定する」みたいです。

6) 2003/02-2010/06 JDBC conneciton hanging at SocketInputStream.socketRead
http://forums.oracle.com/forums/thread.jspa?messageID=4354229


FierWallの影響か?;

7) 2008/11 Deadlocks with Oracle
http://old.nabble.com/Deadlocks-with-Oracle-td20378297.html

古いojdbcのバグ?;
I'm rather certain the patches are included in 10.2.0.3 patchset

0 件のコメント: