Google Compute

In diesem Thema werden die erforderlichen Schritte zum Herstellen einer Verbindung zu Oracle Exadata Database Service on Dedicated Infrastructure in Oracle AI Database@Google Cloud über eine Java-Anwendung erläutert, die auf einer Compute Engine - Linux Virtual Machine - ausgeführt wird.

Voraussetzungen

In diesem Abschnitt werden die Anforderungen für das Deployment, Kompilieren und Packen einer Java-Anwendung und das Deployment in einer Anwendung beschrieben, um eine Verbindung zu Oracle Exadata Database mit der Tabelle Produkte für das Erstellen, Lesen, Aktualisieren und Löschen (CRUD) herzustellen.

Oracle Exadata-Datenbank

Diese Datenbank wird von Application Server mit der Java-Anwendung verbunden.
  • Oracle Exadata Database Service on Dedicated Infrastructure - Verbindungsdetails
  • Ein Oracle Database-Benutzer, der Datenbanksessions erstellt und SQL-Befehle ausführt.
  • Konnektivität vom Anwendungsserver zur Oracle Exadata-Datenbank.
  • Eine Produkttabelle in Oracle Database.
Führen Sie den folgenden Befehl aus, um die Tabelle Produkt zu erstellen und einen Testdatensatz einzufügen:

-- Create the Product table
CREATE TABLE Product (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(100) NOT NULL,
    price NUMBER(10, 2) NOT NULL
);

