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]>