diff --git a/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java b/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java index 535ad3dd5b..ef10b2206f 100644 --- a/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java +++ b/jdbc/src/java/org/apache/hive/jdbc/HiveConnection.java @@ -106,6 +106,7 @@ import java.util.Properties; import java.util.concurrent.Executor; import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.ReentrantLock; /** * HiveConnection. @@ -1481,6 +1482,7 @@ public TProtocolVersion getProtocol() { private static class SynchronizedHandler implements InvocationHandler { private final TCLIService.Iface client; + private final ReentrantLock lock = new ReentrantLock(true); SynchronizedHandler(TCLIService.Iface client) { this.client = client; @@ -1490,9 +1492,8 @@ public TProtocolVersion getProtocol() { public Object invoke(Object proxy, Method method, Object [] args) throws Throwable { try { - synchronized (client) { - return method.invoke(client, args); - } + lock.lock(); + return method.invoke(client, args); } catch (InvocationTargetException e) { // all IFace APIs throw TException if (e.getTargetException() instanceof TException) { @@ -1504,6 +1505,8 @@ public Object invoke(Object proxy, Method method, Object [] args) } } catch (Exception e) { throw new TException("Error in calling method " + method.getName(), e); + } finally { + lock.unlock(); } } }