Machine virtuelle de calcul Azure

Cette rubrique décrit les étapes requises pour se connecter à Oracle Exadata Database Service on Dedicated Infrastructure dans Oracle AI Database@Azure à partir d'une application Java exécutée sur une machine virtuelle Azure Linux.

Conditions requises

This section describes the requirements to deploy, compile and package a Java application then deploy it on application to connect to Oracle Exadata Database Service on Dedicated Infrastructure with Products table for performing create, read, update, and delete (CRUD) operations.

Oracle Exadata Database

Cette base de données est connectée à partir du serveur d'applications à l'aide de l'application Java.
  • Oracle Exadata Database Service on Dedicated Infrastructure connection details
  • Utilisateur Oracle Database permettant de créer des sessions de base de données et d'exécuter des commandes SQL.
  • Connectivité du serveur d'applications à la base de données Oracle Exadata.
  • Une table de produits dans Oracle Database.
Exécutez la commande suivante pour créer la table Produit et insérer un enregistrement de 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;

Machine de développement

Utilisez cet ordinateur pour compiler la source Java et créer le package. Installez le logiciel suivant pour exécuter l'application.
  • Java Development Kit (JDK) : Téléchargez et installez JDK 25.
  • Pilote JDBC Oracle : Téléchargez le pilote ojdbc17.jar autonome.

Serveur d'applications (Azure Oracle Linux VM 9+)

Utilisez cet ordinateur pour déployer l'ensemble Java et exécuter l'application qui se connecte à la base de données Exadata. Installez le logiciel suivant pour exécuter l'application.

  • Java Runtime Environment (JRE/JDK) : Installez OpenJDK 25.
    sudo dnf install java-25-openjdk
  • Pilote Oracle JDBC : Chargez le même fichier ojdbc17.jar à côté de votre application.
  • Assurez-vous que le port 8080 est ouvert dans vos paramètres de groupe de sécurité de réseau Azure.Cette capture d'écran montre comment s'assurer que le port est correctement défini.
  • Exécutez la commande suivante pour activer le port de pare-feu Linux 8080.
    
    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-ports

Mise en oeuvre

  1. Construire et emballer sur la machine de développement
    1. Placez SimpleProductApp.java et ojdbc17.jar dans le même répertoire.
      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. Ouvrez l'invite de commande ou le terminal et exécutez la commande suivante.
    3. Exécutez la commande suivante pour compiler le fichier Java.
      javac -cp ojdbc17.jar SimpleProductApp.java
    4. Ensemble dans un fichier JAR regroupe le fichier .class compilé dans un fichier JAR exécutable. Vous n'avez pas besoin de regrouper le pilote JDBC Oracle dans le fichier JAR. Indiquez le pilote au moment de l'exécution à l'aide de la variable classpath.
      jar cfe app.jar SimpleProductApp *.class
      Note

      Si la commande jar n'est pas reconnue sous Windows, mettez à jour le système PATH.

    5. Une fois la compilation et l'ensemble réussis, des fichiers supplémentaires seront créés dans le répertoire de sortie en tant que app.jar.Cette capture d'écran présente les fichiers de répertoire.
  2. Déployer et exécuter sur une machine virtuelle Azure Oracle Linux
    1. Transférez app.jar et ojdbc17.jar vers votre machine virtuelle Oracle Linux à l'aide de SCP ou SFTP.
    2. Pour définir des variables d'environnement, exportez vos chaînes de connexion et données d'identification de base de données Exadata directement dans le terminal Linux. Remplacez les paramètres fictifs par vos valeurs de base de données 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. Exécutez la commande suivante pour démarrer l'application en vous assurant que votre application et le pilote JDBC Oracle se trouvent dans la variable classpath.
      
      nohup java -cp app.jar:ojdbc17.jar SimpleProductApp > app.log 2>&1 &
      
      # check logs
      cat app.log
    4. Pour accéder à l'interface utilisateur, ouvrez un navigateur Web et naviguez jusqu'à http://<azure-vm-public-ip>:8080.
    5. Une fois l'application démarrée, l'interface utilisateur affiche des options pour gérer les produits.Cette capture d'écran présente l'interface utilisateur permettant de gérer les produits.
  3. Nettoyer
    1. Exécutez la commande suivante pour mettre fin à l'application Java afin d'arrêter le service HTTP activé à partir de app.jar.
      pkill -f SimpleProductApp