Performanceprobleme bei der Nutzung von MySQL

Hier melden JVerein-Benutzer ihre Fehler

Moderator: heiner

Colin Finck
Beiträge: 24
Registriert: Freitag 5. März 2010, 20:30

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von Colin Finck »

Colin Finck hat geschrieben:Kann noch nicht mit Sicherheit sagen, dass dies durch den Patch verursacht wurde, aber zumindest weisen alte JVerein-Versionen dieses Problem nicht auf.
Okay, habe es jetzt ausprobiert und das Problem besteht auch ohne den Patch in JVerein 1.4.0.
Ist das ein Bug oder ein Feature? :-)

In jedem Fall kannste meinen Patch also wie im letzten Post beschrieben über Eclipse einchecken.

Grüße,

Colin
Benutzeravatar
heiner
Administrator
Beiträge: 4509
Registriert: Freitag 30. Oktober 2009, 16:44
JVerein-Version: aktuelle Entwicklerversion
Betriebssystem: W10
Kontaktdaten:

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von heiner »

Hallo Colin,

ich habe deinen Patch eingecheckt.

Bei dem von dir beschriebenen Verhalten handelt es sich um einen Bug. Siehe https://developer.berlios.de/bugs/?func ... up_id=7335.

Heiner
PS: Denkt daran, eure Vereine unter viewforum.php?f=3 vorzustellen.
Benutzeravatar
heiner
Administrator
Beiträge: 4509
Registriert: Freitag 30. Oktober 2009, 16:44
JVerein-Version: aktuelle Entwicklerversion
Betriebssystem: W10
Kontaktdaten:

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von heiner »

Ein Bugfix zu dem beschriebenen Problem habe ich gerade ins CVS eingecheckt.

Heiner
PS: Denkt daran, eure Vereine unter viewforum.php?f=3 vorzustellen.
Colin Finck
Beiträge: 24
Registriert: Freitag 5. März 2010, 20:30

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von Colin Finck »

Hallo nochmal,

nachdem ich jetzt lange Zeit meine selbstgepatchte JVerein-Version benutzt habe, wollte ich nun mal die öffentlich angebotene Entwicklerversion 268 ausprobieren.
Leider musste ich feststellen, dass dort immer noch die Performanceprobleme auftreten, obwohl sie lange nach dem vermeintlichen Einchecken des Patches erschien.

Als ich dann mal in den CVS geschaut habe, hab ich gesehen, dass mein Patch von damals gar nicht komplett eingecheckt wurde. Beispielsweise fehlt der entscheidende Teil in BuchungImpl.java, andere Dateien könnten auch betroffen sein.
Ich vermute stark, das hängt mit dem "Fuzz factor" zusammen, welchen man in Eclipse beim Anwenden von Patches einstellen kann. Keine Ahnung warum das so ist, aber mit einem höheren Wert wurde bei mir der Patch inklusive allen Dateien angewandt.

Es würde mich sehr freuen, wenn du den Patch von damals nochmal durchgehen und die fehlenden Teile einchecken könntest.
Sollte notfalls auch per Hand möglich sein.

Grüße,

Colin
Benutzeravatar
heiner
Administrator
Beiträge: 4509
Registriert: Freitag 30. Oktober 2009, 16:44
JVerein-Version: aktuelle Entwicklerversion
Betriebssystem: W10
Kontaktdaten:

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von heiner »

Hallo Colin,

stelle mir den Patch bitte als Datei zur Verfügung. Wenn du es als Code in das Posting einfügst, werden immer noch 4 Leerstellen vorgeschossen. Am besten gleich im Eclipse-Format. Falls das zuviel Mühe macht, kannst du mir den kompletten Quelltext auch zuschicken.

Heiner
PS: Denkt daran, eure Vereine unter viewforum.php?f=3 vorzustellen.
Colin Finck
Beiträge: 24
Registriert: Freitag 5. März 2010, 20:30

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von Colin Finck »

Eine E-Mail mit dem Patch ist unterwegs :-)

- Colin
Benutzeravatar
heiner
Administrator
Beiträge: 4509
Registriert: Freitag 30. Oktober 2009, 16:44
JVerein-Version: aktuelle Entwicklerversion
Betriebssystem: W10
Kontaktdaten:

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von heiner »

Patch ist bereits im CVS

