Autor Thema: Abfrage auf Oracle-DB dauert sehr labge  (Gelesen 10989 mal)

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Abfrage auf Oracle-DB dauert sehr labge
« am: 13.05.09 - 10:36:05 »
Ich habe mich an einem Java-Agenten versucht, der Abfragen auf eine Oracle -DB startet.

Jetzt habe ich mehrere Fragen:
a) habe ich alles recyceld, was ich recyclen muss?
b) die einzelnen Abfragen dauern zwischen 7 und 8 Sekunden, kann ich die Abfrage in checkyyyenInfo anders fassen, so dass das schneller geht?



import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.*;
import java.lang.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;
 
import lotus.domino.*;     


public class yyyenstellenPruefung extends AgentBase {
   Session session = null;
   Database dbCurrent = null; //aktuelle DB

//für Oracle-Verbindung
   View oracleConfigView = null;
   Document docOracleConfig = null; //Konfigurationseinstellungen für Oracle   
   String strOracleServer = null; //
   String strOracleView = null; //
   String strOracleUser = null; //
   String strOraclePwd = null; //
   Connection conn=null; //
   ResultSet rs=null; //
   Statement stmt=null; //

// zu bearbeitende Dokumente

   View terminalView = null;  //zur 'Ermittlung der Dokumente
   long newDocs = 0;   
   Document terminalDoc = null; //aktuelles Terminaldoc
   Document nextDoc = null;
   
// Protokolldokument
   Document logDoc = null; //Protokoll
   GregorianCalendar cal=null; //
   Item logItem=null; //
   int logCount=0; //
   int logDocCount=1; //

   public void NotesMain() {

      try {
         System.out.println("Agent: Check für yyyenstellenaenderungen gestartet");
         session = getSession();
         AgentContext agentContext = session.getAgentContext();
         dbCurrent = agentContext.getCurrentDatabase();               // aktuelle Datenbank holen
                  
//Erstellung Protokolldokument
         cal = new GregorianCalendar();
               logDoc = dbCurrent.createDocument();
         logDoc.replaceItemValue("Form","Log");
         logDoc.replaceItemValue("Lauf","Lauf vom: " + cal.get(Calendar.DATE)+"."+(cal.get(Calendar.MONTH)+1)+"."+cal.get(Calendar.YEAR)+" " + cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+" Uhr");
         logDoc.replaceItemValue("Start",cal.get(Calendar.DATE)+"."+(cal.get(Calendar.MONTH)+1)+"."+cal.get(Calendar.YEAR)+" " + cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+" Uhr");
         
         logDoc.replaceItemValue("Log","");
         logItem = logDoc.getFirstItem("Log");      
         logEvent("Agent: Check für yyyenstellenüberprüfung gestartet");   
         logDoc.save(true,false);   //einmal abspeichern, damit Abbruch ersichtlich wird
         
         //Einlesen der Oraclekonfigurationseinstellung
         oracleConfigView    = dbCurrent.getView("(luConfig)");
         docOracleConfig       = oracleConfigView.getDocumentByKey("OracleConfig");
         strOracleServer       = docOracleConfig.getItemValueString("OracleServer");
         strOracleView          = docOracleConfig.getItemValueString("OracleView");
         strOracleUser          = docOracleConfig.getItemValueString("OracleUser");
         strOraclePwd          = docOracleConfig.getItemValueString("OraclePwd");

//Erstellen der Verbindung
// achtung: wenn hier Fehlermeldung kommt wegen fehlendem Oracle-treiber --->
//im Agent müssen die Klassen als JArdatei eingehängt sein, wird unter 'Projekt bearbeiten' angezeigt, notfalls auf OracleHomeopage suchen
   logEvent("vor Driver " + System.currentTimeMillis());       
   DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
   logEvent("vor conn  " + System.currentTimeMillis());
   conn = DriverManager.getConnection("jdbc:oracle:thin:@"+strOracleServer, strOracleUser, strOraclePwd);  //Aufbau Verbindung

if (conn.isClosed())
            logEvent("Oracle Connection is not open yet.");
                  stmt = conn.createStatement();
         logEvent("Datenbankanbindung an ACAT erfolgreich hergestellt");
   
   
// Ermitteln der zu überprüfenden Dokumente

      terminalView = dbCurrent.getView("(luACATAbfrage)");
      terminalDoc = terminalView.getFirstDocument();

       while (terminalDoc != null) {
                 nextDoc = terminalView.getNextDocument(terminalDoc);
                
                checkyyyenInfo(terminalDoc);
                       
            terminalDoc.recycle();
            terminalDoc = nextDoc;
         
         } //Ende While

         logDoc.save(true,false);
         
         stmt.close();
          conn.close();
      } catch(Exception e) {
      
         e.printStackTrace();
      }      
      
      System.gc();
      
   } //Schließen Main
   

public void checkyyyenInfo(Document updateDoc)
   {
      
      try {
            logEvent("vor Abfrage " + System.currentTimeMillis());
            String common = updateDoc.getItemValueString("zzzName");
            rs = stmt.executeQuery ("SELECT * FROM " + strOracleView + " WHERE zzzName='"+common + "'");
                  logEvent(common + System.currentTimeMillis());
            if (rs.next())
            {
            String strxxxstelle = new String(rs.getString(3));
            String stryyyenstelle = new String(rs.getString(4));
         
            String strOldyyyenstelle = updateDoc.getItemValueString("yyyenstelle");
            String strOldxxxstelle = updateDoc.getItemValueString("xxxstelle");
            
            boolean result1 = strOldyyyenstelle.equals(stryyyenstelle );       
            boolean result2 = strOldxxxstelle.equals(strxxxstelle );   
            if ( result1 == false|| result2 == false)
                  {
                     fillyyyenInfo (updateDoc, stryyyenstelle, strxxxstelle);
                  }

         }
              
                rs.close();
     
         }
            
      catch(Exception e) {
         e.printStackTrace();
      }
   }// Schliessen checkyyyenstellenInfo    
   
