共用方式為


在 Azure App Service 中設定 Tomcat、JBoss 或 Java SE 應用程式的資料來源

本文說明如何在 App Service 中設定 Java SE、Tomcat 或 JBoss 應用程式中的資料來源。

Azure App Service 會以三種變體在完全受控的服務上執行 Java Web 應用程式:

  • Java SE - 可以執行部署為包含內嵌伺服器的 JAR 套件的應用程式 (例如 Spring Boot、Dropwizard、Quarkus 或具有內嵌 Tomcat 或 Jetty 伺服器的應用程式)。
  • Tomcat - 內建 Tomcat 伺服器可以執行部署為 WAR 套件的應用程式。
  • JBoss EAP - 僅支持免費、進階 v3 和隔離 v2 定價層中的Linux應用程式。 內建 JBoss EAP 伺服器可以執行部署為 WAR 或 EAR 套件的應用程式。

注意

針對 Spring 應用程式,我們建議使用 Azure Spring 應用程式。 不過,您仍然可以使用 Azure App Service 作為目的地。 如需建議,請參閱 Java 工作負載目的地指導

設定資料來源

若要連接到 Spring Boot 應用程式中的資料來源,建議您建立連接字串,並將其插入 application.properties 檔案。

  1. 在 App Service 頁面的 [設定] 區段中,設定字串的名稱,在 [值] 欄位中貼上 JDBC 連接字串,並將類型設定為 [自訂]。 您可以選擇將此連接字串設定為位置設定。

    此連接字串可以名為 CUSTOMCONNSTR_<your-string-name> 的環境變數提供應用程式存取。 例如: CUSTOMCONNSTR_exampledb

  2. application.properties 檔案中,使用環境變數名稱來參考此連接字串。 在我們的範例中,我們會使用下列程式碼:

    app.datasource.url=${CUSTOMCONNSTR_exampledb}
    

如需詳細資訊,請參閱有關資料存取的 Spring Boot 文件外部化設定

提示

根據預設,Linux Tomcat 容器可以在 Tomcat 伺服器中自動為您設定共用資料來源。 唯一要做的就是將包含有效 JDBC 連接字串 的應用程式設定新增至 Oracle、SQL Server、PostgreSQL 或 MySQL 資料庫(包括連線認證),而 App Service 會自動使用容器中可用的適當驅動程式,將對應的共用資料庫新增至 /usr/local/tomcat/conf/context.xml。 如需使用此方法的端對端案例,請參閱教學課程:使用 Linux 上的 App Service 和 MySQL 建置 Tomcat Web 應用程式

這些指示適用於所有資料庫連線。 您必須在預留位置中填入您所選資料庫的驅動程式類別名稱和 JAR 檔案。 下表提供常見資料庫的類別名稱和驅動程式下載。

Database 驅動程式類別名稱 JDBC 驅動程式
PostgreSQL org.postgresql.Driver 下載
MySQL com.mysql.jdbc.Driver 下載 (請選取 [Platform Independent] \(不受平台影響\))
SQL Server com.microsoft.sqlserver.jdbc.SQLServerDriver 下載

若要設定讓 Tomcat 使用「Java 資料庫連線」(JDBC) 或「Java 保存 API」(JPA),請先自訂 Tomcat 在啟動時所讀入的 CATALINA_OPTS 環境變數。 請透過 App Service Maven 外掛程式中的應用程式設定來設定這些值:

<appSettings>
    <property>
        <name>CATALINA_OPTS</name>
        <value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
    </property>
</appSettings>

或是在 Azure 入口網站的 [設定]>[應用程式設定] 頁面中設定環境變數。

接著,決定資料來源應僅供在 Tomcat Servlet 上執行的一個應用程式還是所有應用程式使用。

