Bonjour,

J'ai encore besoin de votre science.

J'utilise hibernate dans mon application. Mais pour les très grand select, hibernate était gourmand en mémoire j'ai donc utilisé des "scrollableresult". Niveau mémoire c'était beaucoup mieux par contre les fichiers semblaient lockés le temps de parcourir la boucle et j'ai eu plusieurs plantages à cause de ça.

En résumé j'ai décidé d'utiliser du SQL "pur" plutot que d'utiliser hibernate.

J'en arrive à mon problème : j'ai un select qui est fort important (des milliers et des milliers de lignes) lorsque je parcours le resultset de ce select, je fais différents traitements et à certaines conditions je veux faire un update sur des lignes qui sont potentiellement dans le select de départ.

Pour faire le select : pas de problème.
Par contre lorsque l'update essaye de s'exécuter, mon système crache plus rien ne répond.

=> Commet dois je programmer le parcours de mon resultset et l'update dans celui-ci pour que ce soit fait proprement et sans problème de fichier bloquer comme j'avais avant et pas non plus d'erreur sur l'exécution de l'update comme j'ai maintenant... ?

Merci.

Extrait du code (PS j'ai essayé avec ResultSet.CONCUR_UPDATABLE, ResultSet.CONCUR_READONLY):

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
			Serv_Sql Serv2 = new Serv_Sql();
			Connection connection2=null;
			ResultSet rs2 = null ;
			PreparedStatement prepStat2 = null;
 
			sb2.append("SELECT QUELQUECHOSE DE LA TABLE FM et aussi d'une autre table");
 
			//des declarations de variable ici
			//...
			try{
				int count = 0;
				connection2 = DBUtils.getConnection(incom,"");
				prepStat2 =connection2.prepareStatement(sb2.toString(),ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_UPDATABLE);
				prepStat2.setString(1,param1);
				prepStat2.setString(2,param2);
				prepStat2.setString(3,param3);
				prepStat2.setString(4,param4);
				prepStat2.setInt(5, param5);
				rs2 = prepStat2.executeQuery();
 
				while(rs2.next()){
					get1 = rs2.getInt(1);
					get2 = rs2.getInt(2);
					get3 = rs2.getInt(3);
					actualYear = rs2.getInt(4);
 
			        if(rs2.isFirst()){	
			            //quelque_chose
			        }
 
					if(une condition){
						hqlUpdate =  new StringBuilder();	
						Session sessUpdate = HibernateUtil.getSessionFactory(incom).openSession();
						Transaction trans = sessUpdate.beginTransaction();
						System.out.println("UPDATE 1");
						hqlUpdate.append("update FM ")
								 .append("set truc = :pTruc, bidule = :pBidule ")
								 .append("where champs1 = :pchamps1 ")
								 .append("and champs2 = :pchamps2 ")
								 .append("and champs3 = :pchamps3 ")
								 .append("and champs4=:pchamps4 ")
								 .append("and champs5=:pchamps5 ")
								 .append("and champs6=:pchamps6 ");
 
 
 
						sessUpdate.createQuery(hqlUpdate.toString())
													 .setInteger("pTruc",truc)
													 .setInteger("pBidule",bidule)
													 .setString("pchamps1",valeur1)
													 .setString("pchamps2",valeur2)
													 .setString("pchamps3",valeur3)
													 .setString("pchamps4",valeur4)
													 .setDouble("pchamps5",valeur5)
													 .setInteger("pchamps6",valeur6)
													 .executeUpdate();
						System.out.println("UPDATE 1 AFTER EXE UPDATE");
						trans.commit();
						sessUpdate.close();
						System.out.println("UPDATE 1 AFTER SESS COLOSE");
					}
				}
 
			} catch (Exception sqle) {
				System.out.println("ERROR ["+sqle.getMessage()+"]");
			}finally{
	        	DBUtils.closeStatement(prepStat2);
				DBUtils.closeResultSet(rs2);
				DBUtils.closeConnection(connection2);
			}