將 Amazon RDS 數據庫實例添加到您的 Java Elastic Beanstalk 環境 - AWS Elastic Beanstalk

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

將 Amazon RDS 數據庫實例添加到您的 Java Elastic Beanstalk 環境

本主題提供RDS使用 Elastic Beanstalk 控制台建立 Amazon 的說明。您可以使用 Amazon Relational Database Service (AmazonRDS) 資料庫執行個體來存放應用程式收集和修改的資料。資料庫可連接到您的環境並由 Elastic Beanstalk 管理,或者在外部建立與管理。

如果您是第一次使RDS用 Amazon,請使用 Elastic Beanstalk 主控台將資料庫執行個體新增至測試環境,並確認您的應用程式是否可以連線到該執行個體。

欲將資料庫執行個體新增到您的環境
  1. 開啟彈性魔豆控制台,然後在區域清單中選取您的. AWS 區域

  2. 在導覽窗格中,選擇環境,然後在清單中選擇您環境的名稱。

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

  3. 在導覽窗格中,選擇 Configuration (組態)

  4. Database (資料庫) 組態類別中,選擇 Edit (編輯)

  5. 選擇資料庫引擎,並輸入使用者名稱和密碼。

  6. 若要儲存變更,請選擇頁面底部的儲存變更

新增資料庫執行個體約需要 10 分鐘。環境更新完成時,資料庫執行個體的主機名稱和其他連線資訊會透過下列環境屬性提供給您的應用程式:

屬性名稱 描述 屬性值

RDS_HOSTNAME

資料庫執行個體的主機名稱。

在 Amazon RDS 主控台的「連線和安全性」索引標籤上:端點

RDS_PORT

資料庫執行個體接受連線的連接埠。預設值在不同資料庫引擎中有所差異。

Amazon RDS 主控台上的「連線和安全性」索引標籤上:連接

RDS_DB_NAME

資料庫名稱,ebdb

在 Amazon RDS 主控台的「組態」索引標籤上:資料庫名稱

RDS_USERNAME

您為資料庫設定的使用者名稱。

在 Amazon RDS 主控台的「組態」索引標籤上:主要使用者名稱

RDS_PASSWORD

您為資料庫設定的密碼。

在 Amazon RDS 控制台中不提供參考。

如需設定內部資料庫執行個體的詳細資訊,請參閱將資料庫新增至您的 Elastic Beanstalk 環境。如需有關設定外部資料庫搭配 Elastic Beanstalk 使用的說明,請參閱使用 Elastic Beanstalk 與 Amazon RDS

要連接到數據庫,請將適當的驅動程序JAR文件添加到您的應用程序,在代碼中加載驅動程序類,並使用 Elastic Beanstalk 提供的環境屬性創建連接對象。

下載JDBC驅動程式

您將需要您選擇的數據庫引擎的JDBC驅動程序JAR文件。將JAR文件保存在源代碼中,並在編譯創建數據庫連接的類時將其包含在類路徑中。

您可於下列位置找到資料庫引擎最新的驅動程式:

要使用JDBC驅動程序,請Class.forName()DriverManager.getConnection()在代碼中創建連接之前調用加載驅動程序。

JDBC使用以下格式的連接字串:

jdbc:driver://hostname:port/dbName?user=userName&password=password

您可從 Elastic Beanstalk 提供您應用程式的環境變數,擷取主機名稱、連接埠、資料庫名稱、使用者名稱和密碼。驅動程式名稱為您的資料庫類型和驅動程式版本專屬。下列為範例驅動程式名稱:

  • mysql為了我 SQL

  • postgresql對於波斯特格雷 SQL

  • oracle:thin (適用於 Oracle Thin)

  • oracle:oci對於甲骨文 OCI

  • oracle:oci8對於甲骨文 OCI 8

  • oracle:kprb對於甲骨文 KPRB

  • sqlserver用於SQL伺服器

連線至資料庫 (Java SE 平台)

在 Java SE 環境中,請使用 System.getenv() 從環境讀取連線變數。下列範例程式碼會顯示建立與 Postgre SQL 資料庫連線的類別。

