quick opinion here
1) I assume it would be a good practice to close the conn in finally part,
2) I assume you're opening and closing the conn in the right place, but I guess I've come across this problem when oracle runs out of memory either on dynamic memory or physical(out of space) and it closes the connection (hard to expect from oracle but it happens) it usually happens on expensive queries or those that return millions of rows which leads to revisiting the queries. check processes and run diagnostics on oracle itself to see what's the status of processes when this happens
does oracle log has anything more to say i.e. error number? cause it would not close a conn without a legitimate error , check the log, it might give some guidance