Stored procedure hangs -- thread locked.

How can I determine what is locking my object?

I ran a kill -3 on my Tomcat process which produced this, but I don't understand it:

at java.net.SocketInputStream.socketRead0(Native Method)

at java.net.SocketInputStream.read(SocketInputStream.java:129)

at oracle.net.ns.Packet.receive(Unknown Source)

at oracle.net.ns.DataPacket.receive(Unknown Source)

at oracle.net.ns.NetInputStream.getNextPacket(Unknown Source)

at oracle.net.ns.NetInputStream.read(Unknown Source)

at oracle.net.ns.NetInputStream.read(Unknown Source)

at oracle.net.ns.NetInputStream.read(Unknown Source)

at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:979)

at oracle.jdbc.driver.T4CMAREngine.unmarshalSB1(T4CMAREngine.java:951)

at oracle.jdbc.driver.T4C8Oall.receive(T4C8Oall.java:435)

at oracle.jdbc.driver.T4CCallableStatement.doOall8(T4CCallableStatement.java:181)

at oracle.jdbc.driver.T4CCallableStatement.execute_for_rows(T4CCallableStatement.java:870)

at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1081)

at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:2905)

at oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:2996)

- locked <0xaa55f938> (a oracle.jdbc.driver.T4CCallableStatement)

- locked <0xaa6c02b8> (a oracle.jdbc.driver.T4CConnection)

at oracle.jdbc.driver.OracleCallableStatement.execute(OracleCallableStatement.java:4120)

- locked <0xaa55f938> (a oracle.jdbc.driver.T4CCallableStatement)

- locked <0xaa6c02b8> (a oracle.jdbc.driver.T4CConnection)

at mypackage.db.executeProcedure(db.java:160)

at mypackage.web.procedure.executeProcedure.doTag(executeProcedure.java:61)

at org.apache.jsp.include.down_jsp._jspx_meth_we_executeProcedure_0(down_jsp.java:209)

at org.apache.jsp.include.down_jsp._jspx_meth_c_if_0(down_jsp.java:160)

at org.apache.jsp.include.down_jsp._jspService(down_jsp.java:81)

at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)

at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.apache.catalina.core.ApplicationDispatcher.invoke(ApplicationDispatcher.java:672)

at org.apache.catalina.core.ApplicationDispatcher.doInclude(ApplicationDispatcher.java:574)

at org.apache.catalina.core.ApplicationDispatcher.include(ApplicationDispatcher.java:499)

at org.apache.taglibs.standard.tag.common.core.ImportSupport.acquireString(Unknown Source)

at org.apache.taglibs.standard.tag.common.core.ImportSupport.doEndTag(Unknown Source)

at org.apache.jsp.index_jsp._jspx_meth_c_import_2(index_jsp.java:423)

at org.apache.jsp.index_jsp._jspx_meth_c_when_2(index_jsp.java:394)

at org.apache.jsp.index_jsp._jspx_meth_c_choose_0(index_jsp.java:234)

at org.apache.jsp.index_jsp._jspService(index_jsp.java:133)

at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:97)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:332)

at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:314)

at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:264)

at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:252)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:368)

at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:202)

at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:173)

at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)

at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:178)

at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:126)

at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:105)

at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:107)

at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:148)

at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:869)

at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:664)

at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:527)

at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:80)

at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:684)

I have a single Connection object, that I run a simple Statement.execute on first (to change an Oracle environment variable) and then I close that Statement, before trying to run this CallableStatement, so I don't know what's locking it.

Some source, I have to obfuscate it a bit, sorry ... all pertinent pieces are here, though.

Statement s = conn.createStatement();

s.execute("alter session set nls_date_format = 'yyyy/mm/dd hh24:mi:ss'");

s.close();

// -

try{

jdbcSQL ="{ call " + jdbcSQL +"}";

cs = conn.prepareCall(jdbcSQL);

// A few things like this

cs.setString(key, value);

cs.execute();

}

finally{

try

{

cs.close();

}catch (SQLException e){}

}

[7079 byte] By [Nosf3ratua] at [2007-11-27 10:17:45]
# 1

I suggest opening and closing a connection separately for each database read/write you do rather than use one connection. Also, below is a propery try/catch/finally block on how to ensure connections are closed properly. Also, in your example, you catch an exception but dont do anything with it ( catch (SQLException e) {}). I suggest at least putting a e.printStackTrace() in it. That way, the thing that cause the exception is printed to the screen. Killing tomcat causes tomcat to throw a separate unrelated exception that you don't really need to worry about.

You can also try to single-step through the code to determine exactly which line is causing problems.

public ArrayList myFunction(){

Connection conn=null;

PreparedStatement pstmt1= null;

ResultSet resultSet=null;

ArrayList list1;

try{

list1=new ArrayList();

conn= dataSource.getConnection();

conn.setAutoCommit(false);

pstmt1= conn.prepareStatement();

resultSet= pstmt1.executeUpdate();

while(resultSet.next()){

arrayList.add(resultSet.getString("lastName");

}

conn.commit();

return arrayList;

} catch (SqlException e){

if(conn!=null)

conn.rollback();

e.printStackTrace();

} finally {

if(conn!=null)

conn.setAutoCommit(true);//must ensure this is done first because

//following lines might throw an error

if(rsultSet!=null)

resultSet.close();

if(pstmt1!=null)

pstmt1.close();

if(conn!=null)

conn.close();

}

}

}

George123a at 2007-7-28 15:53:31 > top of Java-index,Database Connectivity,Java Database Connectivity (JDBC)...