Posts Tagged: ‘oracle’

Quizfrage: Welcher amerikanische IT-Konzern hat seit Jahren beste Beziehungen nach China – Digitalthemen der Woche bei #9vor9

25. August 2020 Posted by Stefan Pfeiffer

Unsere Digitalthemen heute bei #9vor9: Bundespräsident Franz-Walter Steinmeier ist Schirmherr des Projektes „Ethik der Digitalisierung“, in dessem Rahmen in den kommenden zwei Jahren konkrete Handlungsempfehlungen für die Digitalpolitik ausgearbeitet werden sollen. Und natürlich kommen wir in diesen Zeiten nicht um die Executive Order von Trump bezüglich Tiktok, um den digitalen Streit zwischen den USA und China herum.

Doch weder Lars noch ich konnten das wirkliche Interesse erkennen, das eine Oracle oder eben eine Microsoft an einer Übernahme des Amerika-Geschäfts von Tiktok haben könnten. Geht es den beiden wirklich darum, die eigenen Cloud-Nutzerzahlen nach oben zu treiben, wie es Techcrunch vermutet, die Holger Mueller von Constellation Research entsprechend zitieren

TikTok will add plenty of load to their infrastructure service. That’s what matters to them with viral loads preferred. If Microsoft gets TikTok it could boost their usage by between 2% and 5%, while for Oracle it could be as much 10%.

Just what would an enterprise company like Microsoft or Oracle do with TikTok? | TechCrunch

Eine interessante Randnotiz: Welches Unternehmen pflegt seit vielen Jahren beste und enge Beziehungen nach China? Lars wusste es nicht. Ich wusste es auch nicht, bis ich einen entsprechenden Bericht in der FAZ (hinter Paywall) gelesen habe. Es ist Microsoft, das bereits 1998 ein Research Lab in China eröffnete. Bill Gates war hier wohl die treibende Kraft:

Als Gates sein Pekinger Lab mit allerhöchsten politischen Weihen vor mehr als zwanzig Jahren eröffnet hatte, gab es für Chinas Software- und Computerwissenschaftler nur zwei Wege zu einer vielversprechenden Karriere: Entweder man war in Peking für Microsoft tätig, oder man ging ins Ausland. Viele gingen, die meisten blieben und bauten eine erfolgreiche IT-Industrie und Internetwirtschaft auf.

Tiktok-Deal: Welche Privilegien Microsoft in China genießt

Vielleicht helfen ja jetzt die guten Beziehungen? Auch wenn sich gerade Bill Gates sehr kritisch zu einer möglichen Übernahme des US-Geschäfts von Tiktok durch Microsoft geäußert hat.

Kurz erwähnt haben sei noch die Auseinandertsetzung zwischen den Fortnite-Machern und insbesondere Apple. Mehr hier in der #heiseshow. Es wird spannend sein, wie es dort weiter geht.

Dann bis kommende Woche.

Blob- und Clob-Daten aus einer Oracle- in einer Notes-Datenbank verwenden

1. Oktober 2014 Posted by Christian Annawald

Heute gibt es eine kleine Erweiterung zu unserem Artikel „Oracle-DB mit Java einbinden“, in dem die Vorgehensweise beschrieben wird, wie man eine Verbindung zwischen einer IBM Notes-und einer Oracle-Datenbank aufbaut.

Im heutigen Beitrag gehe ich auf zwei spezielle Datentypen einer Oracle-Datenbank ein, den Blob und den Clob, und darauf, wie man die in ihnen enthaltenen Daten in einer Notes-Datenbank ablegt.

  • Der Blob (Binary Large Object) wird in der Regel verwendet, um ganze Dateien in Form eines BinaryStreams in der Datenbank abzulegen.
  • Der Clob (Character Large Object) ist - wie der Name schon sagt - für beliebig große Zeichenketten gedacht.

Beide Feldtypen benötigen allerdings eine leicht gesonderte Behandlung, um sie in eine Notes-Datenbank zu übertragen.


Als Erstes widme ich mich dem Blob:
Ich gehe in diesem Beispiel davon aus das die Datentabelle in der Oracle-Datenbank folgendermaßen konfiguriert ist:

 

Abb. 1: Aufbau einer Datentabelle in der Oracle-Datenbank

 

Der folgende Java-Agent erstellt pro Zeile, der Oracle-Datenbanktabelle ein Notes-Dokument, in welches die Daten der Zeile eingetragen werden.

import lotus.domino.*;

import java.io.*;

import java.sql.*;

import oracle.jdbc.internal.OracleResultSet;

import oracle.sql.BLOB;

import de.itwu.xKernel.base.ITOBinderElement;

public class JavaAgent extends AgentBase {

