diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiHandleManager.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiHandleManager.java index d4db5bd8317..77e2eba5eaa 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiHandleManager.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiHandleManager.java @@ -9,6 +9,8 @@ public interface JdbiHandleManager { Handle get(); + boolean handleExists(); + void clear(); default ThreadFactory createThreadFactory() { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiTransactionManager.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiTransactionManager.java index 621adf0350e..8449716bea5 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiTransactionManager.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/JdbiTransactionManager.java @@ -94,13 +94,9 @@ public class JdbiTransactionManager { } public void terminateHandle() { - if (IN_TRANSACTION_HANDLES.contains(handleManager.get().hashCode())) { + if (handleManager.handleExists()) { + IN_TRANSACTION_HANDLES.remove(handleManager.get().hashCode()); handleManager.clear(); } - IN_TRANSACTION_HANDLES.remove(handleManager.get().hashCode()); - } - - public boolean containsHandle(int hashCode) { - return IN_TRANSACTION_HANDLES.contains(hashCode); } } diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/LinkedRequestScopedJdbiHandleManager.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/LinkedRequestScopedJdbiHandleManager.java index b5527351707..f19d52ae86a 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/LinkedRequestScopedJdbiHandleManager.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/LinkedRequestScopedJdbiHandleManager.java @@ -57,6 +57,12 @@ class LinkedRequestScopedJdbiHandleManager implements JdbiHandleManager { return handle; } + @Override + public boolean handleExists() { + // TODO + return false; + } + @Override public void clear() { String parent = getConversationId(); diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/ManagedHandleInvocationHandler.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/ManagedHandleInvocationHandler.java index 7bc80bb0dec..4ad34267746 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/ManagedHandleInvocationHandler.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/ManagedHandleInvocationHandler.java @@ -38,23 +38,26 @@ public class ManagedHandleInvocationHandler implements InvocationHandler { } private Object handleInvocation(Method method, Object[] args) throws Throwable { - Handle handle = JdbiUnitOfWorkProvider.getInstance().getHandle(); - LOG.debug( - "{}.{} [{}] Thread Id [{}] with handle id [{}]", - method.getDeclaringClass().getSimpleName(), - method.getName(), - underlying.getSimpleName(), - Thread.currentThread().getId(), - handle.hashCode()); - if (CollectionDAO.class.isAssignableFrom(underlying) && method.isAnnotationPresent(CreateSqlObject.class)) { return getWrappedInstanceForDaoClass(method.getReturnType()); } else { - if (!JdbiTransactionManager.getInstance().containsHandle(handle.hashCode())) { + Object dao; + if (JdbiUnitOfWorkProvider.getInstance().getHandleManager().handleExists()) { + Handle handle = JdbiUnitOfWorkProvider.getInstance().getHandle(); + LOG.debug( + "{}.{} [{}] Thread Id [{}] with handle id [{}]", + method.getDeclaringClass().getSimpleName(), + method.getName(), + underlying.getSimpleName(), + Thread.currentThread().getId(), + handle.hashCode()); + + dao = handle.attach(underlying); + } else { // This is non-transactional request - handle.getConnection().setAutoCommit(true); + dao = JdbiUnitOfWorkProvider.getInstance().getHandleManager().getJdbi().onDemand(underlying); } - Object dao = handle.attach(underlying); + try { return method.invoke(dao, args); } catch (Exception ex) { diff --git a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/RequestScopedJdbiHandleManager.java b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/RequestScopedJdbiHandleManager.java index bf2ce23d24f..4858404918f 100644 --- a/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/RequestScopedJdbiHandleManager.java +++ b/openmetadata-service/src/main/java/org/openmetadata/service/jdbi3/unitofwork/RequestScopedJdbiHandleManager.java @@ -30,6 +30,11 @@ class RequestScopedJdbiHandleManager implements JdbiHandleManager { return handle; } + @Override + public boolean handleExists() { + return threadLocal.get() != null; + } + @Override public void clear() { Handle handle = threadLocal.get();