      public void fillyyyenInfo(Document updateDoc, String stryyyenstelle,String strxxxstelle)
   {
      try {
      
         String common = updateDoc.getItemValueString("zzzName");
   
               updateDoc.replaceItemValue("xxxstelle",stryyyenstelle);
               updateDoc.replaceItemValue("yyyenstelle",strxxxstelle);   
         logEvent(common + System.currentTimeMillis());

   
                  updateDoc.save(true,false);   
           
         }
            
      catch(Exception e) {
         e.printStackTrace();
      }
   }// Schliessen FillyyyenstellenInfo    
   
   
   public void logEvent(String eventToBeLogged)
   {
      try {
      
         logCount++;
         logItem.appendToTextList(eventToBeLogged);
         if (logCount > 200)
         {
            logDocCount++;
            logCount=0;
            logDoc.save(true,false);
            logDoc = dbCurrent.createDocument();
            logDoc.replaceItemValue("Form","Log");
            logDoc.replaceItemValue("Lauf","Lauf vom: " + cal.get(Calendar.DATE)+"."+(cal.get(Calendar.MONTH)+1)+"."+cal.get(Calendar.YEAR)+" " + cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+" Uhr " + logDocCount + ". Teil");
            logDoc.replaceItemValue("Log","");
            logItem = logDoc.getFirstItem("Log");
         }
      }
      catch (Exception e) {
         e.printStackTrace();
      }
   }

}
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #1 am: 13.05.09 - 11:14:59 »
Hi,

einiges ist suboptimal an dem Code.
Am besten du baust dir erstmal ein lesbares Logging für ad hoc Zeitmessungen ins log.
 

Eigenschaft: (unter Session session=null; )
Code
long lastMillis = System.currentTimeMillis(); 

Methode: (vor letzter schliessenden Klammer)
Code
public long getDifMillis() {
  long newMillis = System.currentTimeMillis(); 
  long dif = newMillis -  lastMillis; 
  lastMillis = new Millis; 
  return dif;
}

Dann kannst du im Code das für Logstatements verwenden.

ein guter Kandidat ist hier:
Code
while (terminalDoc != null) {
                 nextDoc = terminalView.getNextDocument(terminalDoc);
                
                checkyyyenInfo(terminalDoc);
                       
            terminalDoc.recycle();
            terminalDoc = nextDoc; 
}
Vor dem recycle:
Code
logEvent("processing doc " + terminalDoc.getUniversalID() + " Zeitdif->" + getDifMillis + " milliseconds");

Ich vermute, dass am meisten Zeit für die ständig wiederholten Selects verbrauchst. Am meisten Optimierungsmöglichkeiten seh ich im SQL.
Vermutlich kannst du das ganze auf ein Statement verkürzen so der Art:
Code
SELECT spaltenDieDuBenötigstMitKommaGetrennt FROM " + strOracleView + " WHERE zzzName IN zusammenbauenDerBenötigtenWerteAlsKommaGetrennteListe. 
Kann letzteres noch genauer ausführen, hab aber jetzt keine Zeit.

UND verwende die Klasse PreparedStatement und nicht Statement. Allein schon aus Sicherheitsgründen!
Was machst du, wenn Leute in dem Feld zzzname sowas wie "';Delete From eineTabelleInDerOracleDB eingeben  ;D
« Letzte Änderung: 13.05.09 - 11:20:16 von Pitiyankee »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #2 am: 13.05.09 - 11:24:05 »
Pro select werden 7 - 8 sekunden verbraten.

