您的位置:首页 > 编程语言 > Java开发

JNDI(Java 命名和目录接口)(五)(附1)

2009-01-23 16:42 429 查看
Common Problems

Here are some common problems encountered with a web application which uses a database and tips for how to solve them.

Intermittent dB Connection Failures

Tomcat runs within a JVM. The JVM periodically performs garbage
collection (GC) to remove java objects which are no longer being used.
When the JVM performs GC execution of code within Tomcat freezes. If
the maximum time configured for establishment of a dB connection is
less than the amount of time garbage collection took you can get a db
conneciton failure.

To collect data on how long garbage collection is taking add the
-verbose:gc argument to your CATALINA_OPTS environment variable when
starting Tomcat. When verbose gc is enabled your
$CATALINA_BASE/logs/catalina.out log file will include data for every
garbage collection including how long it took.

When your JVM is tuned correctly 99% of the time a GC will take less
than one second. The remainder will only take a few seconds. Rarely, if
ever should a GC take more than 10 seconds.

Make sure that the db connection timeout is set to 10-15 seconds. For the DBCP you set this using the parameter maxWait.

Random Connection Closed Exceptions

These can occur when one request gets a db connection from the
connection pool and closes it twice. When using a connection pool,
closing the connection just returns it to the pool for reuse by another
request, it doesn't close the connection. And Tomcat uses multiple
threads to handle concurrent requests. Here is an example of the
sequence of events which could cause this error in Tomcat:

Request 1 running in Thread 1 gets a db connection.

Request 1 closes the db connection.

The JVM switches the running thread to Thread 2

Request 2 running in Thread 2 gets a db connection

(the same db connection just closed by Request 1).

The JVM switches the running thread back to Thread 1

Request 1 closes the db connection a second time in a finally block.

The JVM switches the running thread back to Thread 2

Request 2 Thread 2 tries to use the db connection but fails

because Request 1 closed it.

Here is an example of properly written code to use a db connection obtained from a connection pool:

Connection conn = null;

Statement stmt = null; // Or PreparedStatement if needed

ResultSet rs = null;

try {

conn = ... get connection from connection pool ...

stmt = conn.createStatement("select ...");

rs = stmt.executeQuery();

... iterate through the result set ...

rs.close();

rs = null;

stmt.close();

stmt = null;

conn.close(); // Return to connection pool

conn = null; // Make sure we don't close it twice

} catch (SQLException e) {

... deal with errors ...

} finally {

// Always make sure result sets and statements are closed,

// and the connection is returned to the pool

if (rs != null) {

try { rs.close(); } catch (SQLException e) { ; }

rs = null;

}

if (stmt != null) {

try { stmt.close(); } catch (SQLException e) { ; }

stmt = null;

}

if (conn != null) {

try { conn.close(); } catch (SQLException e) { ; }

conn = null;

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: