Java--How to design robust server application given network failures
===

I have a server-based app that uses:
1. Database server (TCP)
2. JMS (ActiveMq) (TCP)
3. java.rmi.Remote (TCP?) for clients to talk to server, and for server to talk to client

What is involved in making the application robust if we unplug the network and the connections are dropped?  Currently, we have to restart the server, and restart the clients.

For example, when doing a java.rmi.Remote call and the TCP connection is dead, what specific exceptions to catch?  Similarly with JDBC calls, how to tell if we should reconnect?

In typical operations, is it normal for the TCP connection to be dropped?  What do typical systems do to recover?