private static Connection getRemoteConnection() { if (System.getenv("RDS_HOSTNAME") != null) { try { Class.forName("org.postgresql.Driver"); String dbName = System.getenv("RDS_DB_NAME"); String userName = System.getenv("RDS_USERNAME"); String password = System.getenv("RDS_PASSWORD"); String hostname = System.getenv("RDS_HOSTNAME"); String port = System.getenv("RDS_PORT"); String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password; logger.trace("Getting remote connection with connection string from environment variables."); Connection con = DriverManager.getConnection(jdbcUrl); logger.info("Remote connection successful."); return con; } catch (ClassNotFoundException e) { logger.warn(e.toString());} catch (SQLException e) { logger.warn(e.toString());} } return null; }

連線至資料庫 (Tomcat 平台)

在 Tomcat 環境中,環境屬性可做為透過 System.getProperty() 存取的系統屬性。

下列範例程式碼會顯示建立與 Postgre SQL 資料庫連線的類別。

private static Connection getRemoteConnection() { if (System.getProperty("RDS_HOSTNAME") != null) { try { Class.forName("org.postgresql.Driver"); String dbName = System.getProperty("RDS_DB_NAME"); String userName = System.getProperty("RDS_USERNAME"); String password = System.getProperty("RDS_PASSWORD"); String hostname = System.getProperty("RDS_HOSTNAME"); String port = System.getProperty("RDS_PORT"); String jdbcUrl = "jdbc:postgresql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password; logger.trace("Getting remote connection with connection string from environment variables."); Connection con = DriverManager.getConnection(jdbcUrl); logger.info("Remote connection successful."); return con; } catch (ClassNotFoundException e) { logger.warn(e.toString());} catch (SQLException e) { logger.warn(e.toString());} } return null; }

如果您無法取得連線或執行SQL陳述式,請嘗試將下列程式碼放在JSP檔案中。此程式碼會連線至資料庫執行個體、建立資料表並寫入其中。

<%@ page import="java.sql.*" %> <% // Read RDS connection information from the environment String dbName = System.getProperty("RDS_DB_NAME"); String userName = System.getProperty("RDS_USERNAME"); String password = System.getProperty("RDS_PASSWORD"); String hostname = System.getProperty("RDS_HOSTNAME"); String port = System.getProperty("RDS_PORT"); String jdbcUrl = "jdbc:mysql://" + hostname + ":" + port + "/" + dbName + "?user=" + userName + "&password=" + password; // Load the JDBC driver try { System.out.println("Loading driver..."); Class.forName("com.mysql.jdbc.Driver"); System.out.println("Driver loaded!"); } catch (ClassNotFoundException e) { throw new RuntimeException("Cannot find the driver in the classpath!", e); } Connection conn = null; Statement setupStatement = null; Statement readStatement = null; ResultSet resultSet = null; String results = ""; int numresults = 0; String statement = null; try { // Create connection to RDS DB instance conn = DriverManager.getConnection(jdbcUrl); // Create a table and write two rows setupStatement = conn.createStatement(); String createTable = "CREATE TABLE Beanstalk (Resource char(50));"; String insertRow1 = "INSERT INTO Beanstalk (Resource) VALUES ('EC2 Instance');"; String insertRow2 = "INSERT INTO Beanstalk (Resource) VALUES ('RDS Instance');"; setupStatement.addBatch(createTable); setupStatement.addBatch(insertRow1); setupStatement.addBatch(insertRow2); setupStatement.executeBatch(); setupStatement.close(); } catch (SQLException ex) { // Handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } finally { System.out.println("Closing the connection."); if (conn != null) try { conn.close(); } catch (SQLException ignore) {} } try { conn = DriverManager.getConnection(jdbcUrl); readStatement = conn.createStatement(); resultSet = readStatement.executeQuery("SELECT Resource FROM Beanstalk;"); resultSet.first(); results = resultSet.getString("Resource"); resultSet.next(); results += ", " + resultSet.getString("Resource"); resultSet.close(); readStatement.close(); conn.close(); } catch (SQLException ex) { // Handle any errors System.out.println("SQLException: " + ex.getMessage()); System.out.println("SQLState: " + ex.getSQLState()); System.out.println("VendorError: " + ex.getErrorCode()); } finally { System.out.println("Closing the connection."); if (conn != null) try { conn.close(); } catch (SQLException ignore) {} } %>

若要顯示結果,請將下列程式碼放置在JSP檔案HTML部分的主體中。

<p>Established connection to RDS. Read first two rows: <%= results %></p>

資料庫連線故障診斷

若您從應用程式建立資料庫連線出現問題,請檢視 Web 容器日誌和資料庫。

檢視日誌

您可於 Eclipse 內檢視 Elastic Beanstalk 環境的所有日誌。如果您未開啟 AWS [檔案總管] 檢視,請選擇工具列中橘色 AWS 圖示旁邊的箭頭,然後選擇 AWS [顯示檔案總管檢視]。展開 AWS Elastic Beanstalk 以及您的環境名稱,然後開啟伺服器的內容選單 (按一下滑鼠右鍵)。選擇在WTP伺服器編輯器中開啟

選擇 Server (伺服器) 檢視的 Log (日誌) 索引標籤,以查看您環境的彙整日誌。欲開啟最新的日誌,選擇頁面右上角的 Refresh (重新整理) 按鈕。

向下捲動在 /var/log/tomcat7/catalina.out 中找到 Tomcat 日誌。若您在之前的數個範例已載入網頁,可能會看到下列內容。

------------------------------------- /var/log/tomcat7/catalina.out ------------------------------------- INFO: Server startup in 9285 ms Loading driver... Driver loaded! SQLException: Table 'Beanstalk' already exists SQLState: 42S01 VendorError: 1050 Closing the connection. Closing the connection.

Web 應用程式傳送至標準輸出的所有資訊會顯示於 Web 容器日誌。在上述範例中,應用程式在每次載入頁面時都嘗試建立資料表。這會導致在第一個頁面加載之後的每個頁面加載時捕獲SQL異常。

以範例而言,上述為可接受情況。但實際在應用程式中,請於結構描述物件中保存資料庫定義,在模型類別中執行交易,並與控制器 Servlet 協調請求。

連接至RDS資料庫執行個體

您可以使用我的用SQL戶端應用程式直接連線至 Elastic Beanstalk 環境中的RDS資料庫執行個體。

首先,開啟資RDS料庫執行個體的安全群組,以允許來自電腦的流量。

  1. 開啟彈性魔豆控制台,然後在區域清單中選取您的. AWS 區域

  2. 在導覽窗格中,選擇環境,然後在清單中選擇您環境的名稱。

    注意

    如果您有許多環境,請使用搜尋列來篩選環境清單。

  3. 在導覽窗格中,選擇 Configuration (組態)

  4. Database (資料庫) 組態類別中,選擇 Edit (編輯)

  5. 端點旁邊,選擇 Amazon RDS 主控台連結。

  6. 在 [RDS儀表板] 執行個體詳細資料頁面的 [安全性和網路] 下,選擇安全性群組旁邊以 rds- 開頭的安全性群組

    注意

    資料庫可能有多個項目均標示為 Security Groups (安全群組)。只有在您擁有沒有默認 Amazon Virtual Private Cloud(AmazonVPC)的舊帳戶時,才使用第一個以 awseb 開頭的。

  7. Security group details (安全群組詳細資訊) 中,選擇 Inbound (傳入) 索引標籤,然後選擇 Edit (編輯)

  8. 為 My SQL (連接埠 3306) 新增規則,允許來自 IP 位址的流量 (以CIDR格式指定)。

  9. 選擇 Save (儲存)。變更會立即生效。

返回您環境的 Elastic Beanstalk 組態詳細資訊,並記下端點。您將使用網域名稱連線至RDS資料庫執行個體。

安裝「我的SQL用戶端」,並在連接埠 3306 上啟動到資料庫的連線。在 Windows 上,從 SQL「我的SQL首頁」安裝「我的工作台」,然後按照提示進行操作。

在 Linux 上,使用套件管理員為您的發行版安裝「我的用SQL戶端」。下列範例運作於 Ubuntu 和其他 Debian 的衍生產品。

// Install MySQL client $ sudo apt-get install mysql-client-5.5 ... // Connect to database $ mysql -h aas839jo2vwhwb.cnubrrfwfka8.us-west-2.rds.amazonaws.com -u username -ppassword ebdb Reading table information for completion of table and column names You can turn off this feature to get a quicker startup with -A Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 117 Server version: 5.5.40-log Source distribution ...

連線之後,您可以執行SQL指令來查看資料庫的狀態、是否已建立資料表和資料列,以及其他資訊。

mysql> SELECT Resource from Beanstalk; +--------------+ | Resource | +--------------+ | EC2 Instance | | RDS Instance | +--------------+ 2 rows in set (0.01 sec)