Heiner
PS: Denkt daran, eure Vereine unter viewforum.php?f=3 vorzustellen.
Colin Finck
Beiträge: 24
Registriert: Freitag 5. März 2010, 20:30

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von Colin Finck »

Ich grabe mal den alten Thread wieder aus, da seit meinem Update von JVerein 2.0.1 auf 2.4.2 die Performanceprobleme zurückgekehrt sind.
Es ist schade, dass der MySQL-Support etwas stiefmütterlich behandelt wird, wo dies nun doch ein wiederkehrendes Problem ist.

Glücklicherweise scheint ein Fix recht einfach: Ein Diff von BuchungImpl.java 1.18 und der aktuellen 1.33 offenbart gleich, dass es wohl an der hinzugefügten Projekt-Zuordnung pro Buchung liegt. Diese Abfrage wird nicht gecacht und daher wieder pro angezeigter Buchung einmal ausgeführt, was über eine externe MySQL-Verbindung nur sehr schleppend erfolgen kann.

Mein alter Post enthält bereits eine Erklärung des Caches und wie mit wenigen Zeilen Code das Projekt-Fachobjekt gecacht werden könnte.
Es wäre schön, wenn da mal jemand kurz drüberschauen und einen Fix committen könnte. Leider fehlt mir dazu gerade eine funktionierende Eclipse-Umgebung.
Und wenn einer von euch das übernimmt, wird vielleicht bei der nächsten Änderung der BuchungImpl.java das Cachen von Objekten gleich mit berücksichtigt ;)

Beste Grüße,

Colin
Colin Finck
Beiträge: 24
Registriert: Freitag 5. März 2010, 20:30

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von Colin Finck »

Okay, hab jetzt mal den Debugger angeschmissen und mich mit Olaf in Verbindung gesetzt. Das Problem war diesmal leider nicht die neuen Fachobjekte, sondern die BuchungQuery.java, welche seit JVerein 2.0.1 hinzugekommen ist.
Laut Olaf's Aussage ist der dort verwendete ResultSetExtractor nur für einzelne Werte gedacht und nicht zum Lesen der kompletten Buchungstabelle. Daher kommen auch die gewaltigen Performanceprobleme bei der Verwendung von MySQL.

Folgender Patch löst das Problem, indem wieder wie früher ein DBIterator verwendet wird:

Code: Alles auswählen

### Eclipse Workspace Patch 1.0
#P jverein
Index: src/de/jost_net/JVerein/Queries/BuchungQuery.java
===================================================================
RCS file: /cvsroot/jverein/jverein/src/de/jost_net/JVerein/Queries/BuchungQuery.java,v
retrieving revision 1.13
diff -u -r1.13 BuchungQuery.java
--- src/de/jost_net/JVerein/Queries/BuchungQuery.java	2 Apr 2013 21:12:19 -0000	1.13
+++ src/de/jost_net/JVerein/Queries/BuchungQuery.java	30 Apr 2013 11:28:59 -0000
@@ -22,11 +22,9 @@
 package de.jost_net.JVerein.Queries;
 
 import java.rmi.RemoteException;
-import java.sql.ResultSet;
-import java.sql.SQLException;
 import java.text.MessageFormat;
-import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 import de.jost_net.JVerein.Einstellungen;
 import de.jost_net.JVerein.rmi.Buchung;
@@ -34,9 +32,9 @@
 import de.jost_net.JVerein.rmi.Konto;
 import de.jost_net.JVerein.rmi.Projekt;
 import de.jost_net.JVerein.util.JVDateFormatTTMMJJJJ;
+import de.willuhn.datasource.pseudo.PseudoIterator;
+import de.willuhn.datasource.rmi.DBIterator;
 import de.willuhn.datasource.rmi.DBService;
-import de.willuhn.datasource.rmi.ResultSetExtractor;
-import de.willuhn.logging.Logger;
 
 public class BuchungQuery
 {
@@ -52,13 +50,7 @@
 
   public String text;
 
-  private boolean and = false;
-
-  private String sql = "";
-
-  private ArrayList<Object> bedingungen = new ArrayList<Object>();
-
-  private ArrayList<Buchung> ergebnis;
+  private List<Buchung> ergebnis;
 
   private static final int ORDER_UMSATZID = 0;
 
@@ -133,94 +125,72 @@
     return text;
   }
 
