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
- 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.
-- 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
- Java Development Kit (JDK): scarica e installa JDK 25.
- Driver JDBC Oracle: scaricare il driver
ojdbc17.jarstandalone.
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.jarinsieme all'applicazione. - Assicurarsi che la porta
8080sia aperta nelle regole del firewall VPC associate all'istanza VM.
- 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
- Generare e creare il package sul computer di sviluppo
- Posizionare
SimpleProductApp.javaeojdbc17.jarnella 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 ""; } } } - Aprire il prompt dei comandi o il terminale ed eseguire quanto segue.
- Eseguire il comando seguente per compilare il file Java.
javac -cp ojdbc17.jar SimpleProductApp.java - Package in a JAR raggruppa il file
.classcompilato 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 *.classNota
Se il comando
jarnon è riconosciuto in Windows, aggiornare il sistemaPATH. - Dopo una compilazione e un pacchetto riusciti, nella directory di output verranno creati altri file come
app.jar.
- Posizionare
- Distribuisci ed esegui su Compute Engine - Istanza VM 9+ di Oracle Linux
- Trasferisci
app.jareojdbc17.jarnella tua VM Oracle Linux utilizzando SCP o SFTP. - 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" - 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 - Per accedere all'interfaccia utente, aprire un browser Web e passare a
http://<google-vm-public-ip>:8080. - Dopo il corretto avvio dell'applicazione, nell'interfaccia utente vengono visualizzate le opzioni per la gestione dei prodotti.

- Trasferisci
- Esegui cleanup
- Eseguire il comando seguente per arrestare l'applicazione Java e arrestare il servizio HTTP abilitato da
app.jar.pkill -f SimpleProductApp
- Eseguire il comando seguente per arrestare l'applicazione Java e arrestare il servizio HTTP abilitato da