Usar um pool de conexões pode ajudar a resolver isso.
Aqui está uma postagem sobre como configurar um pool de conexões Você pode ter apenas uma sessão de hibernação por thread em java?
Aqui está outra postagem sobre várias bibliotecas de pool de conexão disponíveis.
pooling de conexão padrão de hibernação