1

I have read so many posts

5 things you don't know about synchronization
Avoid synchronized this
Synchronized method access in java

and I am bit familiar with the possible cases because of which deadlock can occur but I was surprised to see deadlock in following code, what exactly is causing it, ??? a big question mark for me ???

My Code:

public class MySqlDB 
{
    private Connection connection = null;
    //private Statement statement = null;
    private DataSource datasource = null;
    private Object lockOnTransactionSql = new Object();

    public MySqlDB(String username, String password) 
    {           
        PoolProperties p = new PoolProperties();            
        p.setUrl("jdbc:mysql://localhost:3306/test?autoReconnect=true");
        p.setUsername(username);
        p.setPassword(password);
        p.setDriverClassName("org.mariadb.jdbc.Driver");            
        datasource = new DataSource();
        datasource.setPoolProperties(p);
    }

    private synchronized Statement getStatement() throws SQLException //THIS FUNCTION SOME TIME GOES IN LOCK MODE AND WAITING FOR HOURS BUT IT NEVER RETRUNS
    {       
        if(connection==null || connection.isClosed())
        {
            if(connection != null)
                connection.close();
            connection = datasource.getConnection();
        }
        return connection.createStatement();        
    }

    public void ProcessTransactionSql(ArrayList<String> queries) throws Exception
    {
        synchronized (lockOnTransactionSql) 
        {
            Statement statement = null;
            Connection connection = null;
            try
            {
                connection = datasource.getConnection();                
                connection.setAutoCommit(false);
                statement = connection.createStatement();
                for (String query : queries) 
                    statement.execute(query);
                connection.commit();
            }
            catch (Exception e)
            {
                connection.rollback();
                throw e;
            }
            finally
            {
                connection.setAutoCommit(true);         
                statement.close();              
                connection.close();
            }
        }
    }

    public ResultSet ProcessSelectSql(String sql) throws Exception 
    {   
        return  getStatement().executeQuery(sql);
    }

    public boolean ProcessUpdateSql(String sql) throws Exception
    {
        Statement st = null;
        Connection connection = null;
        try
        {           
            connection = datasource.getConnection();
            st = connection.createStatement();
            return st.execute(sql);
        }
        finally
        {       
            st.close();
            connection.close();
        }
    }
}

In the above code ProcessSelectSql, ProcessTransactionSql and ProcessUpdateSql are functions which are invoked parallely from variuos functions but after running for few hours or days on linux machine the deadlock occurs.
Observed that getStatement was the function which never returns the statement.

My question is what can be possible cause because of which deadlock can happen

Points to highlight:

  • I have two runnable jar running on linux machine, which are using the same database test and same class MySqlDB to do various opeartions on database.
  • These two jar do communicate with each other.

EDIT I was able to recreate the deadlock and used command java -3 pid_of_java_jar to get the stack trace and it was

"RMI TCP Connection(597)-127.0.0.1" #160957 daemon prio=5 os_prio=0 tid=0x00007f5c6400e800 nid=0x9405 waiting for monitor entry [0x00007f5cd6a98000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.FileDB.GetFileDetails(SourceFile:3324)
    at com.mytest.service.RMIHandler.GetFileDetails(SourceFile:726)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$65(TCPTransport.java:683)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$2/1295046191.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

"RMI TCP Connection(590)-127.0.0.1" #160952 daemon prio=5 os_prio=0 tid=0x00007f5c64005000 nid=0xb9dd waiting for monitor entry [0x00007f5cd7ffc000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.FileDB.GetFileDetails(SourceFile:3324)
    at com.mytest.service.RMIHandler.GetFileDetails(SourceFile:726)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$65(TCPTransport.java:683)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$2/1295046191.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

"RMI TCP Connection(589)-127.0.0.1" #160951 daemon prio=5 os_prio=0 tid=0x00007f5c64001000 nid=0xa172 waiting for monitor entry [0x00007f5cdc434000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.FileDB.GetFileDetails(SourceFile:3324)
    at com.mytest.service.RMIHandler.GetFileDetails(SourceFile:726)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$65(TCPTransport.java:683)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$2/1295046191.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

"RMI TCP Connection(588)-127.0.0.1" #160950 daemon prio=5 os_prio=0 tid=0x00007f5c6400c000 nid=0x6809 waiting for monitor entry [0x00007f5cd6c9a000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.FileDB.GetFileDetails(SourceFile:3324)
    at com.mytest.service.RMIHandler.GetFileDetails(SourceFile:726)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$65(TCPTransport.java:683)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$2/1295046191.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

