你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
本文介绍如何在应用服务中配置 Java SE、Tomcat 或 JBoss 应用中的数据源。
Azure 应用服务以三种形式在完全托管的服务上运行 Java Web 应用程序:
- Java Standard Edition (SE):可以运行部署为 Java 存档 (JAR) 包的应用,其中包含嵌入式服务器(例如 Spring Boot、Quarkus、Dropwizard 或具有嵌入式 Tomcat 或 Jetty 服务器的应用)。
- Tomcat:内置 Tomcat 服务器可以运行部署为 Web 应用程序存档(WAR)包的应用。
- JBoss Enterprise 应用程序平台(EAP):内置的 JBoss EAP 服务器可以运行部署为 WAR 或企业存档(EAR)包的应用。 在一组定价层(包括免费、高级 v3 和独立 v2.gti)中支持 Linux 应用
注释
应用服务上的 JBoss EAP 现在支持“自带许可证”(BYOL)计费,这使具有现有 Red Hat 订阅的客户可以直接将这些许可证应用到 Azure 应用服务上的 JBoss EAP 部署。 了解详细信息。
配置数据源
若要连接 Spring Boot 中的数据源,我们建议创建连接字符串并将它们注入 application.properties 文件中。
在应用服务页面的“配置”部分,为字符串设置一个名称,将 JDBC 连接字符串粘贴到值字段中,然后将类型设置为“自定义”。 你可以选择将此连接字符串设置为槽设置。
此连接字符串可作为名为
CUSTOMCONNSTR_<your-string-name>的环境变量供应用程序访问。 例如CUSTOMCONNSTR_exampledb。在 application.properties 文件中,通过环境变量名称引用此连接字符串。 在我们的示例中,我们将使用以下代码:
app.datasource.url=${CUSTOMCONNSTR_exampledb}
有关详细信息,请参阅有关数据访问的 Spring Boot 文档和外部化配置。
提示
Linux Tomcat 容器可以通过将环境变量设置为 WEBSITE_AUTOCONFIGURE_DATABASEtrue 自动在 Tomcat 服务器中为你配置共享数据源。 你需要执行的唯一操作是将包含有效 JDBC 连接字符串的应用设置添加到 Oracle、SQL Server、PostgreSQL 或 MySQL 数据库(包括连接凭据),然后,应用服务会自动使用容器中提供的适当驱动程序将相应共享数据库添加到 /usr/local/tomcat/conf/context.xml。 有关使用此方法的端到端方案,请参阅教程:使用 Linux 上的 Azure 应用服务和 MySQL 生成 Tomcat Web 应用。
这些说明适用于所有数据库连接。 你需要使用你所选数据库的驱动程序类名称和 JAR 文件来填充占位符。 下面提供了一个表,其中包含了常见数据库的类名称和驱动程序下载。
| 数据库 | 驱动程序类名称 | JDBC 驱动程序 |
|---|---|---|
| PostgreSQL | org.postgresql.Driver |
下载 |
| MySQL | com.mysql.jdbc.Driver |
下载(选择“独立于平台”) |
| SQL Server | com.microsoft.sqlserver.jdbc.SQLServerDriver |
下载 |
若要将 Tomcat 配置为使用 Java Database Connectivity (JDBC) 或 Java 持久性 API (JPA),请先自定义在启动时由 Tomcat 读取的 CATALINA_OPTS 环境变量。 在应用服务 Maven 插件中通过某个应用设置来设置这些值:
<appSettings>
<property>
<name>CATALINA_OPTS</name>
<value>"$CATALINA_OPTS -Ddbuser=${DBUSER} -Ddbpassword=${DBPASSWORD} -DconnURL=${CONNURL}"</value>
</property>
</appSettings>
或者在 Azure 门户的“配置”>“应用程序设置”页中设置环境变量。
接下来,确定数据源应当供一个应用程序使用,还是供在 Tomcat servlet 上运行的所有应用程序使用。
应用程序级的数据源
若要配置应用程序级数据源,请执行以下作:
在项目的 META-INF/ 目录中创建一个 context.xml 文件。 如果没有 META-INF/ 目录,请创建一个。
在 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>更新应用程序的 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>
共享的服务器级资源
提示
Linux Tomcat 容器可以使用以下约定为复制到 /home/site/wwwroot 的文件自动应用 XSLT 文件:如果 server.xml.xsl 或 server.xml.xslt 存在,它们将应用于 Tomcat 的 server.xml。 如果 context.xml.xsl 存在或 context.xml.xslt 存在,它们将应用于 Tomcat 的 context.xml。
添加共享的服务器级数据源需要编辑 Tomcat 的 server.xml。 由于目录外部 /home 的文件更改是临时的,因此需要以编程方式应用 Tomcat 配置文件的更改,如下所示:
启动脚本对 文件进行 server.xml,并将生成的 XML 文件输出到 /usr/local/tomcat/conf/server.xml。 启动脚本应根据 Web 应用的 libxslt 来安装 xlstproc 或 。 XSL 文件和启动脚本可以通过 FTP 上传。 下面是一个示例启动脚本。
# Install the libxslt package on Alpine-based images:
apk add --update libxslt
# Install the xsltproc package on Debian or Ubuntu-based images:
apt install xsltproc
# Also copy the transform file to /home/tomcat/conf/
# 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(., '<Connector') and
(contains(., 'scheme="https"') or
contains(., "scheme='https'"))]">
<xsl:value-of select="." disable-output-escaping="yes" />
</xsl:template>
<xsl:template match="Service[not(Connector[@scheme = 'https'] or
comment()[contains(., '<Connector') and
(contains(., 'scheme="https"') or
contains(., "scheme='https'"))]
)]
">
<xsl:copy>
<xsl:apply-templates select="@* | node()" mode="insertConnector" />
</xsl:copy>
</xsl:template>
<!-- Add the new connector after the last existing Connector 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>
</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 类路径中并重启你的应用服务。
- 将 JDBC 驱动程序文件放入 /home/site/lib 目录,确保它们可供 Tomcat 类加载器使用。 在 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
如果你创建了服务器级数据源,请重启应用服务 Linux 应用程序。 Tomcat 会将 CATALINA_BASE 重置为 /home/tomcat 并使用更新的配置。
提示
默认情况下,Linux JBoss 容器可以自动在 JBoss 服务器中为你配置共享数据源。 唯一要做的就是将包含有效 JDBC 连接字符串的应用设置添加到 Oracle、SQL Server、PostgreSQL 或 MySQL 数据库(包括连接凭据),并添加具有该值WEBSITE_AUTOCONFIGURE_DATABASE的应用设置/环境变量true。 还支持使用服务连接器创建的 JDBC 连接。 应用服务使用容器中可用的适当驱动程序自动添加相应的共享数据源(基于应用设置名称和后缀 _DS)。 有关使用此方法的端到端方案,请参阅教程:在 Linux 上使用 Azure 应用服务和 MySQL 生成 JBoss Web 应用。
使用 JBoss EAP 注册数据源时,需要执行三个核心步骤:
- 上传 JDBC 驱动程序。
- 将 JDBC 驱动程序添加为模块。
- 使用模块添加数据源。
应用服务是无状态托管服务,因此,每次 JBoss 容器启动时,都必须将这些步骤放入启动脚本中并运行它。 使用 PostgreSQL、MySQL 和 SQL 数据库作为示例:
注释
应用服务上的 JBoss EAP 现在支持“自带许可证”(BYOL)计费,这使具有现有 Red Hat 订阅的客户可以直接将这些许可证应用到 Azure 应用服务上的 JBoss EAP 部署。 了解详细信息。
将 JBoss CLI 命令放入名为“jboss-cli-commands.cli”的文件中。 JBoss 命令必须添加模块,并将其注册为数据源。 以下示例演示了用于创建 JNDI 名称为
java:jboss/datasources/postgresDS的 PostgreSQL 数据源的 JBoss CLI 命令。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_HOST、DB_USERNAME和DB_PASSWORD),在应用服务中,必须将其添加为应用设置。 该脚本在没有--resolve-parameter-values标志的情况下添加它们,以便 JBoss 不会以纯文本形式保存其值。创建调用 JBoss CLI 命令的启动脚本 startup.sh。 以下示例展示了如何调用你的
jboss-cli-commands.cli。 稍后,将应用服务配置为在容器启动时运行此脚本。$JBOSS_HOME/bin/jboss-cli.sh --connect --file=/home/site/scripts/jboss_cli_commands.cli使用所选的部署选项,将 JDBC 驱动程序、jboss-cli-commands.cli 和 startup.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有关详细信息,请参阅将文件部署到应用程序服务。
要确认是否已将数据源添加到 JBoss 服务器,请使用 SSH 进入 webapp 并运行 $JBOSS_HOME/bin/jboss-cli.sh --connect。 连接到 JBoss 后,请运行 /subsystem=datasources:read-resource 来打印数据源列表。
如之前由 jboss-cli-commands.cli 定义所示,可以使用 JNDI 名称 访问 PostgreSQL 连接。java:jboss/datasources/postgresDS
相关内容
请访问面向 Java 开发人员的 Azure 中心查找 Azure 快速入门、教程和 Java 参考文档。