Das ist irgendwie ne ganze Menge  :-X
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #3 am: 13.05.09 - 12:00:08 »

Ich vermute, dass am meisten Zeit für die ständig wiederholten Selects verbrauchst. Am meisten Optimierungsmöglichkeiten seh ich im SQL.
Vermutlich kannst du das ganze auf ein Statement verkürzen so der Art:
Code
SELECT spaltenDieDuBenötigstMitKommaGetrennt FROM " + strOracleView + " WHERE zzzName IN zusammenbauenDerBenötigtenWerteAlsKommaGetrennteListe. 


Die Liste: ist das jetzt ein String, der mit Komma getrennt die Werte enthält?
Oder läuft das auf einen Vektor hinaus?
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #4 am: 13.05.09 - 12:11:02 »
Pro Select? Das heisst der Agent führt mehrere Select statement durch und JEDES select dauert 7 bis 8 Sek?
Das ist nicht normal. Red mal mit einem DB Admin. Teste es mit einem SQL Client wie SQLPlus oder Squirrel von deinem Arbeitsplatz, ob es da auch so lange dauert, etc.

Eventuell - falls die Oracle.jar an den Agenten angehängt ist, kannst du auch mal versuchen die Oracle Treiber jar in das /lib/ext Verzeichnis des Servers tun. 


Select spaltenliste!!! in ('werta', 'wertB', ...)
Hab lang kein Oracle mehr gemacht, sollte aber da auch gehen.

Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #5 am: 13.05.09 - 12:22:27 »
Pro Select? Das heisst der Agent führt mehrere Select statement durch und JEDES select dauert 7 bis 8 Sek?
Das ist nicht normal. Red mal mit einem DB Admin. Teste es mit einem SQL Client wie SQLPlus oder Squirrel von deinem Arbeitsplatz, ob es da auch so lange dauert, etc.

Eventuell - falls die Oracle.jar an den Agenten angehängt ist, kannst du auch mal versuchen die Oracle Treiber jar in das /lib/ext Verzeichnis des Servers tun. 


Select spaltenliste!!! in ('werta', 'wertB', ...)
Hab lang kein Oracle mehr gemacht, sollte aber da auch gehen.

Gruß Axel
Ja, jedes einzelne Statement dauert solange.

SQL client hab ich nicht und krieg ich nicht

Oracle.jar sind am/im Agenten
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #6 am: 13.05.09 - 12:33:50 »
<quote>
SQL client hab ich nicht und krieg ich nicht
</quote>
Macht aber Sinn. Du kannst dir aus dem Internet Squirrel herunterladen, dort den Oracle JDBC Treiber einbinden. Dann hast du einen SQL client.

Ein SQL Select ohne joins kann unter normalen Umständen nicht so lange dauern. Rede am besten mal mit dem DB-Admin.

Du kannst wie gesagt einmal probieren die Oracle Treiber vom Agenten abhängen und in das lib/ext Verzeichnis von Client oder Server tun (je nachdem womit du arbeitest). Das anhängen größerer jars an die Agenten hat schon mal äußerst merkwürdige Effekte.

Gruß Axel
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #7 am: 13.05.09 - 15:26:59 »
so, jetzt bekomme ich ganz viele Einträge im Log, wenn ich den Agenten periodisch starte:

JVMDG315: JVM Requesting Heap dump file
etc.

bei manuellem Start passiert das nicht.

Ich gehe nochmals alles durch und versuche, wirklich alles zu recyclen.
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #8 am: 13.05.09 - 15:39:02 »
v.a. logDoc und updateDoc
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #9 am: 13.05.09 - 15:49:41 »
v.a. logDoc und updateDoc

eine Frage zu UpdateDoc: hier wird doch das terminalDoc an die Subroutine übergeben,
kann ich das UpdateDoc wirklich in der Subroutine recyclen?
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #10 am: 13.05.09 - 17:13:32 »
So sieht es jetzt aus
wenn ich das Updatedoc recycle, bricht der Agent ab.
Die Abfragen dauern aktuell 12 bis 18 Sekunden.
Kann ich jetzt noch etwas machen, ohne den gesamten Agenten umzustricken?

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import java.sql.*;
import java.lang.*;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Vector;
 
import lotus.domino.*;     


public class yyystellenPruefung extends AgentBase {
   Session session = null;
   long lastMillis = System.currentTimeMillis();
   
