SQL-anslutningar med JDBC DataSourcePool
- Gäller:
- Experience Manager as a Cloud Service
Skapat för:
- Mellanliggande
- Utvecklare
Anslutningar till SQL-databaser (och andra icke-HTTP/HTTPS-tjänster) måste proxiceras ut från AEM, inklusive de som gjorts med AEM DataSourcePool OSGi-tjänst för att hantera anslutningarna.
Avancerat nätverksstöd
Följande kodexempel stöds av följande avancerade nätverksalternativ.
Kontrollera att den lämpliga avancerade nätverkskonfigurationen har konfigurerats innan du följer den här självstudien.
Inga avancerade nätverk | Flexibel portutgång | Dedikerad IP-adress för utgångar | Virtuellt privat nätverk |
---|---|---|---|
✘ | ✔ | ✔ | ✔ |
OSGi-konfiguration
OSGi-konfigurationens anslutningssträng använder:
AEM_PROXY_HOST
-värde via konfigurationsmiljövariabeln OSGi$[env:AEM_PROXY_HOST;default=proxy.tunnel]
som anslutningsvärd30001
som ärportOrig
-värdet för framåtmappning för Cloud Manager-port30001
→mysql.example.com:3306
Eftersom hemligheter inte får lagras i kod bör SQL-anslutningens användarnamn och lösenord anges via OSGi-konfigurationsvariabler som anges med AIO CLI eller Cloud Manager API:er.
ui.config/src/jcr_root/apps/wknd-examples/osgiconfig/config/com.day.commons.datasource.jdbcpool.JdbcPoolService~wknd-examples-mysql.cfg.json
{
"datasource.name": "wknd-examples-mysql",
"jdbc.driver.class": "com.mysql.jdbc.Driver",
"jdbc.connection.uri": "jdbc:mysql://$[env:AEM_PROXY_HOST;default=proxy.tunnel]:30001/wknd-examples",
"jdbc.username": "$[env:MYSQL_USERNAME;default=mysql-user]",
"jdbc.password": "$[secret:MYSQL_PASSWORD]"
}
Följande aio CLI
-kommando kan användas för att ange OSGi-hemligheter per miljö:
$ aio cloudmanager:set-environment-variables --programId=<PROGRAM_ID> <ENVIRONMENT_ID> --secret MYSQL_USERNAME "mysql-user" --secret MYSQL_PASSWORD "password123"
Exempel på kod
Detta Java™-kodexempel är en OSGi-tjänst som skapar en anslutning till en extern MySQL-databas via AEM DataSourcePool OSGi-tjänst.
Fabrikskonfigurationen för DataSourcePool OSGi anger i sin tur en port (30001
) som mappas via regeln portForwards
i åtgärden enableEnvironmentAdvancedNetworkingConfigurationtill den externa värden och porten mysql.example.com:3306
.
...
"portForwards": [{
"name": "mysql.example.com",
"portDest": 3306,
"portOrig": 30001
}]
...
core/src/com/adobe/aem/wknd/examples/connections/impl/JdbcExternalServiceImpl.java
package com.adobe.aem.wknd.examples.core.connections.impl;
import com.adobe.aem.wknd.examples.core.connections.ExternalService;
import com.day.commons.datasource.poolservice.DataSourceNotFoundException;
import com.day.commons.datasource.poolservice.DataSourcePool;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import javax.sql.DataSource;
import java.sql.Connection;
import java.sql.SQLException;
@Component
public class JdbcExternalServiceImpl implements ExternalService {
private static final Logger log = LoggerFactory.getLogger(JdbcExternalServiceImpl.class);
@Reference
private DataSourcePool dataSourcePool;
// The datasource.name value of the OSGi configuration containing the connection this OSGi component will use.
private static final String DATA_SOURCE_NAME = "wknd-examples-mysql";
@Override
public boolean isAccessible() {
try {
// Get the JDBC data source based on the named OSGi configuration
DataSource dataSource = (DataSource) dataSourcePool.getDataSource(DATA_SOURCE_NAME);
// Establish a connection with the external JDBC service
// Per the OSGi configuration, this will use the injected $[env:AEM_PROXY_HOST] value as the host
// and the port (30001) mapped via Cloud Manager API call
try (Connection connection = dataSource.getConnection()) {
// Validate the connection
connection.isValid(1000);
// Close the connection, since this is just a simple connectivity check
connection.close();
// Return true if AEM could reach the external JDBC service
return true;
} catch (SQLException e) {
log.error("Unable to validate SQL connection for [ {} ]", DATA_SOURCE_NAME, e);
}
} catch (DataSourceNotFoundException e) {
log.error("Unable to establish an connection with the JDBC data source [ {} ]", DATA_SOURCE_NAME, e);
}
return false;
}
}
MySQL-drivrutinsberoenden
AEM as a Cloud Service kräver ofta att du tillhandahåller Java™-databasdrivrutiner som stöder anslutningarna. Det bästa sättet att tillhandahålla drivrutinerna är oftast att bädda in OSGi-paketartefakter som innehåller dessa drivrutiner i AEM-projektet via paketet all
.
Reaktorprom.xml
Inkludera databasdrivrutinernas beroenden i reaktorn pom.xml
och referera sedan till dem i all
-delprojekten.
pom.xml
...
<dependencies>
...
<!-- MySQL Driver dependencies -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>[8.0.27,)</version>
<scope>provided</scope>
</dependency>
...
</dependencies>
...
Alla pom.xml
Bädda in beroendeartefakter för databasdrivrutiner i paketet all
till de distribueras och är tillgängliga på AEM as a Cloud Service. De här artefakterna måste vara OSGi-paket som exporterar Java™-klassen för databasdrivrutinen.
all/pom.xml
...
<embededs>
...
<!-- Include the MySQL Driver OSGi bundles for deployment to the project -->
<embedded>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<target>/apps/wknd-examples-vendor-packages/application/install</target>
</embedded>
...
</embededs>
...
<dependencies>
...
<!-- Add MySQL OSGi bundle artifacts so the <embeddeds> can add them to the project -->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>provided</scope>
</dependency>
...
</dependencies>
...