Estávamos tendo problemas semelhantes para operações de longa duração. A operação seria iniciada (e também fez seu trabalho e terminou), mas a ligação nunca retornou. Eventualmente, conseguimos rastrear isso até um firewall fechando a conexão com o servidor Oracle.
Poderíamos evitar isso usando o parâmetro SQLNET.EXPIRE_TIME no servidor, que periodicamente "pingaria" um cliente e assim impediria que o firewall fechasse a porta. Talvez isso ajude no seu caso também.