        public void NotesMain() {

 

                try {

                        Session session = getSession();

                        Database curdb = session.getCurrentDatabase();

                        //**1** Verbindung zur Oracle-Datenbank aufbauen

                        Class.forName("oracle.jdbc.OracleDriver");

                        Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@127.0.0.1:1521/SID", "USER","PASSWORT");

                        conn.setAutoCommit(false);

                        //**2** Datensätze aus Oracle anfordern

                        Statement stmt = conn.createStatement();

                        ResultSet rset = stmt.executeQuery("select * from TABELLE order by id");

                        //**3** Durchlaufen der Datensätze aus Oracle

                        while (rset.next()) {

                                try {

                                        //**4** Neues Notesdokument erzeugen

                                        Document newdoc = curdb.createDocument();

                                        newdoc.replaceItemValue("form", "Bild");

                                        newdoc.replaceItemValue("pic_Name", rset.getString("Name"));

                                        newdoc.replaceItemValue("pic_MimeType", rset.getString("MimeType"));

                                        //**5** Pro Tabellenzeile einen Unterordner erzeugen

                                        String Filename = "C:\\Temp\\"+rset.getString("ID")+"\\" + rset.getString("Name");

                                        File dir = new File("C:\\Temp\\"+rset.getString("ID")+"\\");

                                       dir.mkdir();

                                        //**6** Blob aus dem Oracle-Datensatz lesen und auf der Festplatte ablegen

                                        readBLOBToFileStream(((OracleResultSet) rset).getBLOB("Bild"), Filename);

                                        //**10** Datei in ein Richtextitem einfügen

                                        RichTextItem rtitem = newdoc.createRichTextItem("pic_BildDatei");

                                        rtitem.embedObject(EmbeddedObject.EMBED_ATTACHMENT, null,

                                        Filename, rset.getString("Name"));

                                        newdoc.save();

                                        newdoc.recycle();

                                } catch (Exception e) {

                                System.out.println("Fehler bei ID " + rset.getString("ID"));

                                e.printStackTrace();

                                }

                                finally

                                {

                                System.gc();

                                 }

 

                        }

                        stmt.close();

                } catch (Exception e) {

                        e.printStackTrace();

                }

        }

 

        public void readBLOBToFileStream(BLOB blobdata, String Filename)  throws IOException, SQLException

        {

                File outputBinaryFile = null;

                FileOutputStream outputFileOutputStream = null;

                InputStream blobInputStream = null;

                int chunkSize;

                byte[] binaryBuffer;

                int bytesRead = 0;

                int totBytesRead = 0;

                int totBytesWritten = 0;

                try {

                        //**7** Neue Datei erzeugen

                        outputBinaryFile = new File(Filename);

                        //**8** OutputStream erzeugen

                        outputFileOutputStream = new FileOutputStream(outputBinaryFile);

                        blobInputStream = blobdata.getBinaryStream();

 

                        //**9** Byteweise Daten des Blobs in Datei schreiben

                        chunkSize = blobdata.getChunkSize();

                        binaryBuffer = new byte[chunkSize];

 

                        while ((bytesRead = blobInputStream.read(binaryBuffer)) != -1) {

                                outputFileOutputStream.write(binaryBuffer, 0, bytesRead);

                                totBytesRead += bytesRead;

                                totBytesWritten += bytesRead;

                        }

                outputFileOutputStream.close();

                blobInputStream.close();

                } catch (Exception e) {

                e.printStackTrace();

                }

        }

}


Erläuterungen:

  1. Als Erstes muss der JDBC-Treiber geladen werden. Dazu benutzen wir die Funktion "Class.forName". Diese sucht den passenden Treiber aus der Laufzeitumgebung aus. Anschließend bauen wir mit "DriverManager.getConnection" die JDBC-Verbindung auf. Die IP-Adresse sowie SID, USER und PASSWORD sind natürlich durch die entsprechenden tatsächlichen Werte zu ersetzen. Ggf. ist auch der Port anzupassen (1521).
  2. Hier wird das SQL-Query definiert. Das hier angegebene Query ist natürlich nur als Beispiel zu verstehen. Anschließend wird mithilfe eines Statements und des "ResultSet" das Query ausgeführt.
  3. Das "ResultSet" wird mit einer while-Schleife durchlaufen, um die Ergebnisse auszulesen.
  4. Nun erzeugen wir uns in der Notes-Datenbank ein Notesdocument in das wir ein paar Daten eintragen.
  5. Wir legen für jede Tabellenzeile einen Ordner an (damit wir uns keine Dateien überschreiben), um im Anschluss die Datei aus dem Blob dort abzulegen.
  6. Nun wird die Methode readBLOBToFileStream mit dem Blob aus der Tabellenzeile und dem Dateinamen aufgerufen.
  7. Als Erstes legen wir mit dem Dateinamen eine neue Datei an.
  8. Nun initialisieren wir einen OutputStream mit der Datei und einen InputStream mit den Daten aus dem Blob.
  9. Im Anschluss werden alle Daten des InputStreams in den OutputStream bzw. in die Datei übertragen.
  10. Jetzt wird ein RichtextItem im Notesdocument angelegt und die zuvor erzeugte Datei angehängt.


Nun zu den Clobs:
Um Clobs, in meinem Fall einen beliebig langen Text, auszulesen, habe ich den Weg über den BufferedReader und StringBuffer gewählt.
Der Clob wird also mit Hilfe eines BufferedReaders in einen StringBuffer übertragen, wodurch er im Anschluss als normaler String abgegriffen werden kann:
 

