1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93
| public class Main {
private ResultSet executeQuery(final Statement st, final String query, int timeout) throws SQLException {
// Creation de l'élément Callable qui exécutera la requête dans un thread séparé
Callable<ResultSet> callable = new Callable<ResultSet>() {
// Méthode call() qui sera exécuté dans un autre thread.
public ResultSet call() throws SQLException {
return st.executeQuery(query);
}
};
// On lance l'exécution du thread
Future<ResultSet> future = Executors.newSingleThreadExecutor().submit(callable);
try {
// On attend que le thread soit terminé (pendant 'timeout' secondes)
// pour récupérer le ResultSet renvoyé par la méthode call() :
return future.get(timeout, TimeUnit.SECONDS);
} catch (ExecutionException e) {
// En cas d'exception retourné lors de l'exécution de la méthode call(),
// on récupère l'exception en cause et on la renvoit :
Throwable cause = e.getCause();
final SQLException sqlE;
if (cause instanceof SQLException) {
// Sous forme d'SQLException si c'en est une :
sqlE = (SQLException) cause;
} else {
// Ou bien on l'englobe dans une SQLException :
sqlE = new SQLException( "Exception occured : " + cause.getClass().getSimpleName() );
sqlE.initCause(cause);
}
throw sqlE;
} catch (Exception e) {
// Pour toutes les autres exceptions (normalement TimeoutException et InterruptedExcepton),
// on annule le traitement :
st.cancel();
// et on renvoit l'exception englobé dans une SQLException
SQLException sqlE = new SQLException("Statement interrupted due to " + e.getClass().getSimpleName());
sqlE.initCause(e);
throw sqlE;
}
}
public void requeteLongue() throws SQLException {
// Ouverture de la connection
Connection conn = DriverManager.getConnection("__ Tes info de Connection__");
try {
// Creation du statement
Statement st = conn.createStatement();
try {
// Execution de la requete SQL
ResultSet rs = executeQuery(st, "__ta requete SQL__", 30);
try {
// Copie des elements du ResultSet dans une List
while (rs.next()) {
// ...
// Traitement sur le ResultSet
// ...
}
} finally {
// Fermeture du ResultSet...
rs.close();
}
} finally {
// Fermeture du Statement...
st.close();
}
} finally {
//Fermeture de la Connection...
conn.close();
}
}
public static void main(String[] args) throws Exception {
Class.forName("__ton Driver JDBC ici__");
Main m = new Main();
m.requeteLongue();
}
} |
Partager