應用程式層級資料來源

  1. 在專案的 META-INF/ 目錄中,建立 context.xml 檔案。 建立 META-INF/ 目錄 (如果此目錄不存在)。

  2. context.xml 中,新增 Context 元素以將資料來源連結至 JNDI 位址。 以上表中您驅動程式的類別名稱取代 driverClassName 預留位置。

    <Context>
        <Resource
            name="jdbc/dbconnection"
            type="javax.sql.DataSource"
            url="${connURL}"
            driverClassName="<insert your driver class name>"
            username="${dbuser}"
            password="${dbpassword}"
        />
    </Context>
    
  3. 更新您應用程式的 web.xml,以使用您應用程式中的資料來源。

    <resource-env-ref>
        <resource-env-ref-name>jdbc/dbconnection</resource-env-ref-name>
        <resource-env-ref-type>javax.sql.DataSource</resource-env-ref-type>
    </resource-env-ref>
    

共用伺服器層級資源

要新增共用的伺服器層級資料來源就必須編輯 Tomcat 的 server.xml。 最可靠的操作方式如下:

  1. 上傳啟動指令碼,並在 [設定]>[啟動命令] 中設定指令碼的路徑。 您可以使用 FTP 上傳啟動指令碼。

啟動指令碼會對 server.xml 檔案進行 xsl 轉換,並將產生的 xml 檔案輸出至 /usr/local/tomcat/conf/server.xml。 啟動指令碼會透過 apk 安裝 libxslt。 您可以透過 FTP 上傳 xsl 檔案和啟動指令碼。 以下是啟動指令碼範例。

# Install libxslt. Also copy the transform file to /home/tomcat/conf/
apk add --update libxslt

# Usage: xsltproc --output output.xml style.xsl input.xml
xsltproc --output /home/tomcat/conf/server.xml /home/tomcat/conf/transform.xsl /usr/local/tomcat/conf/server.xml

下列範例 XSL 檔案會將新的連接器節點加入至 Tomcat server.xml。

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
  <xsl:output method="xml" indent="yes"/>

  <xsl:template match="@* | node()" name="Copy">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()"/>
    </xsl:copy>
  </xsl:template>

  <xsl:template match="@* | node()" mode="insertConnector">
    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template match="comment()[not(../Connector[@scheme = 'https']) and
                                 contains(., '&lt;Connector') and
                                 (contains(., 'scheme=&quot;https&quot;') or
                                  contains(., &quot;scheme='https'&quot;))]">
    <xsl:value-of select="." disable-output-escaping="yes" />
  </xsl:template>

  <xsl:template match="Service[not(Connector[@scheme = 'https'] or
                                   comment()[contains(., '&lt;Connector') and
                                             (contains(., 'scheme=&quot;https&quot;') or
                                              contains(., &quot;scheme='https'&quot;))]
                                  )]
                      ">
    <xsl:copy>
      <xsl:apply-templates select="@* | node()" mode="insertConnector" />
    </xsl:copy>
  </xsl:template>

  <!-- Add the new connector after the last existing Connnector if there's one -->
  <xsl:template match="Connector[last()]" mode="insertConnector">
    <xsl:call-template name="Copy" />

    <xsl:call-template name="AddConnector" />
  </xsl:template>

  <!-- ... or before the first Engine if there's no existing Connector -->
  <xsl:template match="Engine[1][not(preceding-sibling::Connector)]"
                mode="insertConnector">
    <xsl:call-template name="AddConnector" />

    <xsl:call-template name="Copy" />
  </xsl:template>

  <xsl:template name="AddConnector">
    <!-- Add new line -->
    <xsl:text>&#xa;</xsl:text>
    <!-- This is the new connector -->
    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" 
               maxThreads="150" scheme="https" secure="true" 
               keystoreFile="${{user.home}}/.keystore" keystorePass="changeit"
               clientAuth="false" sslProtocol="TLS" />
  </xsl:template>

</xsl:stylesheet>

完成設定

最後,將驅動程式 JAR 放在 Tomcat 類別路徑中,然後重新啟動您的 App Service。

  1. 請確定 Tomcat classloader 可以使用 JDBC 驅動程式檔案,方法是將它們放在 [/home/site/lib] 目錄中。 在 Cloud Shell 中,為每個驅動程式 JAR 執行 az webapp deploy --type=lib
az webapp deploy --resource-group <group-name> --name <app-name> --src-path <jar-name>.jar --type=lib --path <jar-name>.jar

如果您已建立伺服器層級的資料來源,請重新啟動 App Service Linux 應用程式。 Tomcat 會將 CATALINA_BASE 重設為 /home/tomcat,並使用更新後的設定。