   Database dbCurrent = null; //aktuelle DB

//für Oracle-Verbindung
   View oracleConfigView = null;
   Document docOracleConfig = null; //Konfigurationseinstellungen für Oracle   
   String strOracleServer = null; //
   String strOracleView = null; //
   String strOracleUser = null; //
   String strOraclePwd = null; //
   Connection conn=null; //
   ResultSet rs=null; //
   //PreparedStatement stmt=null; //
   Statement stmt=null; //
   //Vector listNames = new Vector();  //(Vektorliste zum aufNehmen der werte)
   String [] listNames =  null;


// zu bearbeitende Dokumente

   View terminalView = null;  //zur 'Ermittlung der Dokumente
   long newDocs = 0;   
   Document terminalDoc = null; //aktuelles Terminaldoc
   Document nextDoc = null;
   
// Protokolldokument
   Document logDoc = null; //Protokoll
   GregorianCalendar cal=null; //
   Item logItem=null; //
   int logCount=0; //
   int logDocCount=1; //

   public void NotesMain() {

      try {
         System.out.println("Agent: Check für yyystellenaenderungen neu gestartet");
         session = getSession();
         AgentContext agentContext = session.getAgentContext();
         dbCurrent = agentContext.getCurrentDatabase();               // aktuelle Datenbank holen
                  
//Erstellung Protokolldokument
         cal = new GregorianCalendar();
               logDoc = dbCurrent.createDocument();
         logDoc.replaceItemValue("Form","Log");
         logDoc.replaceItemValue("Lauf","Lauf vom: " + cal.get(Calendar.DATE)+"."+(cal.get(Calendar.MONTH)+1)+"."+cal.get(Calendar.YEAR)+" " + cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+" Uhr");
         logDoc.replaceItemValue("Start",cal.get(Calendar.DATE)+"."+(cal.get(Calendar.MONTH)+1)+"."+cal.get(Calendar.YEAR)+" " + cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+" Uhr");
         
         logDoc.replaceItemValue("Log","");
         logItem = logDoc.getFirstItem("Log");      
         logEvent("neuer Agent: Check für yyystellenüberprüfung gestartet");   
         logDoc.save(true,false);   //einmal abspeichern, damit Abbruch ersichtlich wird
         
         //Einlesen der Oraclekonfigurationseinstellung
         oracleConfigView    = dbCurrent.getView("(luConfig)");
         docOracleConfig       = oracleConfigView.getDocumentByKey("OracleConfig");
         strOracleServer       = docOracleConfig.getItemValueString("OracleServer");
         strOracleView          = docOracleConfig.getItemValueString("OracleView");
         strOracleUser          = docOracleConfig.getItemValueString("OracleUser");
         strOraclePwd          = docOracleConfig.getItemValueString("OraclePwd");

//Erstellen der Verbindung
// achtung: wenn hier Fehlermeldung kommt wegen fehlendem Oracle-treiber --->
//im Agent müssen die Klassen als JArdatei eingehängt sein, wird unter 'Projekt bearbeiten' angezeigt, notfalls auf OracleHomeopage suchen
   logEvent("vor Driver " + System.currentTimeMillis());       
   DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
   logEvent("vor conn  " + System.currentTimeMillis());
   conn = DriverManager.getConnection("jdbc:oracle:thin:@"+strOracleServer, strOracleUser, strOraclePwd);  //Aufbau Verbindung

if (conn.isClosed())
            logEvent("Oracle Connection is not open yet.");
                  stmt = conn.createStatement();
         logEvent("Datenbankanbindung an ACAT erfolgreich hergestellt");
   
   
// Ermitteln der zu überprüfenden Dokumente

      terminalView = dbCurrent.getView("(luACATAbfrage)");
      terminalDoc = terminalView.getFirstDocument();

       while (terminalDoc != null) {
                 nextDoc = terminalView.getNextDocument(terminalDoc);
                
                checkyyyInfo(terminalDoc);
                       
                     logEvent("processing doc " + terminalDoc.getUniversalID() + " Zeitdif->" + getDifMillis() + " milliseconds");
            terminalDoc.recycle();
            terminalDoc = nextDoc;
         
         } //Ende While
         nextDoc.recycle();
            terminalDoc.recycle();

         logDoc.save(true,false);   
         logDoc.recycle();
      
         stmt.close();
          conn.close();
         
             terminalView.recycle();
      
         docOracleConfig.recycle();
         oracleConfigView.recycle();
         dbCurrent.recycle();
          session.recycle();
      } catch(Exception e) {
      
         e.printStackTrace();
      }      finally{
      

   
      
   //   GC.recycle(nextDoc);
      System.gc();
      }
   } //Schließen Main
   

public void checkyyyInfo(Document updateDoc)
   {
      
      try {
            logEvent("vor Abfrage " + System.currentTimeMillis());
            String common = updateDoc.getItemValueString("BKUName");
            rs = stmt.executeQuery ("SELECT * FROM " + strOracleView + " WHERE BKUName='"+common + "'");
                  logEvent(common + System.currentTimeMillis());
            if (rs.next())
            {
            String strxxxstelle = new String(rs.getString(3));
            String stryyystelle = new String(rs.getString(4));
         
            String strOldyyystelle = updateDoc.getItemValueString("yyystelle");
            String strOldxxxstelle = updateDoc.getItemValueString("xxxstelle");
            
            boolean result1 = strOldyyystelle.equals(stryyystelle );       
            boolean result2 = strOldxxxstelle.equals(strxxxstelle );   
            if ( result1 == false|| result2 == false)
                  {
                     fillyyyInfo (updateDoc, stryyystelle, strxxxstelle);
                  }

         }
              
             //  updateDoc.recycle();
                               rs.close();
     
         }
            
      catch(Exception e) {
         e.printStackTrace();
      }
   }// Schliessen checkyyystellenInfo    
   