"RMI TCP Connection(534)-127.0.0.1" #160897 daemon prio=5 os_prio=0 tid=0x00007f5c64008800 nid=0xecc6 waiting for monitor entry [0x00007f5cd6997000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.FileDB.GetFileDetails(SourceFile:3324)
    at com.mytest.service.RMIHandler.GetFileDetails(SourceFile:726)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$65(TCPTransport.java:683)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$2/1295046191.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

"RMI TCP Connection(435)-127.0.0.1" #160801 daemon prio=5 os_prio=0 tid=0x00007f5c64002800 nid=0x94c1 waiting for monitor entry [0x00007f5cd6b99000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.FileDB.GetFileDetails(SourceFile:3324)
    at com.mytest.service.RMIHandler.GetFileDetails(SourceFile:726)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$65(TCPTransport.java:683)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$2/1295046191.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

"RMI TCP Connection(431)-127.0.0.1" #160793 daemon prio=5 os_prio=0 tid=0x00007f5c64007800 nid=0xfc2e waiting for monitor entry [0x00007f5cd7efb000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.DeviceDB.GetDeviceId(SourceFile:565)
    at com.mytest.service.RMIHandler.ProcessSyncCycle(SourceFile:698)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:323)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$65(TCPTransport.java:683)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$2/1295046191.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

"Thread-34026" #102332 daemon prio=5 os_prio=0 tid=0x00007f5c28006000 nid=0x7817 waiting for monitor entry [0x00007f5cd6d9d000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.AreaDB.GetDeviceArea(SourceFile:236)
    at com.mytest.service.ListMgr.SubmitJob(SourceFile:187)
    at com.mytest.service.ListMgr$2.run(SourceFile:137)
    at java.lang.Thread.run(Thread.java:745)

"Java2D Disposer" #37059 daemon prio=10 os_prio=0 tid=0x00007f5c2401a000 nid=0x4bbf in Object.wait() [0x00007f5cdccac000]
   java.lang.Thread.State: WAITING (on object monitor)
    at java.lang.Object.wait(Native Method)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:143)
    - locked <0x00000006cc9ffd18> (a java.lang.ref.ReferenceQueue$Lock)
    at java.lang.ref.ReferenceQueue.remove(ReferenceQueue.java:164)
    at sun.java2d.Disposer.run(Disposer.java:148)
    at java.lang.Thread.run(Thread.java:745)

"Thread-49" #146 daemon prio=5 os_prio=0 tid=0x00007f5c6c05e800 nid=0xd30c waiting for monitor entry [0x00007f5cdc8a9000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.UserDB.GetUsers(SourceFile:718)
    at com.mytest.service.CService.ProcessJob(SourceFile:553)
    at com.mytest.service.CService.ProcessJob(SourceFile:648)
    at com.mytest.service.ListMgr.run(SourceFile:98)
    at java.lang.Thread.run(Thread.java:745)

"Thread-48" #145 daemon prio=5 os_prio=0 tid=0x00007f5c6c03b800 nid=0xd30b waiting for monitor entry [0x00007f5cddaba000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:336)
    - waiting to lock <0x00000006d5c4d808> (a java.io.BufferedInputStream)
    at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:82)
    at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:92)
    at org.mariadb.jdbc.internal.common.packet.RawPacket.nextPacket(RawPacket.java:82)
    at org.mariadb.jdbc.internal.common.packet.SyncPacketFetcher.getRawPacket(SyncPacketFetcher.java:67)
    at org.mariadb.jdbc.internal.common.queryresults.StreamingSelectResult.next(StreamingSelectResult.java:85)
    at org.mariadb.jdbc.internal.common.queryresults.CachedSelectResult.createCachedSelectResult(CachedSelectResult.java:77)
    at org.mariadb.jdbc.internal.mysql.MySQLProtocol.createQueryResult(MySQLProtocol.java:815)
    at org.mariadb.jdbc.internal.mysql.MySQLProtocol.getResult(MySQLProtocol.java:951)
    at org.mariadb.jdbc.internal.mysql.MySQLProtocol.executeQuery(MySQLProtocol.java:982)
    at org.mariadb.jdbc.MySQLStatement.execute(MySQLStatement.java:280)
    - locked <0x00000006d5c4d0b8> (a org.mariadb.jdbc.internal.mysql.MySQLProtocol)
    at org.mariadb.jdbc.MySQLStatement.executeQuery(MySQLStatement.java:301)
    at org.mariadb.jdbc.MySQLStatement.executeQuery(MySQLStatement.java:360)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.FileDB.GetFilesToProcess(SourceFile:1880)
    at com.mytest.service.CService.SubmitJob(SourceFile:1093)
    at com.mytest.service.ListMgr$2.run(SourceFile:137)
    at java.lang.Thread.run(Thread.java:745)

