Hallo zusammen,
ich habe hier ein seltsames Phänomen. Wir haben einen Prozess, der sehr viele Dinge tut und ganz viel auf der Datenbank ablegen soll.
Deswegen soll das ganze einmal im Monat über einen Timer gestartet werden. Sieht aktuell so aus:
Die MasterQueryTimer:
Und der MasterQueryController:
Wenn der Timer den Prozess startet, dann kommt es irgendwann zu folgender Exception:
Wenn man allerdings den MasterQueryTimer über einen Button in der Oberfläche startet, dann läuft der Code einwandfrei durch.
Ich habe den Scheduler in verdacht, dass der ein implizites Timeout o.ä. hat, aber ich finde dazu nichts.
ich habe hier ein seltsames Phänomen. Wir haben einen Prozess, der sehr viele Dinge tut und ganz viel auf der Datenbank ablegen soll.
Deswegen soll das ganze einmal im Monat über einen Timer gestartet werden. Sieht aktuell so aus:
Java:
@Singleton
@DependsOn("ServerCache")
public class TimedFunctions {
private final static Logger LOG = LogManager.getLogger(TimedFunctions.class);
@Inject
transient private MasterQueryTimer masterQuery;
// @Schedule(dayOfMonth = "1", hour = "10", minute="11", persistent = false) //TODO anpassen/
@Schedule(hour="*", minute="20", persistent = false) //TODO anpassen
private void timerMasterQuery(final Timer t) {
masterQuery.startMasterQuery();
LOG.info("Master Query Timer beendet.");
}
}
Die MasterQueryTimer:
Java:
@ApplicationScoped
public class MasterQueryTimer {
public static final Logger LOG = LogManager.getLogger(MasterQueryTimer.class);
@Inject private Provider<MasterQueryController> cntlPrivoder;
private MasterQueryController cntl;
public void startMasterQuery() {
try {
cntl=cntlPrivoder.get();
cntl.processQuerys();
}catch(Exception e ) {
LOG.error("Fehler beim Performance-Test KV!");
}
}
}
Und der MasterQueryController:
Java:
@Model
public class MasterQueryController implements Serializable {
/**
*
*/
private static final long serialVersionUID = 1L;
private final static Logger LOG = LogManager.getLogger(MasterQueryController.class);
@Inject
private Provider<OracleModel> oracleProvider;
@Inject
private Provider<Db2Model> db2Provider;
@Inject
private ResponseTimeInterface responseTimeInterface; //Entität für Abfragen
@Inject
private ResponseTimeQueryInterface responseTimeQueryInterface; //Entität für Ergebnisse
private OracleModel om;
private Db2Model dm;
private HashMap<String, String> globaleVariablen;
private ArrayList<MasterQuery> sqlsMitErsetztenVariablenList;
private static final ReferenceSystem REFSYSTEM = ReferenceSystem.KV;
@PostConstruct
private void init() {
LOG.info("Init MasterQueryController");
this.globaleVariablen = new HashMap<>();
this.sqlsMitErsetztenVariablenList = new ArrayList<>();
LOG.info("Lesen der KV-ID aus der Tabelle Response_Time_Query.");
}
public void processQuerys() {
LOG.info("Start Performanceabfrage KV Master");
om = oracleProvider.get();
dm = db2Provider.get();
LOG.info("Lesen der Selects für die globalen Variablen aus der Master.");
List<MasterQuery> globaleQueryList = om.getGlobaleVariablen();
LOG.info("Lesen aller benötigten Selects, deren Ausführungszeit gemessen werden soll.");
List<MasterQuery> zuPruefendeSqlsAusMaster = om.getZuPruefendeSqlsAusMaster();
LOG.info("Holen der Institute aus der Master");
List<String> institutsList = om.getInstitute();
if (!institutsList.isEmpty()) {
for (String einInst : institutsList) {// zb D307
// Tu ganz viele Dinge
}
} else {
LOG.error("Es sind keine Institute in der Master vorhanden.");
}
LOG.info("Performance Master Query ist fertig.");//TODO kann weg message ist weiter oben
}
}
Wenn der Timer den Prozess startet, dann kommt es irgendwann zu folgender Exception:
Code:
[FEHLER ] DSRA0304E: Es ist eine Ausnahme vom Typ XAException eingetreten. Der Inhalt der XAException-Ausnahme und die Details sind wie folgt:
The XA Error is : -7
The XA Error message is : Resource manager is unavailable.
The Oracle Error code is : 17008
The Oracle Error message is: Internal XA Error
The cause is : java.sql.SQLRecoverableException: Getrennte Verbindung.
[FEHLER ] DSRA0302E: Es ist eine XAException eingetreten. Der Fehlercode ist XAER_RMFAIL (-7). Die Ausnahme XAErr (-7): Resource manager is unavailable. ORA-17008 SQLErr (0) wurde ausgelöst.
Wenn man allerdings den MasterQueryTimer über einen Button in der Oberfläche startet, dann läuft der Code einwandfrei durch.
Ich habe den Scheduler in verdacht, dass der ein implizites Timeout o.ä. hat, aber ich finde dazu nichts.