      public void fillyyyInfo(Document updateDoc, String stryyystelle,String strxxxstelle)
   {
      try {
      
         String common = updateDoc.getItemValueString("zzzName");
   
               updateDoc.replaceItemValue("xxxstelle",stryyystelle);
               updateDoc.replaceItemValue("yyystelle",strxxxstelle);   
         logEvent(common + System.currentTimeMillis());

   
                  updateDoc.save(true,false);   
           
         }
            
      catch(Exception e) {
         e.printStackTrace();
      }
   }// Schliessen FillyyystellenInfo    
   
   
   public void logEvent(String eventToBeLogged)
   {
      try {
      
         logCount++;
         logItem.appendToTextList(eventToBeLogged);
         if (logCount > 200)
         {
            logDocCount++;
            logCount=0;
            logDoc.save(true,false);
            logDoc = dbCurrent.createDocument();
            logDoc.replaceItemValue("Form","Log");
            logDoc.replaceItemValue("Lauf","Lauf vom: " + cal.get(Calendar.DATE)+"."+(cal.get(Calendar.MONTH)+1)+"."+cal.get(Calendar.YEAR)+" " + cal.get(Calendar.HOUR_OF_DAY)+":"+cal.get(Calendar.MINUTE)+" Uhr " + logDocCount + ". Teil");
            logDoc.replaceItemValue("Log","");
            logItem = logDoc.getFirstItem("Log");
         }
      }
      catch (Exception e) {
         e.printStackTrace();
      }
   }//Ende logEvent
   
