J'ai récemment écrit et déployé une application Web Java sur un serveur et je trouve un problème inhabituel qui n'apparaissait pas lors du développement ou du test.Mise en commun de connexions avec Java et MySQL dans l'application Web Tomcat
Lorsqu'un utilisateur se connecte après si longtemps et affiche des données de la base de données, la page indique qu'il n'y a aucun enregistrement à afficher. Mais lors de l'actualisation de la page, les premiers enregistrements x sont affichés conformément aux règles de pagination.
Vérification des journaux, je trouve:
ERROR|19 09 2009|09 28 54|http-8080-4|myDataSharer.database_access.Database_Metadata_DBA| - Error getting types of columns of tabular Dataset 12
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception:
** BEGIN NESTED EXCEPTION **
java.io.EOFException
STACKTRACE:
java.io.EOFException
at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1956)
at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2368)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2867)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1616)
Et ainsi de suite pour plusieurs centaines de lignes.
L'application est actuellement définie pour environ 100 utilisateurs mais n'est pas encore pleinement utilisée. Il utilise la mise en commun de connexion entre les servlets Apache Tomcat/JSP et une base de données MySQL avec l'exemple de code suivant la formation de la disposition générale d'une opération de base de données, dont il existe généralement plusieurs par page:
// Gets a Dataset.
public static Dataset getDataset(int DatasetNo) {
ConnectionPool_DBA pool = ConnectionPool_DBA.getInstance();
Connection connection = pool.getConnection();
PreparedStatement ps = null;
ResultSet rs = null;
String query = ("SELECT * " +
"FROM Dataset " +
"WHERE DatasetNo = ?;");
try {
ps = connection.prepareStatement(query);
ps.setInt(1, DatasetNo);
rs = ps.executeQuery();
if (rs.next()) {
Dataset d = new Dataset();
d.setDatasetNo(rs.getInt("DatasetNo"));
d.setDatasetName(rs.getString("DatasetName"));
...
}
return d;
}
else {
return null;
}
}
catch(Exception ex) {
logger.error("Error getting Dataset " + DatasetNo + "\n", ex);
return null;
}
finally {
DatabaseUtils.closeResultSet(rs);
DatabaseUtils.closePreparedStatement(ps);
pool.freeConnection(connection);
}
}
t-il quelqu'un capable de conseiller un moyen de corriger ce problème? Je crois que cela est dû au fait que MySQL laisse les connexions d'interrogation de connexion ouvertes jusqu'à huit heures mais je ne suis pas certain.
Merci
Martin O'Shea.
Juste pour clarifier un point fait à propos de ma méthode de mise en commun de connexion, il est Oracle que j'utilise dans ma demande, mais une classe de mon propre comme suit:
package myDataSharer.database_access;
import java.sql.*;
import javax.sql.DataSource;
import javax.naming.InitialContext;
import org.apache.log4j.Logger;
public class ConnectionPool_DBA {
static Logger logger = Logger.getLogger(ConnectionPool_DBA.class.getName());
private static ConnectionPool_DBA pool = null;
private static DataSource dataSource = null;
public synchronized static ConnectionPool_DBA getInstance() {
if (pool == null) {
pool = new ConnectionPool_DBA();
}
return pool;
}
private ConnectionPool_DBA() {
try {
InitialContext ic = new InitialContext();
dataSource = (DataSource) ic.lookup("java:/comp/env/jdbc/myDataSharer");
}
catch(Exception ex) {
logger.error("Error getting a connection pool's datasource\n", ex);
}
}
public void freeConnection(Connection c) {
try {
c.close();
}
catch (Exception ex) {
logger.error("Error terminating a connection pool connection\n", ex);
}
}
public Connection getConnection() {
try {
return dataSource.getConnection();
}
catch (Exception ex) {
logger.error("Error getting a connection pool connection\n", ex);
return null;
}
}
}
I pense que la mention d'Oracle est due à moi en utilisant un nom similaire.
Pouvez-vous expliquer comment vous êtes arrivé à la conclusion que cela est dû à une erreur dans le regroupement de connexions? Je ne vois aucune indication de cela n'importe où ... –