-  public ArrayList<Buchung> get() throws RemoteException
+  public List<Buchung> get() throws RemoteException
   {
-    and = false;
-    bedingungen = new ArrayList<Object>();
-
     final DBService service = Einstellungen.getDBService();
-    ergebnis = new ArrayList<Buchung>();
-    sql = "select buchung.* ";
-    sql += "from buchung ";
-
-    addCondition("datum >= ? ", datumvon);
-    addCondition("datum <= ? ", datumbis);
+    
+    DBIterator it = service.createList(Buchung.class);
+    it.addFilter("datum >= ? ", datumvon);
+    it.addFilter("datum <= ? ", datumbis);
+    
     if (konto != null)
     {
-      addCondition("konto = ? ", konto.getID());
+      it.addFilter("konto = ? ", konto.getID());
     }
     if (buchungart != null)
     {
       if (buchungart.getNummer() == -1)
       {
-        addCondition("buchungsart is null ");
+        it.addFilter("buchungsart is null ");
       }
       else if (buchungart.getNummer() >= 0)
       {
-        addCondition("buchungsart = ? ", buchungart.getID());
+        it.addFilter("buchungsart = ? ", buchungart.getID());
       }
     }
 
     if (projekt != null)
     {
-      addCondition("projekt = ?", projekt.getID());
+      it.addFilter("projekt = ?", projekt.getID());
     }
 
     if (text.length() > 0)
     {
       String ttext = text.toUpperCase();
       ttext = "%" + ttext + "%";
-      addCondition(
-          "(upper(name) like ? or upper(zweck) like ? or upper(kommentar) like ?) ",
-          new Object[] { ttext, ttext, ttext });
+      it.addFilter("(upper(name) like ? or upper(zweck) like ? or upper(kommentar) like ?) ",ttext, ttext, ttext);
     }
     switch (order)
     {
       case ORDER_UMSATZID:
       {
-        sql += "ORDER BY umsatzid DESC";
+        it.setOrder("ORDER BY umsatzid DESC");
         break;
       }
       case ORDER_DATUM:
       {
-        sql += "ORDER BY datum";
+        it.setOrder("ORDER BY datum");
         break;
       }
       case ORDER_DATUM_AUSZUGSNUMMER_BLATTNUMMER:
       {
-        sql += "ORDER BY datum, auszugsnummer, blattnummer, id";
+        it.setOrder("ORDER BY datum, auszugsnummer, blattnummer, id");
         break;
       }
       case ORDER_DATUM_NAME:
       {
-        sql += "ORDER BY datum, name, id";
+        it.setOrder("ORDER BY datum, name, id");
         break;
       }
       case ORDER_ID:
       {
-        sql += "ORDER BY id";
+        it.setOrder("ORDER BY id");
         break;
       }
 
     }
-    Logger.debug(sql);
 
-    ResultSetExtractor rs = new ResultSetExtractor()
-    {
-      @Override
-      public Object extract(ResultSet rs) throws RemoteException, SQLException
-      {
-        ArrayList<Buchung> list = new ArrayList<Buchung>();
-        while (rs.next())
-        {
-          list.add((Buchung) service.createObject(Buchung.class,
-              rs.getString(1)));
-        }
-        return list;
-      }
-    };
-    ergebnis = (ArrayList<Buchung>) service.execute(sql, bedingungen.toArray(),
-        rs);
+    this.ergebnis = PseudoIterator.asList(it);
     return ergebnis;
   }
 
@@ -252,32 +222,4 @@
     return ergebnis.size();
   }
 
-  private void addCondition(String condition)
-  {
-    if (and)
-    {
-      sql += " AND ";
-    }
-    else
-    {
-      sql += "where ";
-    }
-    and = true;
-    sql += condition;
-  }
-
-  private void addCondition(String condition, Object obj)
-  {
-    addCondition(condition);
-    bedingungen.add(obj);
-  }
-
-  private void addCondition(String condition, Object[] obj)
-  {
-    addCondition(condition);
-    for (Object o : obj)
-    {
-      bedingungen.add(o);
-    }
-  }
 }
