Ma configuration est: JBOSS AS 7.1.1 et PostGreSqlinsert trop long
Quand il n'y a pas ou très moins (quelques centaines) enregistrements de la table, mes insertions/mises à jour complète très rapide. Mais lorsque le nombre d'enregistrements atteint quelques milliers, les insertions ou mises à jour prennent énormément de temps. Par exemple: l'insertion d'un enregistrement prend plus de 1 ou 2 secondes.
Vous ne savez pas où est le problème ou par où commencer.
mon code pour mettre à jour la base de données ressemble à ceci -
public long updateRecord(long id, List<MyData> myDataList) {
Event eventFromDB = findById(id).get(0);
List<MyData> myDataListFromDB = eventFromDB.getMyData();
for(MyData myData : myDataList) {
myDataListFromDB.add(myData);
}
em.merge(eventFromDB);
return myDataList.size();
}
Je suis un débutant et ont mis en place le jboss comme au meilleur de ma connaissance.
Je n'ai effectué aucun réglage de configuration sur JBOSS AS ou sur PostGreSQL.
Le JBOSS AS s'exécute en mode autonome à l'aide du fichier de configuration standalone-full.xml.
Merci d'avance.
jbossql=# \d event_mydata
Table "public.event_mydata"
Column | Type | Modifiers
-----------------+------------------------+-----------
event_id | bigint | not null
date_time | character varying(255) |
secs_since_1970 | double precision |
value | real |
Foreign-key constraints:
"fkcf2bc134ec016855" FOREIGN KEY (event_id) REFERENCES event(id)
Et la liste est une collection d'éléments
@ElementCollection
private List<MyData> myData;
public List<MyData> getMyData() {
return myData;
}
combien d'enregistrements sont généralement dans la collection myDataList? Vous récupérez la collection MyData à partir de eventFromDb pour chaque objet MyData que vous souhaitez ajouter. Au lieu de cela, vous pouvez récupérer cette collection une fois et y ajouter tous les éléments. Vous devez également vérifier si la table contenant les informations MyData a un index sur la clé étrangère pour son association à la table contenant les données d'événement. Si non, cela seul expliquerait pourquoi votre méthode prend si longtemps à compléter. –
Normalement, je dirais "utiliser le support du protocole COPY de PgJDBC pour charger les enregistrements par lots" mais je ne pense pas que vous puissiez vraiment le faire via JPA. Il est possible que vous obteniez de meilleurs résultats en faisant un 'getMyData(). AddAll (myDataList)' mais il se chargera de faire de nombreuses petites insertions, ce qui sera encore lent, surtout si vous avez beaucoup de temps à aller-retour entre DB et appserver. –
similaire, peut se référer - http://stackoverflow.com/a/10995063/366964 –