Нужно выявить недостатки описанного тут решения.
Кратко и для Ъ
public interface Function<Y, X> {
Y exec(X x);
}
public final class SqlContext {
private static final ThreadLocal<SqlContext> THREAD_LOCAL = new ThreadLocal<SqlContext>();
private final Connection connection;
private SqlContext() {
//TODO initialize connection
connection = null;
}
public static<T> T execute(Function<T, Connection> function) throws Throwable {
SqlContext sqlContext = THREAD_LOCAL.get();
boolean weOpened = (sqlContext == null);
if(weOpened) {
sqlContext = new SqlContext();
THREAD_LOCAL.set(sqlContext);
}
try {
T result = function.exec(sqlContext.connection);
sqlContext.commit();
return result;
} catch(Throwable t) {
sqlContext.rollback();
throw t;
} finally {
if(weOpened) {
THREAD_LOCAL.remove();
sqlContext.close();
}
}
}
// где то тут реализация commit rollback и close
}
Цель сабжа - использовать только одно sql соединение на всю страницу не передавая его явно в бины (которых на странице может быть десяток и они могут друг друга вызывать) и гарантированно закрывая сие по окончании рендеринга страницы.