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