   public long getDifMillis()
   {
        long newMillis = System.currentTimeMillis();
        long dif = newMillis -  lastMillis;
        lastMillis = newMillis;
        return dif ;
   }// Ende getDifMillis()

}
 
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #11 am: 13.05.09 - 18:07:06 »
Zitat von: DAU-in link=topic=45155.msg290462#msg290462 date=1242227612
Kann ich jetzt noch etwas machen, ohne den gesamten Agenten umzustricken?
[/quote
Ja. Warten, bis ich den "umgestrickt" hab.
Spätestens heute abend um 11.
« Letzte Änderung: 13.05.09 - 18:08:43 von Pitiyankee »
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #12 am: 13.05.09 - 22:38:23 »
Mein Vorschlag (nicht getestet, da das Erstellen einer oracle db und deiner NotesDb zum funktionalen Testen jetzt too much wäre:
Code ist ein wenig besser aufgeteilt auf Methoden (geht natürlich noch besser, ist wichtig).


Und meine Idee mit den in. Über eine Map.
Du schreibst erst alle Infos aus den alten Notes Doks in eine Map.
Daraus läßt sich dann genau 1 Query erzeugen.
Nachteil ist, dass die zu verändernden Dokumente neu aus der Datenbank geholt werden müssen. Hab aber die Regel, Notes Dokumente tendentiell kurz zu halten. Dann übersieht man weniger recycle Probleme.

Hab eine Menge Variablen lokal gemacht.

Connection am besten im finally schliessen. resultset und statement müssen eigentlich geschlossen werden.

weiss btw. z.Zt. auch nicht wie man mit der select ... in syntax mit prepared Statements arbeitet, zorry.

Mach morgen krasse innovative Idee wie man mit dem ConfigOracleDoc umgeht.

logDoc geht auch besser.



Code
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.HashMap;
import java.util.Map;

import lotus.domino.AgentBase;
import lotus.domino.AgentContext;
import lotus.domino.Database;
import lotus.domino.Document;
import lotus.domino.Item;
import lotus.domino.NotesException;
import lotus.domino.Session;
import lotus.domino.View;

import java.util.Iterator;

public class yyystellenPruefung extends AgentBase {
	
	private long lastMillis = System.currentTimeMillis();

	private Database dbCurrent = null; // aktuelle DB

	// für Oracle-Verbindung
	
	
	
	private Document logDoc;
	private Item logItem; 

	// zu bearbeitende Dokumente

	private String strOracleView;
	private long newDocs = 0;
	private long logCount;
	private long logDocCount; 

	

	private Connection connectToOracle(Document docOracleConfig) throws SQLException, NotesException {
		logEvent("vor Driver " + System.currentTimeMillis());
		DriverManager.registerDriver(new oracle.jdbc.driver.OracleDriver());
		logEvent("vor conn  " + System.currentTimeMillis());
		String strOracleServer = docOracleConfig
		.getItemValueString("OracleServer");
		String strOracleUser = docOracleConfig.getItemValueString("OracleUser");
		String strOraclePwd = docOracleConfig.getItemValueString("OraclePwd");
		
		
		Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@"
				+ strOracleServer, strOracleUser, strOraclePwd); // Aufbau
		
		// Verbindung

		if (conn.isClosed()) {
			logEvent("Oracle Connection is not open yet.");
			return null;
		}

		return conn;

	}

	public void NotesMain() {
		Connection conn = null; 
		try {
			System.out
					.println("Agent: Check für yyystellenaenderungen neu gestartet");
			Session session = getSession();
			AgentContext agentContext = session.getAgentContext();
			dbCurrent = agentContext.getCurrentDatabase(); // aktuelle Datenbank
			// holen

			// Erstellung Protokolldokument
			Calendar cal = new GregorianCalendar();
			logDoc = dbCurrent.createDocument();
			logDoc.replaceItemValue("Form", "Log");
			logDoc.replaceItemValue("Lauf", "Lauf vom: "
					+ cal.get(Calendar.DATE) + "."
					+ (cal.get(Calendar.MONTH) + 1) + "."
					+ cal.get(Calendar.YEAR) + " "
					+ cal.get(Calendar.HOUR_OF_DAY) + ":"
					+ cal.get(Calendar.MINUTE) + " Uhr");
			logDoc.replaceItemValue("Start", cal.get(Calendar.DATE) + "."
					+ (cal.get(Calendar.MONTH) + 1) + "."
					+ cal.get(Calendar.YEAR) + " "
					+ cal.get(Calendar.HOUR_OF_DAY) + ":"
					+ cal.get(Calendar.MINUTE) + " Uhr");

			logDoc.replaceItemValue("Log", "");
			logItem = logDoc.getFirstItem("Log");
			logEvent("neuer Agent: Check für yyystellenüberprüfung gestartet");
			logDoc.save(true, false); // einmal abspeichern, damit Abbruch
			// ersichtlich wird

			// Einlesen der Oraclekonfigurationseinstellung
			View oracleConfigView = dbCurrent.getView("(luConfig)");
			Document docOracleConfig  = oracleConfigView.getDocumentByKey("OracleConfig");
			
			strOracleView = docOracleConfig.getItemValueString("OracleView");
			

			// Erstellen der Verbindung
			// achtung: wenn hier Fehlermeldung kommt wegen fehlendem
			// Oracle-treiber --->
			// im Agent müssen die Klassen als JArdatei eingehängt sein, wird
			// unter 'Projekt bearbeiten' angezeigt, notfalls auf
			// OracleHomeopage suchen
			conn = connectToOracle(docOracleConfig);
			
			if (conn != null) {
				logEvent("Datenbankanbindung an ACAT erfolgreich hergestellt");

				// Ermitteln der zu überprüfenden Dokumente

				View terminalView = dbCurrent.getView("(luACATAbfrage)");
				Document terminalDoc = terminalView.getFirstDocument();

				// writes all old info in notes in vo objects in a map, using bkuname as key

				
				Map mapTerminalDoc = new HashMap();
				while (terminalDoc != null) {
					Document nextDoc = terminalView
							.getNextDocument(terminalDoc);
					VOTerminalDoc termDoc = new VOTerminalDoc();
					termDoc.setBkuName(terminalDoc
							.getItemValueString("BKUName"));
					termDoc.setNotesUniversalId(terminalDoc.getUniversalID());

					termDoc.setXxxstelle(terminalDoc
							.getItemValueString("xxxstelle"));
					termDoc.setYyystelle(terminalDoc
							.getItemValueString("yyystelle"));

					mapTerminalDoc.put(termDoc.getBkuName(), termDoc);

					terminalDoc.recycle();
					terminalDoc = nextDoc;

				} // Ende While

				checkyyyInfo(mapTerminalDoc, conn);

				logDoc.save(true, false);
				logDoc.recycle();

				// terminalView.recycle();

				// docOracleConfig.recycle();
				// oracleConfigView.recycle();

			}

		} catch (Exception e) {

			e.printStackTrace();

		} finally {
			try {
				if (conn != null) {
					conn.close();
				}

			} catch (SQLException e) {

			}

		}
	} // Schließen Main

	public void checkyyyInfo(Map mapTerminalDoc, Connection conn) {

		try {
			logEvent("vor Abfrage " + System.currentTimeMillis());

			String query = "Select BKUName, name_von_spalte_3, name_von_spalte_4 From "
					+ strOracleView
					+ " WHERE BKUName IN "
					+ buildSelectInQueryCondition(mapTerminalDoc.keySet()
							.iterator());
			System.out.println("QUERY=" + query);
			Statement stmt = conn.createStatement(); 
			ResultSet rs = stmt.executeQuery(query);
			logEvent(query + "-->" + System.currentTimeMillis());
			if (rs.next()) {
				String bkuName = rs.getString("BKUName");
				VOTerminalDoc termDoc = (VOTerminalDoc) mapTerminalDoc
						.get(bkuName);

				String strxxxstelleFromDb = new String(rs
						.getString("name_von_spalte_3"));
				String stryyystelleFromDb = new String(rs
						.getString("name_von_spalte_4"));

				if (strxxxstelleFromDb != termDoc.getXxxstelle()
						|| strxxxstelleFromDb != termDoc.getYyystelle()) {
					Document updateDoc = dbCurrent.getDocumentByUNID(termDoc
							.getNotesUniversalId());
					System.out.println("updating doc ->" + termDoc);
					fillyyyInfo(updateDoc, strxxxstelleFromDb,
							stryyystelleFromDb);
				}

			}

			// updateDoc.recycle();
			rs.close();

		}

		catch (Exception e) {
			e.printStackTrace();
		}
	}// Schliessen checkyyystellenInfo

	private String buildSelectInQueryCondition(Iterator itKeys) {
		StringBuffer buf = new StringBuffer();
		buf.append("(");
		while (itKeys.hasNext()) {
			String key = itKeys.next().toString();
			buf.append("'");
			buf.append(key);
			buf.append("'");
		}
		buf.append(")");

		return buf.toString();

	}

	private void fillyyyInfo(Document updateDoc, String stryyystelle,
			String strxxxstelle) {
		try {

			String common = updateDoc.getItemValueString("zzzName");

			updateDoc.replaceItemValue("xxxstelle", stryyystelle);
			updateDoc.replaceItemValue("yyystelle", strxxxstelle);
			logEvent(common + System.currentTimeMillis());

			updateDoc.save(true, false);
			updateDoc.recycle();

		}

		catch (Exception e) {
			e.printStackTrace();
		}
	}// Schliessen FillyyystellenInfo

	private void logEvent(String eventToBeLogged) {
		try {
			Calendar cal = new GregorianCalendar(); 
			logCount++;
			logItem.appendToTextList(eventToBeLogged);
			if (logCount > 200) {
				logDocCount++;
				logCount = 0;
				logDoc.save(true, false);
				logDoc = dbCurrent.createDocument();
				logDoc.replaceItemValue("Form", "Log");
				logDoc.replaceItemValue("Lauf", "Lauf vom: "
						+ cal.get(Calendar.DATE) + "."
						+ (cal.get(Calendar.MONTH) + 1) + "."
						+ cal.get(Calendar.YEAR) + " "
						+ cal.get(Calendar.HOUR_OF_DAY) + ":"
						+ cal.get(Calendar.MINUTE) + " Uhr " + logDocCount
						+ ". Teil");
				logDoc.replaceItemValue("Log", "");
				logItem = logDoc.getFirstItem("Log");
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
	}// Ende logEvent

	public long getDifMillis() {
		long newMillis = System.currentTimeMillis();
		long dif = newMillis - lastMillis;
		lastMillis = newMillis;
		return dif;
	}// Ende getDifMillis()

}

class VOTerminalDoc {
	private String bkuName;
	private String notesUniversalId;
	private String xxxstelle;
	private String yyystelle;

	public String getBkuName() {
		return bkuName;
	}

	public void setBkuName(String bkuName) {
		this.bkuName = bkuName;
	}

	public String getNotesUniversalId() {
		return notesUniversalId;
	}

	public void setNotesUniversalId(String notesUniversalId) {
		this.notesUniversalId = notesUniversalId;
	}

	public String getXxxstelle() {
		return xxxstelle;
	}

	public void setXxxstelle(String xxxstelle) {
		this.xxxstelle = xxxstelle;
	}

	public String getYyystelle() {
		return yyystelle;
	}

	public void setYyystelle(String yyystelle) {
		this.yyystelle = yyystelle;
	}

	public String toString() {
		return "[" + getClass().getName() + "\n\tbkuName=" + getBkuName()
				+ "\n\tnotesUniversalId=" + getNotesUniversalId()
				+ "\n\txxxstelle=" + getXxxstelle() + "\n\tyyystelle="
				+ getYyystelle() + "\n]";
	}

}

Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Abfrage auf Oracle-DB dauert sehr lange
« Antwort #13 am: 14.05.09 - 08:44:53 »
Kompilieren lässt es sich, und die Verbindung wird hergestellt.

Dsnach hakts, aber da muss ich jetzt mal sehen
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #14 am: 14.05.09 - 10:02:11 »
Wo kommt denn der Fehler?
Du hast sicher einen Stacktrace oder ich hab eine Endlosschleife programmiert.

Gruß Axel 
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #15 am: 14.05.09 - 12:03:25 »
so, war bis eben im Meeting.

jetzt kann ich wieder suchen.
mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline DAU-in

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 1.129
  • Geschlecht: Weiblich
  • - unterwegs -
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #16 am: 14.05.09 - 12:21:01 »
Statement stmt = conn.createStatement();
logEvent("hinter statement=" + System.currentTimeMillis());
ResultSet rs = stmt.executeQuery(query);

er bricht ab vor dem ResultSet

kann ich die Spaltennamen der Tabelle abfragen?

mühsam ernährt sich das Eichhörnchen

aktuelle Tätigkeit: Feldschubse

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #17 am: 14.05.09 - 13:00:46 »
Wie sieht der query aus (wird über System.out.println ausgegeben)?

Vermutlich ist das resultset leer. Gibt dafür imho auch eine Methode, um die Anzahl der Treffer im Resultset auszugeben. Bin in dojo Schulung. Später.

Zitat

kann ich die Spaltennamen der Tabelle abfragen?
ja.
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #18 am: 14.05.09 - 13:40:59 »
Auf jeden Fall war in der Methode buildSelectInQueryCondition ein Fehler.
Hier die korrigierte Version
Code
private String buildSelectInQueryCondition(Iterator itKeys) {
		StringBuffer buf = new StringBuffer();
		buf.append("(");
                boolean first = true; 
		while (itKeys.hasNext()) {
			String key = itKeys.next().toString();
                        if (first) {
                         first = false; 
                       } else {
                        buf.append(','); 
                      }
			buf.append("'");
			buf.append(key);
			buf.append("'");
		}
		buf.append(")");

		return buf.toString();

	}


Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

Offline flaite

  • Gold Platin u.s.w. member:)
  • *****
  • Beiträge: 2.966
    • mein del.icio.us
Re: Abfrage auf Oracle-DB dauert sehr labge
« Antwort #19 am: 14.05.09 - 22:54:15 »
um es noch mal zu sagen:
Für so ein Integrationsprojekt mit einer SQL Datenbank sollte man sich einen SQL-Client besorgen.
Damit kann man dann zunächst einmal die SQL Statements ausprobieren. Da läßt sich nämlich häufig eine Menge optimieren. Und mit so einem Client kann man die einfach schneller zusammenbauen.
Das gute an SQL ist, dass man mit einem Statement ein ganzes Resultset an Daten bekommen kann. In Notes muß man über die View iterieren. Über das Resultset muss man (wenn man nicht JPA, Hibernate oder ibatis benutuzt auch iterieren. Aber das ist was anderes. Ein view.getNextDocument ist ein call gegen den Server. Das resultset holt man sich 1x vom sql Server.
SQL Clients gibts frei im Netz. Man muß da nur den JDBC Treiber besorgen. Die Teile sind nicht so schwierig. Squirrel ist ziemlich beliebt. Dafür gibts auch gute tutorials.

1. Squirrel installer laufen lassne.
2. JDBC Treiber einbinden
3. Datenbank-Verbindung einrichten, die bei Squirrel seltsamerweise alias heißt.
Squirrel läuft mit ungefähr 50 Datenbanken. Da sind alle gängigen dabei.

Wenn es in Schleifen Ärger mit recycle von Notes Dokumenten gibt: Man kann die einen interessierenden Werte in Java Objekte speichern. Die Klasse VOTerminalDoc unten. Dann kann man die Notes Objekte instantiieren, die Werte in das Objekt schreibne und das Notes Objekt (etwa Document) direkt recyclen. 
Ich stimm nicht mit allen überein, aber mit vielen und sowieso unterhaltsam -> https://www.youtube.com/channel/UCr9qCdqXLm2SU0BIs6d_68Q

---

Aquí no se respeta ni la ley de la selva.
(Hier respektiert man nicht einmal das Gesetz des Dschungels)

Nicanor Parra, San Fabian, Región del Bio Bio, República de Chile

 

Impressum Atnotes.de  -  Powered by Syslords Solutions  -  Datenschutz