JDBC DataSourcePool을 사용한 SQL 연결

마지막 업데이트: 2024-01-25
  • 주제:
  • Security
    이 항목에 대한 자세한 내용 보기
  • 작성 대상:
  • Intermediate
    Developer

SQL 데이터베이스(및 HTTP/HTTPS가 아닌 서비스)에 대한 연결은 AEM에서 프록시되어야 하며 연결을 관리하기 위해 AEM DataSourcePool OSGi 서비스를 사용하여 수행한 연결도 포함됩니다.

고급 네트워킹 지원

다음 코드 예는 다음 고급 네트워킹 옵션에서 지원됩니다.

다음을 확인합니다. 적당하 이 자습서를 수행하기 전에 고급 네트워킹 구성이 설정되었습니다.

고급 네트워킹 없음 유연한 포트 이그레스 전용 이그레스 IP 주소 가상 사설망

OSGi 구성

OSGi 구성의 연결 문자열은 다음을 사용합니다.

  • AEM_PROXY_HOST 를 통한 값 OSGi 구성 환경 변수 $[env:AEM_PROXY_HOST;default=proxy.tunnel] 연결의 호스트로
  • 30001 은(는) portOrig cloud Manager 포트 전달 매핑 값 30001mysql.example.com:3306

암호는 코드에 저장할 수 없으므로 SQL 연결의 사용자 이름과 암호는 AIO CLI 또는 Cloud Manager API를 사용하여 설정된 OSGi 구성 변수를 통해 제공하는 것이 가장 좋습니다.

  • 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]"
}

다음 aio CLI 명령을 사용하여 환경별로 OSGi 비밀을 설정할 수 있습니다.

$ aio cloudmanager:set-environment-variables --programId=<PROGRAM_ID> <ENVIRONMENT_ID> --secret MYSQL_USERNAME "mysql-user" --secret MYSQL_PASSWORD "password123"

코드 예

이 Java™ 코드 예는 AEM DataSourcePool OSGi 서비스를 통해 외부 MySQL 데이터베이스에 연결하는 OSGi 서비스입니다.
DataSourcePool OSGi 공장 구성은 포트(30001)를 통해 매핑됩니다. portForwards 의 규칙 enableEnvironmentAdvancedNetworkConfiguration 외부 호스트 및 포트에 대한 작업 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 드라이버 종속성

AEM as a Cloud Service에서는 연결을 지원하기 위해 Java™ 데이터베이스 드라이버를 제공해야 하는 경우가 많습니다. 드라이버를 제공하는 것은 일반적으로 다음을 통해 이러한 드라이버가 포함된 OSGi 번들 아티팩트를 AEM 프로젝트에 포함시킴으로써 가장 잘 수행됩니다. all 패키지.

Reactor pom.xml

반응기에 데이터베이스 드라이버 종속성 포함 pom.xml 그런 다음 all 하위 프로젝트.

  • 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>
...

모든 pom.xml

데이터베이스 드라이버 종속성 아티팩트를 all AEM 패키지가 배포되고 as a Cloud Service으로 제공됩니다. 다음 아티팩트 필수 데이터베이스 드라이버 Java™ 클래스를 내보내는 OSGi 번들입니다.

  • 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>
...

이 페이지에서는