Bonjour,
avant de rentrer dans le vif du sujet, voici ma question :
Q : Comment faire pour qu'une createNamedQuery ne soit pas transactionnelle ?
Alors voila, j'ai deux gros souci de performance.
J'ai un Entity MapObject qui possède une collection de Cells qui elles même possède des relations avec d'autres Entity.
Ainsi lorsque je fais une createNamedQuery pour récupérer toutes les Cells, je remarque tous les objets associés à l'Entity Cells sont rapportés.
Résultat, la requête devient lourde. Mais à la rigueur, cela reste supportable.
Le plus ennuyeux, c'est que j'ai l'impression que cette createNamedQuery s'effectue dans une transaction !
Ainsi
lorsque 1 client effectue la requête le résultat s'affiche en 1800 ms
lorsque 2 client effectue la requête le résultat s'affiche en 2000 ms
lorsque 3 client effectue la requête le résultat s'affiche en 4500 ms
ect ... c'est monté jusqu'à 5000 environs.
Pourtant j'ai tout fait pour déclarer la méthode comme non transactionnelle !!
comme vous le voyez j'ai même essayé d'utiliser le cache ou de déclarer le résultat de la requête comme Read only mais rien ne fait.
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 @TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED) public List<Cells> getROMapObjectCells(int mapId, int xmin, int xmax, int ymin, int ymax) { Logger logger = Logger.getLogger(MapObjectManager.class); try { long start = System.currentTimeMillis(); Query query = entityManager.createNamedQuery("getAllCellsForAmap"); query.setParameter(1, mapId); query.setParameter(2, xmin); query.setParameter(3, xmax); query.setParameter(4, ymin); query.setParameter(5, ymax); List<Cells> result = query.getResultList(); logger.info("requete executée en " + (System.currentTimeMillis() - start) + " ms"); // query.setHint("org.hibernate.cacheMode", CacheMode.NORMAL); query.setHint("org.hibernate.readOnly", true); return result; } catch(Exception e) { e.printStackTrace(); return null; } }
Si Deux utilisateur exécutent la requête, l'un doit attendre la libération des ressources.
Je planche sur le problème depuis 2 jours, et j'ai tout essayé.
avez vous une idée ?
Pour info, je travaille sur un AMD Athlon 64 dual core 1,80 GHz.
Pensez vous que mon application s'exécutera plus rapidement sur mon P4 3GHz ? (pas encore testé faut que je la réinstalle)
merci grandement !!
Partager