public String ClobToString(Clob clobData)

{

   //**1** Prüfen, ob der Clob nicht leer ist

   if(clobData != null)

   {

      BufferedReader br = new BufferedReader(clobData.getCharacterStream());

      String aux;

      StringBuffer strOut = new StringBuffer();

      //**2**Zeilenweise die Daten des Clobs in den StringBuffer übertragen

      while ((aux = br.readLine()) != null) {

         strOut.append(aux);

         strOut.append(System.getProperty("line.separator"));

      }

   }

   return strOut.toString());

}

Erläuterungen:

  1. Als Erstes prüfen wir, ob der Clob Daten enthält.
  2. Nun übertragen wir zeilenweise den Text des Clobs in einen StringBuffer und geben ihn als normalen Java String zurück.

 

Der Methodenaufruf könnte folgendermaßen ausehen:

...

document.replaceItemValue("CBLOBFELD", this.ClobToString(RESULTSET.getClob("CBLOBFELD")));

...

 

Mit diesen Methoden könnt ihr also auch Daten aus Blobs und Clobs in einer Notes-Datenbank nutzbar machen.

Wenn euch noch andere Stolperfallen bei der Verbindung zwischen Oracle- und Notes-Datenbanken über den Weg laufen, schreibt sie uns doch bitte in die Kommentare.

 

Oracle Application Express 3.1.2 startet nach Rückspielen des Backups nicht mehr

1. Oktober 2014 Posted by Christian Annawald

Letzte Woche sollte ich für ein Kundenprojekt einen Oracle Application Express Server als Entwicklungsumgebung aufsetzen, um anschließend eine Schnittstelle mit einem Domino Server zu realisieren. Dazu sollten die Live-Daten vom Produktivserver auf den neu aufgesetzten Server kopiert werden.

An sich ist das keine große Sache. Als erstes installiert man den Oracle Application Express Server und trägt sich selber in die Windowsgruppe ORA_DBA ein. Nun kopiert man das Flashbackup von dem Originalserver auf den neu installierten Server an dieselbe Stelle im Verzeichnispfad z.B. C:\oraclexe\app\oracle\flach_recovery_area (Default-Pfad).

Als nächstes führt man die Restore.exe im Pfad C:\oraclexe\app\oracle\product\10.2.0\server\BIN aus.

Nun wird automatisch

  1. der Server heruntergefahren,
  2. das Backup eingespielt und
  3. der Server neu gestartet.

Ob alles geklappt hat, kann man im Browser unter der Adresse http://127.0.0.1:8080/apex/ überprüfen. Hier kann man sich nun wie beim Originalserver anmelden.

 

Abb. 1: Anmeldung am Oracle Application Express Server

 

Nun kommt der eigentliche Knackpunkt: Es werden beim Zurückspielen des Backups leider alle Einstellungen des Originalservers übertragen, so auch der Servername für die Datenbank und der Listener. Dies führte in unserem Fall dazu, dass der Listener ohne zuerst erkennbaren Grund nicht mehr startete. Hier kann uns das Logfile des Listener weiterhelfen, welches unter dem folgenden Pfad zu finden ist:
C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\log\listener.txt (Vorsicht, die Datei kann sehr groß sein!)

Hier sind uns folgende Zeilen entgegengesprungen:

Gestartet mit Pid=1176
Listen auf: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC_FOR_XEipc)))
Fehler beim Hören auf: (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ORIGINALSERVERNAME)(PORT=1521)))
TNS-12545: CONNECT nicht erfolgreich, da Ziel-Host oder -Objekt nicht vorhanden
 TNS-12560: TNS: Fehler bei Protokolladapter
  TNS-00515: CONNECT nicht erfolgreich, da Ziel-Host oder -Objekt nicht vorhanden
   32-bit Windows Error: 1001: Unknown error
Hört nicht mehr auf: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(PIPENAME=\\.\pipe\EXTPROC_FOR_XEipc)))

Um dieses Problem zu beheben, müssen wir in zwei Konfigurationsdateien den Servernamen des Originalservers mit dem Namen des neu installierten Servers ersetzen. Datei 1 ist die Konfiguration für den Datenbank-Service:

C:\oraclexe\app\oracle\product\10.2.0\server\NETWORK\ADMIN\tnsnames.ora

Hier gibt es den Punkt:


(DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = "SERVERNAME")(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

Hier sollte letztendlich im Bereich SERVERNAME im einfachsten Fall der Name des lokalen Rechners stehen.

Als zweites sollte man sich im selben Pfad die Datei „Listener.ora“ vornehmen. Hier gibt es denselben Punkt:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC_FOR_XE))
      (ADDRESS = (PROTOCOL = TCP)(HOST = "SERVERNAME")(PORT = 1521))
    )
  )

Auch hier sollte der Bereich SERVERNAME den Namen des lokalen Rechners enthalten. Sonst kann es passieren, dass der Listener immer noch versucht, sich mit dem Originalserver zu verbinden.

Ich hoffe der Artikel erspart euch eine aufwendige Suche durch die Oracle Foren.