"Thread-15" #46 prio=5 os_prio=0 tid=0x00007f5c30001000 nid=0xac80 waiting on condition [0x00007f5cdcbab000]
   java.lang.Thread.State: WAITING (parking)
    at sun.misc.Unsafe.park(Native Method)
    - parking to wait for  <0x00000006d5c4daa0> (a java.util.concurrent.locks.ReentrantReadWriteLock$NonfairSync)
    at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireQueued(AbstractQueuedSynchronizer.java:870)
    at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquire(AbstractQueuedSynchronizer.java:1199)
    at java.util.concurrent.locks.ReentrantReadWriteLock$WriteLock.lock(ReentrantReadWriteLock.java:943)
    at org.apache.tomcat.jdbc.pool.PooledConnection.lock(PooledConnection.java:609)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.returnConnection(ConnectionPool.java:893)
    at org.apache.tomcat.jdbc.pool.ProxyConnection.invoke(ProxyConnection.java:100)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109)
    at org.apache.tomcat.jdbc.pool.interceptor.AbstractCreateStatementInterceptor.invoke(AbstractCreateStatementInterceptor.java:61)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109)
    at org.apache.tomcat.jdbc.pool.interceptor.ConnectionState.invoke(ConnectionState.java:153)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109)
    at org.apache.tomcat.jdbc.pool.TrapException.invoke(TrapException.java:41)
    at org.apache.tomcat.jdbc.pool.JdbcInterceptor.invoke(JdbcInterceptor.java:109)
    at org.apache.tomcat.jdbc.pool.DisposableConnectionFacade.invoke(DisposableConnectionFacade.java:80)
    at com.sun.proxy.$Proxy0.close(Unknown Source)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:37)
    - locked <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.UserDB.GetUsers(SourceFile:718)
    at com.mytest.service.TService.a(SourceFile:38)
    at com.mytest.service.TService$2.run(SourceFile:301)
    at java.lang.Thread.run(Thread.java:745)

"Thread-14" #45 daemon prio=5 os_prio=0 tid=0x00007f5c5000d800 nid=0xa363 waiting for monitor entry [0x00007f5cdd5b5000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.DeviceDB.GetDeviceId(SourceFile:565)
    at com.mytest.service.MDeviceMap.a(SourceFile:41)
    at com.mytest.service.MDeviceMap$1.run(SourceFile:113)
    at java.lang.Thread.run(Thread.java:745)

"Thread-11" #37 prio=5 os_prio=0 tid=0x00007f5c6c03e000 nid=0x1dd4 waiting for monitor entry [0x00007f5cdcdad000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.FileDB.GetFilePath(SourceFile:3928)
    at com.mytest.service.SService.d(SourceFile:712)
    at com.mytest.service.SService.a(SourceFile:129)
    at com.mytest.service.SService.a(SourceFile:38)
    at com.mytest.service.SService$1.run(SourceFile:102)
    at java.lang.Thread.run(Thread.java:745)

"Thread-10" #36 prio=5 os_prio=0 tid=0x00007f5c6c03f000 nid=0x1dca waiting for monitor entry [0x00007f5cdceae000]
   java.lang.Thread.State: BLOCKED (on object monitor)
    at com.mytest.dbhelper.MySqlDB.getStatement(SourceFile:32)
    - waiting to lock <0x00000006c5e79580> (a java.lang.Object)
    at com.mytest.dbhelper.MySqlDB.ProcessSelectSql(SourceFile:466)
    at com.mytest.filemanager.DeviceDB.GetDevices(SourceFile:1674)
    at com.mytest.service.TService.ThService(SourceFile:171)
    at com.mytest.service.TService$1.run(SourceFile:135)
    at java.lang.Thread.run(Thread.java:745)

