J'ai un problème plutôt ennuyeux. Dans le morceau de code ci-dessous, j'essaie d'insérer une nouvelle ligne dans la table "RevisionDispersion" dans ma base de données. Cependant, chaque fois que j'appelle stmt.executeUpdate() le programme se bloque et il n'y a plus de transaction dans la base de données. Peu importe combien de temps j'attends; la base de données ne sera tout simplement pas mise à jour. Voici le code d'intérêt:Application Java SQL Server bloquée sur statement.executeUpdate()
private static final String INSERT_DISPERSION = "insert into RevisionDispersion("
+ Assignments.ID + ", "
+ Persons.EMAIL + ", "
+ Handins.ID + ")"
+ " values(?, ?, ?)";
public static void disperse(DataSource source, Assignment assignment) throws Exception
{
List<String> handins = assignment.getHandins();
//used to decide who checks which assignment
int maxRNG = Math.max(1, handins.size()/assignment.getPeerCount());
int rng = new Random().nextInt(maxRNG);
PreparedStatement stmt = null;
Connection con = null;
try{
//Get the connection, set it to TRANSACTION_SERIALIZABLE and set autocommit to false
con = source.getConnection();
configureConnection(con);
//Prepare the statement to insert the new dispersion
stmt = con.prepareStatement(INSERT_DISPERSION);
stmt.setString(1, assignment.getID());
//Iterate over all hand-ins and decide from which peer a peer receives feedback
for(int i = 0; i < handins.size(); i++)
{
HandIn handin = new HandIn(source.getConnection(), handins.get(i));
String student = handin.getEmail();
stmt.setString(2, student);
for(int j = 1; j <= assignment.getPeerCount(); j++)
{
HandIn otherHandin = new HandIn(source.getConnection(), handins.get(j * rng));
stmt.setString(3, otherHandin.getId());
stmt.executeUpdate();
}
}
con.commit();
}catch(Exception e){
throw e;
}finally{
closeQuietly(con, stmt);
}
}
//This method is originally in the DBAO class, but I put it here for you folks.
protected static void configureConnection(Connection connection) throws SQLException
{
connection.setAutoCommit(false);
connection.setTransactionIsolation(Connection.TRANSACTION_SERIALIZABLE);
}
Ce problème ne se produit pas ailleurs dans l'application. Chaque fois que j'exécute l'instruction SQL dans SQL Server Management Studio, avec des paramètres identiques, elle ne reste pas bloquée et insère les nouvelles lignes correctement. Après avoir supprimé les lignes et essayé la même chose dans l'application, il est bloqué.
Quelqu'un peut-il me diriger dans la bonne direction de ce qui ne va pas? J'ai essayé pendant 3 heures d'affilée maintenant ...
Stuff J'ai déjà essayé
-Utiliser stmt.addBatch() plutôt que executeUpdate() (n'a pas fait une différence. Il se coincent à executeBatch())
-Vérifiez si toutes les connexions sont correctement fermées; elles sont.
-Vérifier si d'autres déclarations/resultsets sont encore ouvertes que l'utilisation de la table RevisionDispersion (il n'y en a pas encore ouvert. Même s'il y avait, ne devrait pas faire une différence que je pense?)
supprimer -Complètement la base de données et définir back up
Une chance'handins.size() 'pourrait augmenter pendant l'exécution? Je vais enregistrer cette valeur dans une variable en dehors de la boucle. – Horaciux
@Horaciux Non, n'augmente pas pendant l'exécution. En dehors de cela: le programme se bloque au point qu'il appelle "stmt.executeUpdate()"). En d'autres termes: il n'effectue même pas une seule itération: p Merci pour la réponse :) – ImJustACowLol
@ImJustACowLol - Veuillez partager la requête que vous exécutez dans SQL Server Management Studio. Je crois que la requête 'Insert' utilisée directement dans le SSMS et dans le code est différente. –