Close unnecessary connections (#13177)

This commit is contained in:
Mohit Yadav 2023-09-13 18:37:36 +05:30 committed by GitHub
parent 5a6310eff9
commit c5edf37cfe
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 30 additions and 18 deletions

View File

@ -9,6 +9,8 @@ public interface JdbiHandleManager {
Handle get(); Handle get();
boolean handleExists();
void clear(); void clear();
default ThreadFactory createThreadFactory() { default ThreadFactory createThreadFactory() {

View File

@ -94,13 +94,9 @@ public class JdbiTransactionManager {
} }
public void terminateHandle() { public void terminateHandle() {
if (IN_TRANSACTION_HANDLES.contains(handleManager.get().hashCode())) { if (handleManager.handleExists()) {
IN_TRANSACTION_HANDLES.remove(handleManager.get().hashCode());
handleManager.clear(); handleManager.clear();
} }
IN_TRANSACTION_HANDLES.remove(handleManager.get().hashCode());
}
public boolean containsHandle(int hashCode) {
return IN_TRANSACTION_HANDLES.contains(hashCode);
} }
} }

View File

@ -57,6 +57,12 @@ class LinkedRequestScopedJdbiHandleManager implements JdbiHandleManager {
return handle; return handle;
} }
@Override
public boolean handleExists() {
// TODO
return false;
}
@Override @Override
public void clear() { public void clear() {
String parent = getConversationId(); String parent = getConversationId();

View File

@ -38,23 +38,26 @@ public class ManagedHandleInvocationHandler<T> implements InvocationHandler {
} }
private Object handleInvocation(Method method, Object[] args) throws Throwable { 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)) { if (CollectionDAO.class.isAssignableFrom(underlying) && method.isAnnotationPresent(CreateSqlObject.class)) {
return getWrappedInstanceForDaoClass(method.getReturnType()); return getWrappedInstanceForDaoClass(method.getReturnType());
} else { } 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 // This is non-transactional request
handle.getConnection().setAutoCommit(true); dao = JdbiUnitOfWorkProvider.getInstance().getHandleManager().getJdbi().onDemand(underlying);
} }
Object dao = handle.attach(underlying);
try { try {
return method.invoke(dao, args); return method.invoke(dao, args);
} catch (Exception ex) { } catch (Exception ex) {

View File

@ -30,6 +30,11 @@ class RequestScopedJdbiHandleManager implements JdbiHandleManager {
return handle; return handle;
} }
@Override
public boolean handleExists() {
return threadLocal.get() != null;
}
@Override @Override
public void clear() { public void clear() {
Handle handle = threadLocal.get(); Handle handle = threadLocal.get();