"PoolCleaner[1550089733:1450166181974]" #12 daemon prio=5 os_prio=0 tid=0x00007f5cfc625800 nid=0x1d94 runnable [0x00007f5cde9c1000]
   java.lang.Thread.State: RUNNABLE
    at java.net.SocketInputStream.socketRead0(Native Method)
    at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)
    at java.net.SocketInputStream.read(SocketInputStream.java:170)
    at java.net.SocketInputStream.read(SocketInputStream.java:141)
    at java.io.BufferedInputStream.read1(BufferedInputStream.java:284)
    at java.io.BufferedInputStream.read(BufferedInputStream.java:345)
    - locked <0x00000006d5c4d808> (a java.io.BufferedInputStream)
    at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:82)
    at org.mariadb.jdbc.internal.common.packet.buffer.ReadUtil.readFully(ReadUtil.java:92)
    at org.mariadb.jdbc.internal.common.packet.RawPacket.nextPacket(RawPacket.java:82)
    at org.mariadb.jdbc.internal.common.packet.SyncPacketFetcher.getRawPacket(SyncPacketFetcher.java:67)
    at org.mariadb.jdbc.internal.mysql.packet.MySQLRowPacket.getRow(MySQLRowPacket.java:86)
    at org.mariadb.jdbc.internal.common.queryresults.StreamingSelectResult.next(StreamingSelectResult.java:107)
    at org.mariadb.jdbc.internal.common.queryresults.StreamingSelectResult.close(StreamingSelectResult.java:123)
    at org.mariadb.jdbc.internal.mysql.MySQLProtocol.skip(MySQLProtocol.java:728)
    at org.mariadb.jdbc.internal.mysql.MySQLProtocol.close(MySQLProtocol.java:779)
    at org.mariadb.jdbc.MySQLConnection.close(MySQLConnection.java:249)
    at org.apache.tomcat.jdbc.pool.PooledConnection.disconnect(PooledConnection.java:331)
    at org.apache.tomcat.jdbc.pool.PooledConnection.release(PooledConnection.java:490)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.release(ConnectionPool.java:581)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.abandon(ConnectionPool.java:540)
    at org.apache.tomcat.jdbc.pool.ConnectionPool.checkAbandoned(ConnectionPool.java:958)
    at org.apache.tomcat.jdbc.pool.ConnectionPool$PoolCleaner.run(ConnectionPool.java:1347)
    at java.util.TimerThread.mainLoop(Timer.java:555)
    at java.util.TimerThread.run(Timer.java:505)

"VM Periodic Task Thread" os_prio=0 tid=0x00007f5cfc22a800 nid=0x1d92 waiting on condition 

JNI global references: 478

Heap
 PSYoungGen      total 181760K, used 117101K [0x000000076c980000, 0x000000077e500000, 0x00000007c0000000)
  eden space 180736K, 64% used [0x000000076c980000,0x0000000773bdb500,0x0000000777a00000)
  from space 1024K, 0% used [0x0000000777a00000,0x0000000777a00000,0x0000000777b00000)
  to   space 54784K, 0% used [0x000000077af80000,0x000000077af80000,0x000000077e500000)
 ParOldGen       total 443392K, used 274009K [0x00000006c5c00000, 0x00000006e0d00000, 0x000000076c980000)
  object space 443392K, 61% used [0x00000006c5c00000,0x00000006d6796760,0x00000006e0d00000)
 Metaspace       used 24224K, capacity 24486K, committed 24832K, reserved 1071104K
  class space    used 2128K, capacity 2213K, committed 2304K, reserved 1048576K
Community
  • 1
  • 1
Deepak Bhatia
  • 6,230
  • 2
  • 24
  • 58
  • 1
    use jstack -> it will print you if and where is the deadlock. I see here possible danger because you are using two different locks - intrinsic lock and lockOnTransactionSql lock. And I think this code is not sufficient to point a problem -> it depends on how this class is used. – Gaskoin Dec 03 '15 at 06:51
  • @Gaskoin thanks for reply, this class is used normally in all the function call it just that these 3 functions as I stated above are invoked normally – Deepak Bhatia Dec 03 '15 at 08:29

1 Answers1

0

two different applications residing in two different jars are accessing the getStatement() method which in turn creates a single Connection object created as an instance field of MySqlDB. Generally we should avoid sharing connections and get them from the pool for each request and close the connection after the work is complete. You can also try using new lock API and make use lock fairness and timeouts to avoid deadlocks. Yes, lock timeout exceptions need to be handled.

akki
  • 423
  • 2
  • 12