hmm....

I think in that case you would have to set a Timeout on the 
connection.  You might want to test the connection upon context startup and 
if the connection times out, then throw an error or redirect to a static 
page saying that the app is temporarily unavailable.

Not sure what else you can do? Anyone?

Jake

At 01:00 PM 7/16/2002 -0700, you wrote:
>Yes, it is important to close your connections when you're done with them, 
>and this is considered in each of our methods.
>
>The problem we are seeing with the hung connections, however, occurs 
>before any SQLException has been thrown, anywhere in the servlet 
>engine.  In fact, even if the very first connection attempted at startup 
>is made to a server which is unavailable, every other connection will wait 
>until that first connection times out (and then throws its SQLException).
>
>Thank you for your consideration of the problem.
>
>-Paul
>
>
>On Monday, July 15, 2002, at 10:25 PM, Jacob Kjome wrote:
>
>>BTW, in the code below, I forgot to create the connection at the 
>>beginning of the try statment.  Just wanted to note that you will need to 
>>do that.
>>
>>conn = openConn();  //openConn() grabs the connection from a pool or 
>>creates a brand new connection
>>
>>Just insert that and whatever you need to do to open your connection at 
>>the beginning of the try statement below.
>>
>>jake
>>
>>
>>At 12:00 AM 7/16/2002 -0500, you wrote:
>>>HI Paul,
>>>
>>>You simply need to make sure that you've let go of your resources such 
>>>as connections, resultsets, etc....
>>>
>>>Here is some sample code for that...
>>>
>>>Connection conn = null;
>>>PreparedStatement pstmt = null;
>>>ResultSet rs = null;
>>>
>>>String query = "SELECT * FROM mytable";
>>>
>>>try {
>>>     pstmt = conn.prepareStatement(query);
>>>     rs = pstmt.executeQuery();
>>>
>>>     //do something with the ResultSet...
>>>
>>>     rs.close();
>>>     pstmt.close();
>>>     conn.close();
>>>}
>>>catch(SQLException e) {
>>>     System.out.println(e.getMessage());
>>>     throw e;
>>>}
>>>finally {
>>>     if (rs != null)    try { rs.close(); }    catch(Exception e2) {}
>>>     if (pstmt != null) try { pstmt.close(); } catch(Exception e3) {}
>>>     if (conn != null)  try { conn.close(); } catch(Exception e4) {}
>>>}
>>>
>>>
>>>The key here is that if a SQLException is raised in the try statement, 
>>>then the ResultSet, PreparedStatement, and Connection will not be 
>>>successfully closed.  In order to guarantee that they get closed, you 
>>>need to have the finally statement which is guaranteed to run no matter 
>>>what.   Try that and I bet your connections won't get locked up until timeout.
>>>
>>>Jake
>>>
>>>
>>>At 02:27 PM 7/15/2002 -0700, you wrote:
>>>>Sorry it's been a week since you sent this message...  Too much traffic 
>>>>here for me to keep up.  This problem is the only reason I'm subscribed 
>>>>to this list at all.  I normally only follow -dev (and if I could point 
>>>>to a specific problem in Tomcat I'd ask there instead).
>>>>
>>>>I have this problem with all JDBC accesses from Tomcat.  At first I was 
>>>>using a MySQL database call on every page, and found that if I accessed 
>>>>a second MySQL server which became unavailable, every call to the first 
>>>>one would be held up until it timed out, even in other contexts.  Then 
>>>>I discovered that we had the same problem when accessing a MS-SQL server.
>>>>If the MS-SQL server was unavailable, every other page on the site 
>>>>(each of them containing the call to MySQL) would wait until the MS-SQL 
>>>>connection timed out.  Finally, we incorporated an Oracle connection 
>>>>with the same results.  Any JDBC call to a database which is 
>>>>unavailable holds up all other connections on the servlet engine.
>>>>
>>>>This is an embarrassing threading issue.
>>>>
>>>>Although we asked for help on this list (and received some 
>>>>well-thought-out responses from Bill Barker) we were unable to resolve 
>>>>the problem.
>>>>Our current hack for this is:
>>>>
>>>>1) DriverManager.setLoginTimeout(CONNECTION_TIMEOUT);
>>>>(The default timeout is extraordinarily long and for us a few seconds 
>>>>will do for any one of the databases)
>>>>
>>>>2) A connection wrapper, so that instead of calling 
>>>>DriverManager.getConnection(connectionURL,ID,Pass) we call
>>>>DBConnWrapper.getConnection(connectionURL,ID,Pass) and the wrapper 
>>>>remembers when a connection has failed and on each request for a 
>>>>connection does
>>>>if(!databases.containsKey(DB) || (new Date()).getTime() - 
>>>>((Date)(databases.get(DB))).getTime() > RETRY_INTERVAL)
>>>>
>>>>If you come up with a better answer, let me know.  Of course, it's 
>>>>possible that you have a different problem than we do, but it sounds similar.
>>>>
>>>>Paul
>>>>Unix System Admin/Webmaster
>>>>Seattle Public Schools
>>>>
>>>>For Reference:
>>>>
>>>>On Monday, July 8, 2002, at 11:05 AM, Bill D wrote:
>>>>>Let me first set up my situation.  On my server, I
>>>>>have two webapps running, webapp A and webapp B.
>>>>>Webapp A uses JDBC Thin driver to contact an Oracle
>>>>>database at remote location 1.  Webapp B uses JDBC
>>>>>Thin driver to contact an Oracle database at remote
>>>>>location 2.
>>>>>
>>>>>If the internet connection at remote location 1 goes
>>>>>down, the attempt to connect to that database has the
>>>>>expected result of a connection to that IP in the
>>>>>SYN_SENT state in the netstat output on the server.
>>>>>
>>>>>While this connection is in the SYN_SENT state, any
>>>>>requests to webapp B that need to call the other
>>>>>database at location 2 which is still up and running
>>>>>are put on hold.  Visitors to that site are left
>>>>>staring at a blank screen until the first connection
>>>>>from webapp A to location 1 times out.
>>>>>
>>>>>Seeing as how these are 2 seperate webapps connecting
>>>>>to 2 seperate remote locations, I did not expect the
>>>>>behavior to occur in a fashion where one will block
>>>>>the other.  The behavior I expected was that they
>>>>>would operate independantly of each other, and webapp
>>>>>B would continue to work at a normal pace no matter
>>>>>what is occurring with webapp A.  Am I looking at this
>>>>>wrong?  Any help would be greatly appreciated.
>>>>
>>>>
>>>>--
>>>>To unsubscribe, e-mail:   <mailto:tomcat-user->>> 
>>>>[EMAIL PROTECTED]>
>>>>For additional commands, e-mail: <mailto:tomcat-user->>> 
>>>>[EMAIL PROTECTED]>
>
>
>--
>To unsubscribe, e-mail:   <mailto:[EMAIL PROTECTED]>
>For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>

Reply via email to