Index: src/de/jost_net/JVerein/gui/control/BuchungsControl.java
===================================================================
RCS file: /cvsroot/jverein/jverein/src/de/jost_net/JVerein/gui/control/BuchungsControl.java,v
retrieving revision 1.70
diff -u -r1.70 BuchungsControl.java
--- src/de/jost_net/JVerein/gui/control/BuchungsControl.java	28 Dec 2012 21:37:38 -0000	1.70
+++ src/de/jost_net/JVerein/gui/control/BuchungsControl.java	30 Apr 2013 11:28:59 -0000
@@ -26,6 +26,7 @@
 import java.text.ParseException;
 import java.util.ArrayList;
 import java.util.Date;
+import java.util.List;
 
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.widgets.Event;
@@ -1014,7 +1015,7 @@
 
     try
     {
-      final ArrayList<Buchung> buchungen = query.get();
+      final List<Buchung> buchungen = query.get();
 
       FileDialog fd = new FileDialog(GUI.getShell(), SWT.SAVE);
       fd.setText(JVereinPlugin.getI18n().tr("Ausgabedatei wählen."));
Index: src/de/jost_net/JVerein/io/BuchungAuswertungCSV.java
===================================================================
RCS file: /cvsroot/jverein/jverein/src/de/jost_net/JVerein/io/BuchungAuswertungCSV.java,v
retrieving revision 1.5
diff -u -r1.5 BuchungAuswertungCSV.java
--- src/de/jost_net/JVerein/io/BuchungAuswertungCSV.java	27 Oct 2012 19:53:41 -0000	1.5
+++ src/de/jost_net/JVerein/io/BuchungAuswertungCSV.java	30 Apr 2013 11:28:59 -0000
@@ -26,7 +26,7 @@
 import java.io.FileWriter;
 import java.io.IOException;
 import java.rmi.RemoteException;
-import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 
 import org.supercsv.cellprocessor.ift.CellProcessor;
@@ -48,7 +48,7 @@
 public class BuchungAuswertungCSV
 {
 
-  public BuchungAuswertungCSV(ArrayList<Buchung> list, final File file,
+  public BuchungAuswertungCSV(List<Buchung> list, final File file,
       ProgressMonitor monitor) throws ApplicationException
   {
 
Index: src/de/jost_net/JVerein/io/BuchungAuswertungPDF.java
===================================================================
RCS file: /cvsroot/jverein/jverein/src/de/jost_net/JVerein/io/BuchungAuswertungPDF.java,v
retrieving revision 1.14
diff -u -r1.14 BuchungAuswertungPDF.java
--- src/de/jost_net/JVerein/io/BuchungAuswertungPDF.java	15 Oct 2012 20:35:37 -0000	1.14
+++ src/de/jost_net/JVerein/io/BuchungAuswertungPDF.java	30 Apr 2013 11:28:59 -0000
@@ -27,6 +27,7 @@
 import java.io.IOException;
 import java.rmi.RemoteException;
 import java.util.ArrayList;
+import java.util.List;
 
 import com.itextpdf.text.BaseColor;
 import com.itextpdf.text.DocumentException;
@@ -186,7 +187,7 @@
   }
 
   private void createTableContent(Reporter reporter, Buchungsart bua,
-      ArrayList<Buchung> buchungen, boolean einzel) throws RemoteException,
+      List<Buchung> buchungen, boolean einzel) throws RemoteException,
       DocumentException
   {
     if (einzel)
Ich habe den Patch gegen V2_4_2 erstellt, er sollte aber auch auf HEAD anwendbar sein.
Bitte veröffentliche noch eine Version 2.4.3 mit diesem Patch, damit die 2.4-Serie wieder mit MySQL brauchbar wird.

Grüße,

Colin
Benutzeravatar
heiner
Administrator
Beiträge: 4509
Registriert: Freitag 30. Oktober 2009, 16:44
JVerein-Version: aktuelle Entwicklerversion
Betriebssystem: W10
Kontaktdaten:

Re: Performanceprobleme bei der Nutzung von MySQL

Beitrag von heiner »

Hallo Colin,

wenn ich den Patch anwende, erscheint die Meldung "Clipboard does not contain valid patch".

In Version 2.4 kann ich nicht mehr committen (Sticky tag). Daher wird es auch keine 2.4er Version mehr geben können.

Heiner
PS: Denkt daran, eure Vereine unter viewforum.php?f=3 vorzustellen.
Antworten