-- Insert a quick test record (optional, so your UI isn't empty on first load)
INSERT INTO Product (id, name, price) 
VALUES (1, 'Test Migration Item', 99.99);

-- Commit the transaction
COMMIT;

Entwicklungsmaschine

Kompilieren Sie mit diesem Rechner die Java-Quelle, und erstellen Sie das Package. Installieren Sie die folgende Software, um die Anwendung auszuführen.
  • Java Development Kit (JDK): Laden Sie JDK 25 herunter, und installieren Sie es.
  • Oracle JDBC-Treiber: Laden Sie den Standalone-Treiber ojdbc17.jar herunter.

Application Server (Compute Engine - Oracle Linux-VM-Instanz 9+)

Auf diesem Rechner können Sie das Java-Package bereitstellen und die Anwendung ausführen, die eine Verbindung zur Oracle Exadata-Datenbank herstellt. Installieren Sie die folgende Software, um die Anwendung auszuführen.

  • Java Runtime Environment (JRE/JDK): Installieren Sie OpenJDK 25.
    sudo dnf install java-25-openjdk
  • Oracle JDBC-Treiber: Laden Sie dieselbe ojdbc17.jar-Datei neben Ihrer Anwendung hoch.
  • Stellen Sie sicher, dass Port 8080 in den VPC-Firewallregeln geöffnet ist, die mit der VM-Instanz verknüpft sind.Dieser Screenshot zeigt, wie Sie sicherstellen, dass der Port auf 8080 gesetzt ist.
  • Führen Sie den folgenden Befehl aus, um den Linux-Firewallport 8080 zu aktivieren.
    
    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-ports

Implementierung

  1. Auf Entwicklungsmaschine erstellen und verpacken
    1. Platzieren Sie SimpleProductApp.java und ojdbc17.jar in demselben Verzeichnis.
      import java.io.*;
      import java.net.InetSocketAddress;
      import java.sql.*;
      import com.sun.net.httpserver.*;
      
      public class SimpleProductApp {
          // Read sensitive info from environment variables
          private static final String DB_URL = System.getenv("DB_URL");
          private static final String DB_USER = System.getenv("DB_USER");
          private static final String DB_PASS = System.getenv("DB_PASS");
      
          public static void main(String[] args) throws Exception {
              if (DB_URL == null || DB_USER == null || DB_PASS == null) {
                  System.err.println("ERROR: Missing DB_URL, DB_USER, or DB_PASS environment variables.");
                  System.exit(1);
              }
      
              // Create a built-in Java HTTP Server on port 8080
              HttpServer server = HttpServer.create(new InetSocketAddress(8080), 0);
              server.createContext("/", new ProductHandler());
              server.setExecutor(null); 
              server.start();
              System.out.println("Server started on port 8080.");
              System.out.println("Connecting to Exadata at: " + DB_URL);
          }
      
          static class ProductHandler implements HttpHandler {
              @Override
              public void handle(HttpExchange exchange) throws IOException {
                  String method = exchange.getRequestMethod();
                  StringBuilder responseHTML = new StringBuilder();
                  
                  try (Connection conn = DriverManager.getConnection(DB_URL, DB_USER, DB_PASS)) {
                      
                      // Handle POST requests (Create, Update, Delete)
                      if ("POST".equalsIgnoreCase(method)) {
                          InputStreamReader isr = new InputStreamReader(exchange.getRequestBody(), "utf-8");
                          BufferedReader br = new BufferedReader(isr);
                          String formData = br.readLine();
                          
                          // Simple URL-encoded parsing (action=add&id=1&name=Apples&price=10)
                          String[] params = formData.split("&");
                          String action = getValue(params, 0);
                          String id = getValue(params, 1);
                          String name = getValue(params, 2);
                          String price = getValue(params, 3);
      
                          try (Statement stmt = conn.createStatement()) {
                              if ("add".equals(action)) {
                                  stmt.executeUpdate("INSERT INTO Product (id, name, price) VALUES (" + id + ", '" + name + "', " + price + ")");
                              } else if ("update".equals(action)) {
                                  stmt.executeUpdate("UPDATE Product SET name='" + name + "', price=" + price + " WHERE id=" + id);
                              } else if ("delete".equals(action)) {
                                  stmt.executeUpdate("DELETE FROM Product WHERE id=" + id);
                              }
                          }
                      }
      
                      // Handle GET requests (Read/View UI)
                      responseHTML.append("<html><body style='font-family: sans-serif; padding: 20px;'>");
                      responseHTML.append("<h2>Exadata Product Manager</h2>");
                      
                      // Input Form
                      responseHTML.append("<form method='POST' style='background: #f4f4f4; padding: 15px; width: 300px;'>")
                                  .append("Action: <select name='action'><option value='add'>Add</option><option value='update'>Update</option><option value='delete'>Delete</option></select><br/><br/>")
                                  .append("ID: <input type='number' name='id' required><br/><br/>")
                                  .append("Name: <input type='text' name='name'><br/><br/>")
                                  .append("Price: <input type='number' step='0.01' name='price'><br/><br/>")
                                  .append("<input type='submit' value='Execute'>")
                                  .append("</form><br/>");
      
                      // Data Table
                      responseHTML.append("<table border='1' cellpadding='8' style='border-collapse: collapse;'>")
                                  .append("<tr style='background: #ddd;'><th>ID</th><th>Name</th><th>Price</th></tr>");
                      
                      try (Statement stmt = conn.createStatement();
                           ResultSet rs = stmt.executeQuery("SELECT id, name, price FROM Product ORDER BY id")) {
                          while (rs.next()) {
                              responseHTML.append("<tr><td>").append(rs.getInt("id")).append("</td>")
                                          .append("<td>").append(rs.getString("name")).append("</td>")
                                          .append("<td>").append(rs.getDouble("price")).append("</td></tr>");
                          }
                      }
                      responseHTML.append("</table></body></html>");
      
                  } catch (SQLException e) {
                      responseHTML.append("<h3>Database Error: ").append(e.getMessage()).append("</h3>");
                  }
      
                  // Send Response
                  byte[] responseBytes = responseHTML.toString().getBytes("UTF-8");
                  exchange.sendResponseHeaders(200, responseBytes.length);
                  OutputStream os = exchange.getResponseBody();
                  os.write(responseBytes);
                  os.close();
              }
      
              private String getValue(String[] params, int index) {
                  if (index < params.length && params[index].contains("=")) {
                      return params[index].split("=").length > 1 ? params[index].split("=")[1] : "";
                  }
                  return "";
              }
          }
      }
    2. Öffnen Sie die Eingabeaufforderung oder das Terminal, und führen Sie Folgendes aus.
    3. Führen Sie den folgenden Befehl aus, um die Java-Datei zu kompilieren.
      javac -cp ojdbc17.jar SimpleProductApp.java
    4. In JAR packen verpackt die kompilierte .class-Datei in einer ausführbaren JAR-Datei. Sie müssen den Oracle JDBC-Treiber nicht in der JAR bündeln. Geben Sie den Treiber zur Laufzeit mithilfe des Klassenpfads an.
      jar cfe app.jar SimpleProductApp *.class
      Hinweis

      Wenn der Befehl jar unter Windows nicht erkannt wird, aktualisieren Sie das System PATH.

    5. Nach einer erfolgreichen Kompilierung und einem erfolgreichen Package werden im Ausgabeverzeichnis zusätzliche Dateien als app.jar erstellt.Dieser Screenshot zeigt die Verzeichnisdateien.
  2. Auf Compute Engine bereitstellen und ausführen - Oracle Linux-VM-Instanz 9+
    1. Übertragen Sie app.jar und ojdbc17.jar mit SCP oder SFTP auf Ihre Oracle Linux-VM.
    2. Um Umgebungsvariablen festzulegen, exportieren Sie die Verbindungszeichenfolgen und Zugangsdaten der Exadata-Datenbank direkt im Linux-Terminal. Ersetzen Sie die Platzhalter durch Ihre Exadata-Datenbankwerte.
      
      export DB_URL="jdbc:oracle:thin:@//<exadata-ip-or-scan>:1521/<service_name>"
      export DB_USER="your_db_username"
      export DB_PASS="your_db_password"
    3. Führen Sie den folgenden Befehl aus, um die Anwendung zu starten, indem Sie sicherstellen, dass sich die Anwendung und der Oracle JDBC-Treiber im Classpath befinden.
      
      nohup java -cp app.jar:ojdbc17.jar SimpleProductApp > app.log 2>&1 &
      
      # check logs
      cat app.log
    4. Um auf die UI zuzugreifen, öffnen Sie einen Webbrowser, und navigieren Sie zu http://<google-vm-public-ip>:8080.
    5. Nachdem die Anwendung erfolgreich gestartet wurde, zeigt die UI Optionen zur Verwaltung von Produkten an.Dieser Screenshot zeigt die Benutzeroberfläche zur Verwaltung der Produkte.
  3. Bereinigen
    1. Führen Sie den folgenden Befehl aus, um die Java-Anwendung zu beenden und den aktivierten HTTP-Service aus app.jar zu stoppen.
      pkill -f SimpleProductApp