VM de Computação do Azure

Este tópico explica as etapas necessárias para estabelecer conexão com o Oracle Exadata Database Service on Dedicated Infrastructure no Oracle AI Database@Azure de um aplicativo Java em execução em uma Máquina Virtual Linux do Azure.

Pré-requisitos

Esta seção descreve os requisitos para implantar, compilar e empacotar um aplicativo Java e, em seguida, implantá-lo no aplicativo para estabelecer conexão com o Oracle Exadata Database Service on Dedicated Infrastructure com a tabela Produtos para executar operações de criação, leitura, atualização e exclusão (CRUD).

Banco de Dados Oracle Exadata

Este banco de dados é conectado do Servidor de Aplicativos usando o aplicativo Java.
  • Detalhes da conexão do Oracle Exadata Database Service on Dedicated Infrastructure
  • Um usuário do Oracle Database para criar sessões de banco de dados e executar comandos SQL.
  • Conectividade do servidor de aplicativos com o Oracle Exadata Database.
  • Uma tabela de produtos no Oracle Database.
Execute o seguinte comando para criar a tabela Produto e inserir um registro de teste:

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

Máquina de Desenvolvimento

Use esta máquina para compilar a origem Java e criar o pacote. Instale o software a seguir para executar o aplicativo.
  • JDK (Java Development Kit): Faça download do JDK 25 e instale-o.
  • Driver Oracle JDBC: Faça download do ojdbc17.jar stand-alone.

Servidor de Aplicativos (Azure Oracle Linux VM 9+)

Use esta máquina para implantar o pacote Java e executar o aplicativo que se conecta ao Exadata Database. Instale o software a seguir para executar o aplicativo.

  • Java Runtime Environment (JRE/JDK): Instale o OpenJDK 25.
    sudo dnf install java-25-openjdk
  • Driver JDBC da Oracle: Faça upload do mesmo arquivo ojdbc17.jar junto com seu aplicativo.
  • Certifique-se de que a porta 8080 esteja aberta nas definições do Grupo de Segurança de Rede do Azure.Esta captura de tela mostra como garantir que a porta esteja definida corretamente.
  • Execute o comando a seguir para ativar a porta de firewall Linux 8080.
    
    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-ports

Implementação

  1. Criar e Empacotar na Máquina de Desenvolvimento
    1. Coloque SimpleProductApp.java e ojdbc17.jar no mesmo diretório.
      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. Abra o prompt de comando ou terminal e execute o seguinte.
    3. Execute o comando a seguir para compilar o arquivo Java.
      javac -cp ojdbc17.jar SimpleProductApp.java
    4. Pacote em um JAR empacota o arquivo .class compilado em um JAR executável. Não é necessário agrupar o driver JDBC da Oracle no JAR. Forneça o driver no runtime usando o caminho da classe.
      jar cfe app.jar SimpleProductApp *.class
      Observação

      Se o comando jar não for reconhecido no Windows, atualize o sistema PATH.

    5. Após uma compilação e um pacote bem-sucedidos, o diretório de saída terá arquivos adicionais criados como app.jar.Esta captura de tela mostra os arquivos de diretório.
  2. Implantar e Executar na VM do Oracle Linux do Azure
    1. Transfira app.jar e ojdbc17.jar para a sua Oracle Linux VM usando SCP ou SFTP.
    2. Para definir variáveis de ambiente, exporte suas strings de conexão e credenciais do Exadata Database diretamente no terminal do Linux. Substitua os placeholders pelos valores do Exadata Database.
      
      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. Execute o comando a seguir para iniciar o aplicativo, garantindo que o aplicativo e o driver JDBC da Oracle estejam no classpath.
      
      nohup java -cp app.jar:ojdbc17.jar SimpleProductApp > app.log 2>&1 &
      
      # check logs
      cat app.log
    4. Para acessar a interface do usuário, abra um Web browser e navegue até http://<azure-vm-public-ip>:8080.
    5. Depois que o aplicativo é iniciado com sucesso, a IU exibe opções para gerenciar Produtos.Esta captura de tela mostra a IU para gerenciar os Produtos.
  3. Limpar
    1. Execute o comando a seguir para encerrar o aplicativo Java para interromper o serviço HTTP ativado em app.jar.
      pkill -f SimpleProductApp