Ho cercato StackOverflow per una risposta ma non riesco a trovarne uno che non coinvolga Hibernate o qualche altro wrapper del database.La query Java MYSQL/JDBC restituisce dati obsoleti dalla cache Connessione
Sto utilizzando JDBC direttamente tramite il driver JDBC MYSQL 5.18 in un'app Java EE Tomcat 6. Sto memorizzando nella cache gli oggetti Connection, ma non memorizzando nella cache gli oggetti Statement. I ResultSet per la query restituiscono correttamente dati aggiornati alla prima esecuzione. Quando cambio alcune righe tramite PHPMyAdmin o qualche altro strumento esterno, rieseguo la query, ottengo dati obsoleti non aggiornati.
Sto usando normali istruzioni, non PreparedStatements. Ho provato ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE. Sto anche chiudendo il set di risultati. Questi non risolvono il problema. Ho anche provato ResultSet.refreshRows(), ma questo si traduce in un errore perché la query ha una clausola JOIN.
L'unica cosa che risolve chiaramente il problema è chiudere la connessione e riconnettersi al database, il che si traduce in un costo elevato per ogni tentativo di query.
C'è un modo per riutilizzare Connections senza restituire dati obsoleti?
MODIFICA: al momento non sto utilizzando transazioni per le query.
Ecco il codice generale.
Connection conn; //created elsewhere and reused
...
String query = "SELECT p.ID as oid,rid,handle,summary,city,state,zip,t.name AS category
FROM profiles AS p
JOIN (terms AS t) ON (p.tid = t.ID)
WHERE p.ID = 1";
ResultSet resultSet;
Statement s;
synchronized (conn)
{
s = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
resultSet = s.executeQuery(query);
}
//Iterate over the results using .next() and copy data to another data structure
List retval = getResults(resultSet);
s.close();
Grazie per l'aiuto in anticipo!
Stai utilizzando le transazioni? Se sì, qual è il livello di isolamento? Sembra un po 'come il comportamento di REPEATABLE READ. –
Buona domanda. Nessuna transazione per queste query.Io uso le transazioni per gli aggiornamenti/inserti in generale, ma in questo caso particolare non sto eseguendo alcuna all'interno della stessa app in questo momento. Sto facendo gli AGGIORNAMENTI tramite uno strumento esterno che potrebbe buttare via le cose. Se si raccomandano transazioni come soluzione per evitare letture sporche, si prega di condividere una risposta. Inoltre, non ho impostato alcun livello di isolamento sulla connessione. Questo sarebbe il problema? – ricosrealm