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
- 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.
-- 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
- Java Development Kit (JDK) : Téléchargez et installez JDK 25.
- Pilote JDBC Oracle : Téléchargez le pilote
ojdbc17.jarautonome.
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
8080est ouvert dans vos paramètres de groupe de sécurité de réseau Azure.
- 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
- Construire et emballer sur la machine de développement
- Placez
SimpleProductApp.javaetojdbc17.jardans 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 ""; } } } - Ouvrez l'invite de commande ou le terminal et exécutez la commande suivante.
- Exécutez la commande suivante pour compiler le fichier Java.
javac -cp ojdbc17.jar SimpleProductApp.java - Ensemble dans un fichier JAR regroupe le fichier
.classcompilé 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 *.classNote
Si la commande
jarn'est pas reconnue sous Windows, mettez à jour le systèmePATH. - 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.
- Placez
- Déployer et exécuter sur une machine virtuelle Azure Oracle Linux
- Transférez
app.jaretojdbc17.jarvers votre machine virtuelle Oracle Linux à l'aide de SCP ou SFTP. - 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" - 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 - Pour accéder à l'interface utilisateur, ouvrez un navigateur Web et naviguez jusqu'à
http://<azure-vm-public-ip>:8080. - Une fois l'application démarrée, l'interface utilisateur affiche des options pour gérer les produits.

- Transférez
- Nettoyer
- 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
- Exécutez la commande suivante pour mettre fin à l'application Java afin d'arrêter le service HTTP activé à partir de