2013-03-11 6 views
0

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; 
} 
+1

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. –

+0

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. –

+0

similaire, peut se référer - http://stackoverflow.com/a/10995063/366964 –

Répondre

1

Je pense que le problème est que l'utilisation d'un ElementCollection n'est pas une très bonne idée si l'on est de penser à peuplant de grandes quantités de données.

related issue here

Je re architecturées la base de données telle que je suis maintenant en utilisant un à plusieurs avec une relation birectional. Semble aider à insérer une nouvelle entrée dans la table enfant quand il y a déjà beaucoup de données dans la table enfant.

Espérons que cela aide quelqu'un.

Merci à tous pour regarder et répondre.