Hallo!
Ich habe einen Jasper Report Server welcher über JDBC auf meinen SQL Server zugreift.
Mittels diesen Reportserver erstellen wir Auswertungen über Verkaufszahlung usw.
Sobald ich Abfragen mit einer großen Zeitspanne und einer hohen Verdichtung mache gibt es Probleme.
Es kommt zu einem Deadlock. Ich kann mir aber nicht erklären warum.
Im Management Studio funktioniert die Abfrage ganz normal.
Report Server:
ESX 5.1 VM
Centos 6.5
4x2,2 GHz
4 Gb RAM
4x15k SAS HDD Raid 10
10GB
Datenbankserver
Microsoft Server 2008 R2
Microsoft SQL Server 2008 R2
32 GB RAM
4x2,93 GHz Intel X5570
8x15k SAS
Die Abfrage
selectKunden.Zeit as Zeit,
Kunden.Verdichtung as Verdichtung,
Kunden.Kunden as Kunden,
Damen.Damen as Damen,
Herren.Herren as Herren,
Kinder.Kinder as Kinder
from
(select
COUNT(DISTINCT Bons.Id) as Kunden,
CAST(Bons.SaleDate as date) as Zeit ,
Bons.Verbucht as Verdichtung
fromBons,
Salon,
Mitarbeiter,
Bereich,
ArtikelVerkauf
where
Bons.SalonId=Salon.Id AND
Bons.Abgeschlossen=1 AND
Bons.Verbucht=1 AND
Bons.Mitarbeiter=0 AND
Bons.SaleDate < '03.08.2014' AND
Bons.SaleDate > '03.08.2013' AND
Mitarbeiter.ID=Bons.MitarbeiterId AND
Salon.BereichID=Bereich.IDAND
ArtikelVerkauf.BonId=Bons.Id AND
ArtikelVerkauf.Refund=0 AND
ArtikelVerkauf.Anzahlung=0 AND
ArtikelVerkauf.Verkaufsgutschein=0 AND
Bons.Mitarbeiter=0
group by
CAST(Bons.SaleDate as date),
Bons.Verbucht
) as Kunden FULL OUTER JOIN
(select
COUNT(DISTINCT Bons.Id) as Damen,
CAST(Bons.SaleDate as date) as Zeit ,
Bons.Verbucht as Verdichtung
fromBons,
Salon,
Mitarbeiter,
Bereich,
ArtikelVerkauf
where
Bons.SalonId=Salon.Id AND
Bons.Abgeschlossen=1 AND
Bons.Verbucht=1 AND
Bons.Mitarbeiter=0 AND
Bons.SaleDate < '03.08.2014' AND
Bons.SaleDate > '03.08.2013' AND
Mitarbeiter.ID=Bons.MitarbeiterId AND
Salon.BereichID=Bereich.IDAND
ArtikelVerkauf.BonId=Bons.Id AND
ArtikelVerkauf.Refund=0 AND
ArtikelVerkauf.Anzahlung=0 AND
ArtikelVerkauf.Verkaufsgutschein=0 AND
Bons.Dame=1
group by
CAST(Bons.SaleDate as date),
Bons.Verbucht
) as Damen ON Damen.Verdichtung=Kunden.Verdichtung and Damen.Zeit=Kunden.Zeit
FULL OUTER JOIN
(select
COUNT(DISTINCT Bons.Id) as Herren,
CAST(Bons.SaleDate as date) as Zeit ,
Bons.Verbucht as Verdichtung
fromBons,
Salon,
Mitarbeiter,
Bereich,
ArtikelVerkauf
where
Bons.SalonId=Salon.Id AND
Bons.Abgeschlossen=1 AND
Bons.Verbucht=1 AND
Bons.Mitarbeiter=0 AND
Bons.SaleDate < '03.08.2014' AND
Bons.SaleDate > '03.08.2013' AND
Mitarbeiter.ID=Bons.MitarbeiterId AND
Salon.BereichID=Bereich.IDAND
ArtikelVerkauf.BonId=Bons.Id AND
ArtikelVerkauf.Refund=0 AND
ArtikelVerkauf.Anzahlung=0 AND
ArtikelVerkauf.Verkaufsgutschein=0 AND
Bons.Herr=1
group by
CAST(Bons.SaleDate as date),
Bons.Verbucht
) as Herren ON Herren.Verdichtung=Kunden.Verdichtung and Herren.Zeit=Kunden.Zeit
FULL OUTER JOIN
(select
COUNT(DISTINCT Bons.Id) as Kinder,
CAST(Bons.SaleDate as date) as Zeit ,
Bons.Verbucht as Verdichtung
fromBons,
Salon,
Mitarbeiter,
Bereich,
ArtikelVerkauf
where
Bons.SalonId=Salon.Id AND
Bons.Abgeschlossen=1 AND
Bons.Verbucht=1 AND
Bons.Mitarbeiter=0 AND
Bons.SaleDate < '03.08.2014' AND
Bons.SaleDate > '03.08.2013' AND
Mitarbeiter.ID=Bons.MitarbeiterId AND
Salon.BereichID=Bereich.IDAND
ArtikelVerkauf.BonId=Bons.Id AND
ArtikelVerkauf.Refund=0 AND
ArtikelVerkauf.Anzahlung=0 AND
ArtikelVerkauf.Verkaufsgutschein=0 AND
Bons.Kind=1
group by
CAST(Bons.SaleDate as date),
Bons.Verbucht
) as Kinder ON Kinder.Verdichtung=Kunden.Verdichtung and Kinder.Zeit=Kunden.Zeit
order by
Zeit,
Verdichtung
Der Stacktrace
2014-08-06 10:28:24,922 ERROR AsyncJasperPrintAccessor,pool-4-thread-7:299 - Error during report execution
net.sf.jasperreports.engine.JRException: Unable to get next record.
at net.sf.jasperreports.engine.JRResultSetDataSource.next(JRResultSetDataSource.java:113)
at net.sf.jasperreports.engine.fill.JRFillDataset.advanceDataSource(JRFillDataset.java:1405)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1254)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1233)
at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1577)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:149)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:932)
at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFiller.run(BaseFillHandle.java:120)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$SynchronousExecutor.execute(EngineServiceImpl.java:880)
at net.sf.jasperreports.engine.fill.BaseFillHandle.startFill(BaseFillHandle.java:165)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$AsynchronousReportFiller.fillReport(EngineServiceImpl.java:836)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl.fillReport(EngineServiceImpl.java:1702)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$ReportFill.runWithDataSource(EngineServiceImpl.java:1057)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$ReportFill.runReport(EngineServiceImpl.java:991)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$ReportRunnable.run(EngineServiceImpl.java:902)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Die Transaktion (Prozess-ID 55) befand sich auf Sperre | Kommunikationspuffer Ressourcen aufgrund eines anderen Prozesses in einer Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen
Sie die Transaktion erneut aus.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet$FetchBuffer.nextRow(SQLServerResultSet.java:4853)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.fetchBufferNext(SQLServerResultSet.java:1781)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(SQLServerResultSet.java:1034)
at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:168)
at net.sf.jasperreports.engine.JRResultSetDataSource.next(JRResultSetDataSource.java:109)
... 17 more
2014-08-06 10:28:24,928 ERROR errorPage_jsp,http-bio-80-exec-7:287 - JSException:
2014-08-06 10:28:24,930 ERROR errorPage_jsp,http-bio-80-exec-7:573 - stack trace of exception that redirected to errorPage.jsp
com.jaspersoft.jasperserver.api.JSException: Error filling report
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$FillResultListener.reportFillError(EngineServiceImpl.java:1233)
at net.sf.jasperreports.engine.fill.BaseFillHandle.notifyError(BaseFillHandle.java:211)
at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFiller.run(BaseFillHandle.java:135)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$SynchronousExecutor.execute(EngineServiceImpl.java:880)
at net.sf.jasperreports.engine.fill.BaseFillHandle.startFill(BaseFillHandle.java:165)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$AsynchronousReportFiller.fillReport(EngineServiceImpl.java:836)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl.fillReport(EngineServiceImpl.java:1702)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$ReportFill.runWithDataSource(EngineServiceImpl.java:1057)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$ReportFill.runReport(EngineServiceImpl.java:991)
at com.jaspersoft.jasperserver.api.engine.jasperreports.service.impl.EngineServiceImpl$ReportRunnable.run(EngineServiceImpl.java:902)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
Caused by: net.sf.jasperreports.engine.JRException: Unable to get next record.
at net.sf.jasperreports.engine.JRResultSetDataSource.next(JRResultSetDataSource.java:113)
at net.sf.jasperreports.engine.fill.JRFillDataset.advanceDataSource(JRFillDataset.java:1405)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1254)
at net.sf.jasperreports.engine.fill.JRFillDataset.next(JRFillDataset.java:1233)
at net.sf.jasperreports.engine.fill.JRBaseFiller.next(JRBaseFiller.java:1577)
at net.sf.jasperreports.engine.fill.JRVerticalFiller.fillReport(JRVerticalFiller.java:149)
at net.sf.jasperreports.engine.fill.JRBaseFiller.fill(JRBaseFiller.java:932)
at net.sf.jasperreports.engine.fill.BaseFillHandle$ReportFiller.run(BaseFillHandle.java:120)
... 10 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Die Transaktion (Prozess-ID 55) befand sich auf Sperre | Kommunikationspuffer Ressourcen aufgrund eines anderen Prozesses in einer Deadlocksituation und wurde als Deadlockopfer ausgewählt. Führen
Sie die Transaktion erneut aus.
at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:216)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet$FetchBuffer.nextRow(SQLServerResultSet.java:4853)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.fetchBufferNext(SQLServerResultSet.java:1781)
at com.microsoft.sqlserver.jdbc.SQLServerResultSet.next(SQLServerResultSet.java:1034)
at org.apache.commons.dbcp.DelegatingResultSet.next(DelegatingResultSet.java:168)
at net.sf.jasperreports.engine.JRResultSetDataSource.next(JRResultSetDataSource.java:109)
... 17 more