提示

根據預設,Linux JBoss 容器可以在 JBoss 伺服器中為您自動設定共享數據源。 唯一要做的就是使用容器中可用的適當驅動程式,將包含有效 JDBC 連接字串 的應用程式設定新增至 Oracle、SQL Server、PostgreSQL 或 MySQL 資料庫(包括連接認證),而 App Service 會自動新增對應的共用數據源。 如需使用此方法的端對端案例,請參閱教學課程:在Linux和 MySQL 上建置具有 Azure App 服務 的 JBoss Web 應用程式。

向 JBoss EAP 註冊數據源時,有三個核心步驟:

  1. 上傳 JDBC 驅動程式。
  2. 將 JDBC 驅動程式新增為模組。
  3. 使用 模組新增數據源。

App Service 是無狀態裝載服務,因此您必須將這些步驟放入啟動腳本中,並在每次 JBoss 容器啟動時執行。 使用 PostgreSQL、MySQL 和 SQL 資料庫 作為範例:

  1. 將您的 JBoss CLI 命令放入名為 jboss-cli-commands.cli 的檔案中。 JBoss 命令必須新增模組,並將其註冊為資料來源。 下列範例顯示 JBoss CLI 命令,用來建立具有 JNDI 名稱 java:jboss/datasources/postgresDS的 PostgreSQL 數據源。

    module add --name=org.postgresql --resources=/home/site/libs/postgresql-42.7.4.jar
    /subsystem=datasources/jdbc-driver=postgresql:add(driver-name="postgresql",driver-module-name="org.postgresql",driver-class-name="org.postgresql.Driver",driver-xa-datasource-class-name="org.postgresql.xa.PGXADataSource")
    data-source add --name=postgresql --driver-name="postgresql" --jndi-name="java:jboss/datasources/postgresDS" --connection-url="jdbc:postgresql://\${env.DB_HOST}:5432/postgres" --user-name="\${env.DB_USERNAME}" --password="\${env.DB_PASSWORD}" --enabled=true --use-java-context=true
    

    請注意, module add 此命令使用三個環境變數 (DB_HOSTDB_USERNAMEDB_PASSWORD),您必須在 App Service 中新增為應用程式設定。 腳本會新增它們而不 --resolve-parameter-values 加上 旗標,讓 JBoss 不會以純文字儲存其值。

  2. 建立會呼叫 JBoss CLI 命令的啟動腳本 startup.sh。 下列範例顯示如何呼叫 jboss-cli-commands.cli。 稍後,您會設定 App Service,以在容器啟動時執行此指令碼。

    $JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss_cli_commands.cli
    
  3. 使用您選擇的部署選項,將 JDBC 驅動程式、 jboss-cli-commands.clistartup.sh 上傳至個別腳本中指定的路徑。 特別是,將 startup.sh 上傳為啟動檔案。 例如:

    export RESOURCE_GROUP_NAME=<resource-group-name>
    export APP_NAME=<app-name>
    
    # The lib type uploads to /home/site/libs by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path postgresql-42.7.4.jar --target-path postgresql-42.7.4.jar --type lib
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path jboss_cli_commands.cli --target-path /home/site/scripts/jboss_cli_commands.cli --type static
    # The startup type uploads to /home/site/scripts/startup.sh by default.
    az webapp deploy --resource-group $RESOURCE_GROUP_NAME --name $APP_NAME --src-path startup.sh --type startup
    

    如需詳細資訊,請參閱 將檔案部署至 App Service

若要確認資料來源已新增至 JBoss 伺服器,請透過 SSH 連線到您的 webapp 並執行 $JBOSS_HOME/bin/jboss-cli.sh --connect。 連線到 JBoss 之後,請執行 /subsystem=datasources:read-resource 以列印資料來源的清單。

如先前 jboss-cli-commands.cli 所定義,您可以使用 JNDI 名稱 java:jboss/datasources/postgresDS存取 PostgreSQL 連線。

下一步

瀏覽適用於 Java 開發人員的 Azure 中心,以找出 Azure 快速入門、教學課程和 Java 參考文件。