Announcement

Collapse
No announcement yet.

Java Stored Procedure + Speicher und Performanceprobleme

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Java Stored Procedure + Speicher und Performanceprobleme

    Hallo zusammen,
    ich bin gerade dabei einen Dijkstra als Java Stored Procedure auf einer Oracle DB 10G zu entwickeln. Entwickelt wird jener Algorithmus unter Berücksichtigung verschiedener Routingverhalten, die das allgemeine Routing von Oracle nicht ohne weiteres berücksichtigt (außer Einbahnstraßen und Fußgängerzonen wird da ja scheinbar nichts berücksichtigt, sehe ich das richtig?).
    Mein Gedanke bestand darin, alle RoutingEdges mit sämtlichen Attributen als Java Objekt zu modellieren, um sie in eine TreeMap oder HashMap im Speicher schnell im Zugriff zu haben. Alle Nodes werden ebenfalls als Java Objekt in eine TreeMap oder HashMap abgelegt. Zudem erhält jeder Knoten einen Vector in dem alle inzidenten Kanten gespeichert werden. So eine Art Adjazenzliste.
    Das Problem was sich nun für mich stellt ist das folgende. Ich haben ca. 550000 Edge Objekte und 460000 Node Objete in den Colllections zu verwalten.
    Hatte es auf Clientseite getestet und war (nachdem ich xms und xmx hochgeschraubt hatte) auch kein Problem.
    Allerdings zickt es auf der OracleJVM. Es kommt zu erheblichen Performance Unteschieden bei der Aussführung als JDBC Anwendung oder als Stored Procedure Ausführung.
    Zuerst bekam ich eine OutOfMemory Exception. Es wurden die Parameter SharedMemory und JavaPoolSize hochgeschaltet. Danach hatte ich die TreeMap gegen eine HashMap ausgetauscht. Dies brachte schon ein wenig Besserung.
    Allerdings kam es erst durch folgende Parameter beim Aufbau des „Routinggraphs“ zur Besserung:
    OracleRuntime.setNewspaceSize(4 * OracleRuntime.getNewspaceSize());
    OracleRuntime.setMaxRunspaceSize(4 * OracleRuntime.getMaxRunspaceSize());
    OracleRuntime.setSessionGCThreshold(4 * OracleRuntime.getSessionGCThreshold());

    OracleRuntime.setNewspaceSize(4 * OracleRuntime.getNewspaceSize());
    OracleRuntime.setMaxMemorySize(4 * OracleRuntime.getMaxMemorySize());

    OracleRuntime.setJavaStackSize(4 * OracleRuntime.getJavaStackSize());
    System.out.println("New JavaStackSize(): "

    OracleRuntime.setThreadStackSize(4 * OracleRuntime.getThreadStackSize());

    Dadurch waren die Ausführungszeiten beim Aufbau des Routinggraphen als eigenständige Java Anwengung und Stored Procedure wieder gleich. Sobald ich den Graphen an den bis jetzt rudimentären Dijkstra übergeben habe und ich via Key in den Maps auf bestimmte Objkte Mappen wollte, wurde es auf Stored Procedure Seite wieder unheimlich langsam.
    Hat jemand Erfahrung mit der Speicherverwaltung von der OracleJVM bzw. weiß jemand ob die CollectionTypen von Java einfach nicht sonderlich unterstützt werden durch OraclesJVM?? Auf ClientSeite genehmigt sich die Anwendung so ca. 256 bis 300 MB Ram..
    Cheers
    Meinereiner83
Working...
X