Re: Reestablishing a db connection after a network failure

From: John C. Bollinger <jobollin_at_indiana.edu>
Date: Thu, 29 Apr 2004 08:45:38 -0500
Message-ID: <c6r0u4$6h9$1_at_hood.uits.indiana.edu>


Followups directed to comp.lang.java.programmer.

Pandis Ippokratis wrote:

> I have the following problem: I am implementing a server in Java and
> I use jdbc to connect to an Oracle 9.0.2 db. All seem to work fine,
> but when I intensionally cause a network failure (i.e. I remove the
> network cable) I get the following exception:
>
> java.sql.SQLException: Io exception: Connection reset by peer: socket
> write error
>
> I plug the cable again and I want to reset the java.sql.Connection but
> this seems to not work. Any suggestions?

There may be an option you can use when you set up the connection that will instruct the driver to attempt to reconnect automatically. The details and implications should be considered carefully. The MySQL JDBC driver distributed by MySQL has such a feature, although I'm not sure whether it handles all cases of connection interruption.

Alternatively, you can wrap the Connection provided by your driver in an object that handles the details of this scenario, which might include obtaining a new Connection to replace the interrupted one. If you make this new object implement Connection itself (and delegate to the internal collection) then it would be a drop-in replacement. You must again be careful to consider all the implications, however. For instance, there are various aspects of DB-side state that are tied to specific connections; in particular, transactions. There are also Java-side entities that are tied to specific Connections and would require considerable additional work to support transparently -- most particularly Statements and ResultSets.

The best choice may be to better isolate the DB interactions from the rest of your code so that you can handle exceptions in a sensible way but in a single place. Implement the Data Access Object pattern, for instance, and make your data access objects sufficiently smart. If you need to do so then put a facade around more complicated DB access activity that knows how to deal with these problems (and others). This could all be implemented with EJB, which would have some advantages, but could also be implemented in normal Java code.

John Bollinger
jobollin_at_indiana.edu Received on Thu Apr 29 2004 - 15:45:38 CEST

Original text of this message