G
Greg Stasica
hi,
from the stack trace it seems like there are two different threads in
synchronized method but how could it be possible ?
public class DBQuery{
private static DBQuery dbQuery = null;
public static DBQuery getInstance()
{
if (dbQuery == null) {
dbQuery = new DBQuery();
}
return dbQuery;
}
public synchronized void saveAuditVersion(boolean fIncrementVersion)
{
try{
doSQLStatement(sql); //line 332
}
catch(SQLException sqle){... }
finally { ...}
if(fIncrementVersion){
refData.setAuditVersion(refData.getAuditVersion()+1); //line 348
......
}
public static doSQLStatement(String sql){....}
}
Thread-159 "[STUCK] ExecuteThread: '12' for queue:
'weblogic.kernel.Default (self-tuning)'" <alive, in native,
priority=1, DAEMON> {
jrockit.net.SocketNativeIO.readBytesPinned(Native Method)
jrockit.net.SocketNativeIO.socketRead(Unknown Source)
java.net.SocketInputStream.socketRead0(SocketInputStream.java:???)
java.net.SocketInputStream.read(SocketInputStream.java:129)
oracle.net.ns.Packet.receive(Unknown Source)
oracle.net.ns.NSProtocol.connect(Unknown Source)
oracle.jdbc.ttc7.TTC7Protocol.connect(TTC7Protocol.java:1689)
oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:215)
^-- Holding lock: oracle.jdbc.ttc7.TTC7Protocol@295b96a[thin lock]
oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:
360)
oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:
521)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:325)
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[recursive lock]
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[fat lock]
org.apache.commons.sql.util.DataSourceWrapper.getConnection(DataSourceWrapper.java:
117)
com.xx.util.DBConnection.connect(DBConnection.java:80)
com.xx.server.DBQuery.doSqlGetmultColumns(DBQuery.java:7242)
com.xx.server.DBQuery.doSqlGetmultColumns(DBQuery.java:7219)
com.xx.server.DBQuery.loadAuditVersion(DBQuery.java:275)
com.xx.RefData.getAuditVersion(RefData.java:394)
com.xx.server.DBQuery.saveAuditVersion(DBQuery.java:348)
^-- Holding lock: com.xx.DBQuery@d903876[fat lock]
com.xx.checkSchedule(TestAction.java:904)
Thread-160 "[STUCK] ExecuteThread: '13' for queue:
'weblogic.kernel.Default (self-tuning)'" <alive, in native,
priority=1, DAEMON> {
jrockit.net.SocketNativeIO.readBytesPinned(Native Method)
jrockit.net.SocketNativeIO.socketRead(Unknown Source)
java.net.SocketInputStream.socketRead0(SocketInputStream.java:???)
java.net.SocketInputStream.read(SocketInputStream.java:129)
oracle.net.ns.Packet.receive(Unknown Source)
oracle.net.ns.NSProtocol.connect(Unknown Source)
oracle.jdbc.ttc7.TTC7Protocol.connect(TTC7Protocol.java:1689)
oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:215)
^-- Holding lock: oracle.jdbc.ttc7.TTC7Protocol@10ea675f[thin lock]
oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:
360)
oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:
521)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:325)
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[recursive lock]
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[fat lock]
org.apache.commons.sql.util.DataSourceWrapper.getConnection(DataSourceWrapper.java:
117)
com.xx.util.DBConnection.connect(DBConnection.java:80)
com.xx.server.DBQuery.doSQLStatement(DBQuery.java:7160)
com.xx.server.DBQuery.saveAuditVersion(DBQuery.java:332)
^-- Holding lock: com.xx.server.DBQuery@d903876[fat lock]
com.xx.checkSchedule(TestAction.java:904)
just to clarify:
DBQuery is although not thread-safe initialized singleton class.
DBConnection is an utility class with no synchronized methods.
As i understand from the stacktrace both threads reference the same
memory address and hold the lock
^-- Holding lock: com.xx.server.DBQuery@d903876[fat lock]
in such a case and excluding any calls to wait() (there is not any)
how is it possible that stack trace shows something as above?
from the stack trace it seems like there are two different threads in
synchronized method but how could it be possible ?
public class DBQuery{
private static DBQuery dbQuery = null;
public static DBQuery getInstance()
{
if (dbQuery == null) {
dbQuery = new DBQuery();
}
return dbQuery;
}
public synchronized void saveAuditVersion(boolean fIncrementVersion)
{
try{
doSQLStatement(sql); //line 332
}
catch(SQLException sqle){... }
finally { ...}
if(fIncrementVersion){
refData.setAuditVersion(refData.getAuditVersion()+1); //line 348
......
}
public static doSQLStatement(String sql){....}
}
Thread-159 "[STUCK] ExecuteThread: '12' for queue:
'weblogic.kernel.Default (self-tuning)'" <alive, in native,
priority=1, DAEMON> {
jrockit.net.SocketNativeIO.readBytesPinned(Native Method)
jrockit.net.SocketNativeIO.socketRead(Unknown Source)
java.net.SocketInputStream.socketRead0(SocketInputStream.java:???)
java.net.SocketInputStream.read(SocketInputStream.java:129)
oracle.net.ns.Packet.receive(Unknown Source)
oracle.net.ns.NSProtocol.connect(Unknown Source)
oracle.jdbc.ttc7.TTC7Protocol.connect(TTC7Protocol.java:1689)
oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:215)
^-- Holding lock: oracle.jdbc.ttc7.TTC7Protocol@295b96a[thin lock]
oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:
360)
oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:
521)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:325)
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[recursive lock]
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[fat lock]
org.apache.commons.sql.util.DataSourceWrapper.getConnection(DataSourceWrapper.java:
117)
com.xx.util.DBConnection.connect(DBConnection.java:80)
com.xx.server.DBQuery.doSqlGetmultColumns(DBQuery.java:7242)
com.xx.server.DBQuery.doSqlGetmultColumns(DBQuery.java:7219)
com.xx.server.DBQuery.loadAuditVersion(DBQuery.java:275)
com.xx.RefData.getAuditVersion(RefData.java:394)
com.xx.server.DBQuery.saveAuditVersion(DBQuery.java:348)
^-- Holding lock: com.xx.DBQuery@d903876[fat lock]
com.xx.checkSchedule(TestAction.java:904)
Thread-160 "[STUCK] ExecuteThread: '13' for queue:
'weblogic.kernel.Default (self-tuning)'" <alive, in native,
priority=1, DAEMON> {
jrockit.net.SocketNativeIO.readBytesPinned(Native Method)
jrockit.net.SocketNativeIO.socketRead(Unknown Source)
java.net.SocketInputStream.socketRead0(SocketInputStream.java:???)
java.net.SocketInputStream.read(SocketInputStream.java:129)
oracle.net.ns.Packet.receive(Unknown Source)
oracle.net.ns.NSProtocol.connect(Unknown Source)
oracle.jdbc.ttc7.TTC7Protocol.connect(TTC7Protocol.java:1689)
oracle.jdbc.ttc7.TTC7Protocol.logon(TTC7Protocol.java:215)
^-- Holding lock: oracle.jdbc.ttc7.TTC7Protocol@10ea675f[thin lock]
oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:
360)
oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:
521)
oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:325)
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[recursive lock]
java.sql.DriverManager.getConnection(Unknown Source)
^-- Holding lock: java.lang.Class@10266d9[fat lock]
org.apache.commons.sql.util.DataSourceWrapper.getConnection(DataSourceWrapper.java:
117)
com.xx.util.DBConnection.connect(DBConnection.java:80)
com.xx.server.DBQuery.doSQLStatement(DBQuery.java:7160)
com.xx.server.DBQuery.saveAuditVersion(DBQuery.java:332)
^-- Holding lock: com.xx.server.DBQuery@d903876[fat lock]
com.xx.checkSchedule(TestAction.java:904)
just to clarify:
DBQuery is although not thread-safe initialized singleton class.
DBConnection is an utility class with no synchronized methods.
As i understand from the stacktrace both threads reference the same
memory address and hold the lock
^-- Holding lock: com.xx.server.DBQuery@d903876[fat lock]
in such a case and excluding any calls to wait() (there is not any)
how is it possible that stack trace shows something as above?