Computazione Google

In questo argomento vengono descritti i passi necessari per connettersi a Oracle Exadata Database Service on Dedicated Infrastructure in Oracle AI Database@Google Cloud da un'applicazione Java in esecuzione su un motore di computazione - Linux Virtual Machine.

Requisiti indispensabili

Questa sezione descrive i requisiti per distribuire, compilare e creare package un'applicazione Java, quindi distribuirla nell'applicazione per connettersi a Oracle Exadata Database con la tabella Prodotti per eseguire operazioni di creazione, lettura, aggiornamento ed eliminazione (CRUD).

Database Oracle Exadata

Questo database è connesso da Application Server utilizzando l'applicazione Java.
  • Dettagli di connessione a Oracle Exadata Database Service on Dedicated Infrastructure
  • Un utente di Oracle Database per creare sessioni di database ed eseguire comandi SQL.
  • Connettività dal server applicazioni al database Oracle Exadata.
  • Una tabella dei prodotti in Oracle Database.
Eseguire il comando riportato di seguito per creare la tabella Product e inserire un record di test.

-- 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;

Macchina di sviluppo

Utilizzare questo computer per compilare l'origine Java e creare il pacchetto. Installare il software seguente per eseguire l'applicazione.
  • Java Development Kit (JDK): scarica e installa JDK 25.
  • Driver JDBC Oracle: scaricare il driver ojdbc17.jar standalone.

Application Server (motore di calcolo - istanza VM 9+ di Oracle Linux)

Utilizzare questo computer per distribuire il package Java ed eseguire l'applicazione che si connette a Oracle Exadata Database. Installare il software seguente per eseguire l'applicazione.

  • Java Runtime Environment (JRE/JDK): installare OpenJDK 25.
    sudo dnf install java-25-openjdk
  • Driver JDBC Oracle: caricare lo stesso file ojdbc17.jar insieme all'applicazione.
  • Assicurarsi che la porta 8080 sia aperta nelle regole del firewall VPC associate all'istanza VM.Questo screenshot mostra come assicurarsi che la porta sia impostata su 8080.
  • Eseguire il comando seguente per abilitare la porta 8080 del firewall Linux.
    
    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-ports

Implementazione

  1. Generare e creare il package sul computer di sviluppo
    1. Posizionare SimpleProductApp.java e ojdbc17.jar nella stessa directory.
      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. Aprire il prompt dei comandi o il terminale ed eseguire quanto segue.
    3. Eseguire il comando seguente per compilare il file Java.
      javac -cp ojdbc17.jar SimpleProductApp.java
    4. Package in a JAR raggruppa il file .class compilato in un file JAR eseguibile. Non è necessario raggruppare il driver Oracle JDBC nel file JAR. Fornire il driver in fase di esecuzione utilizzando il classpath.
      jar cfe app.jar SimpleProductApp *.class
      Nota

      Se il comando jar non è riconosciuto in Windows, aggiornare il sistema PATH.

    5. Dopo una compilazione e un pacchetto riusciti, nella directory di output verranno creati altri file come app.jar.Questo screenshot mostra i file delle directory.
  2. Distribuisci ed esegui su Compute Engine - Istanza VM 9+ di Oracle Linux
    1. Trasferisci app.jar e ojdbc17.jar nella tua VM Oracle Linux utilizzando SCP o SFTP.
    2. Per impostare le variabili di ambiente, esportare le stringhe e le credenziali di connessione al database Exadata direttamente nel terminale Linux. Sostituire i segnaposto con i valori del database Exadata.
      
      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. Eseguire il comando seguente per avviare l'applicazione assicurandosi che sia l'applicazione che il driver Oracle JDBC si trovino nel classpath.
      
      nohup java -cp app.jar:ojdbc17.jar SimpleProductApp > app.log 2>&1 &
      
      # check logs
      cat app.log
    4. Per accedere all'interfaccia utente, aprire un browser Web e passare a http://<google-vm-public-ip>:8080.
    5. Dopo il corretto avvio dell'applicazione, nell'interfaccia utente vengono visualizzate le opzioni per la gestione dei prodotti.Questo screenshot mostra l'interfaccia utente per la gestione dei prodotti.
  3. Esegui cleanup
    1. Eseguire il comando seguente per arrestare l'applicazione Java e arrestare il servizio HTTP abilitato da app.jar.
      pkill -f SimpleProductApp