Azure Compute VM

このトピックでは、Azure Linux Virtual Machineで実行されているJavaアプリケーションからOracle AI Database@AzureのOracle Exadata Database Service on Dedicated Infrastructureに接続するために必要なステップについて説明します。

前提条件

この項では、作成、読取り、更新および削除(CRUD)操作を実行するための「製品」表を使用してOracle Exadata Database Service on Dedicated Infrastructureに接続するために、Javaアプリケーションをデプロイ、コンパイルおよびパッケージ化してから、アプリケーションにデプロイするための要件について説明します。

Oracle Exadata Database

このデータベースは、Javaアプリケーションを使用してアプリケーション・サーバーから接続されます。
  • Oracle Exadata Database Service on Dedicated Infrastructure接続の詳細
  • データベース・セッションを作成し、SQLコマンドを実行するOracle Databaseユーザー。
  • アプリケーション・サーバーからOracle Exadata Databaseへの接続。
  • Oracle Databaseの製品表
次のコマンドを実行してProduct表を作成し、テスト・レコードを挿入します:

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

開発マシン

このマシンを使用して、Javaソースをコンパイルし、パッケージを作成します。次のソフトウェアをインストールして、アプリケーションを実行します。
  • Java Development Kit (JDK): JDK 25をダウンロードしてインストールします。
  • Oracle JDBCドライバ:スタンドアロンのojdbc17.jarをダウンロードします。

アプリケーション・サーバー(Azure Oracle Linux VM 9+)

このマシンを使用して、Javaパッケージをデプロイし、Exadata Databaseに接続するアプリケーションを実行します。次のソフトウェアをインストールして、アプリケーションを実行します。

  • Java Runtime Environment (JRE/JDK): OpenJDK 25をインストールします。
    sudo dnf install java-25-openjdk
  • Oracle JDBCドライバ: 同じojdbc17.jarファイルをアプリケーションと一緒にアップロードします。
  • Azure Network Security Groupの設定で、ポート8080が開いていることを確認します。このスクリーンショットは、ポートが正しく設定されていることを確認する方法を示しています。
  • 次のコマンドを実行して、Linuxファイアウォール・ポート8080を有効にします。
    
    sudo firewall-cmd --zone=public --add-port=8080/tcp --permanent
    sudo firewall-cmd --reload
    sudo firewall-cmd --list-ports

実装

  1. 開発マシンでのビルドおよびパッケージ化
    1. SimpleProductApp.javaojdbc17.jarを同じディレクトリに配置します。
      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. コマンド・プロンプトまたはターミナルを開き、次を実行します。
    3. 次のコマンドを実行して、Javaファイルをコンパイルします。
      javac -cp ojdbc17.jar SimpleProductApp.java
    4. JARへのパッケージ化は、コンパイルされた.classファイルを実行可能JARにパッケージ化します。Oracle JDBCドライバをJARにバンドルする必要はありません。クラス・パスを使用して、実行時にドライバを指定します。
      jar cfe app.jar SimpleProductApp *.class
      ノート

      Windowsでjarコマンドが認識されない場合は、システムPATHを更新します。

    5. コンパイルおよびパッケージが正常に完了すると、出力ディレクトリにはapp.jarとして追加のファイルが作成されます。このスクリーンショットは、ディレクトリ・ファイルを示しています。
  2. Azure Oracle Linux VMでのデプロイと実行
    1. SCPまたはSFTPを使用して、app.jarおよびojdbc17.jarをOracle Linux VMに転送します。
    2. 環境変数を設定するには、Linux端末でExadata Database接続文字列および資格証明を直接エクスポートします。プレースホルダを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. 次のコマンドを実行して、アプリケーションとOracle JDBCドライバの両方がクラスパスにあることを確認し、アプリケーションを起動します。
      
      nohup java -cp app.jar:ojdbc17.jar SimpleProductApp > app.log 2>&1 &
      
      # check logs
      cat app.log
    4. UIにアクセスするには、Webブラウザを開き、http://<azure-vm-public-ip>:8080にナビゲートします。
    5. アプリケーションが正常に起動すると、UIに製品を管理するためのオプションが表示されます。このスクリーンショットは、製品を管理するためのUIを示しています。
  3. 消去
    1. 次のコマンドを実行してJavaアプリケーションを終了し、app.jarから有効になっているHTTPサービスを停止します。
      pkill -f SimpleProductApp