如何使用 JNDI 连接 Liferay 7.2 CE 和 Oracle 数据库

How to connect Liferay 7.2 CE with Oracle database using JNDI

如果我有 Liferay 7.2 Community Edition 并且想使用 Oracle 12c 作为我的业务数据的外部数据库那么会是什么使用 JNDI 连接的最简单和最好的方法?我可以在 Tomcat 中创建 DataSource 并使用 JNDI 查找与 Liferay Service Builder 连接吗?

这是我确定并使用的一种简单方法:

步骤(1):Define/Map实体根据现有的外部数据库转化为service.xml。如果表不存在,请手动创建所有表和字段,因为 Liferay 服务构建器不会生成 SQL 代码以在外部数据库中自动创建表。如果要使用命名空间,请在实体下方手动映射并在数据库中定义相同的内容。

Service.xml

<entity local-service="true" name="Employee" table="employee" data-source="extDataSource" remote-service="false" uuid="false">
        <column name="employeeId" db-name="employeeid" primary="true" type="long" />
        <column name="groupId" db-name="groupid" type="long" />
        <column name="userName" db-name="username" type="String" />
    </entity>
</service-builder>

步骤(2):把下面的内容放在LIFERAY-HOME\tomcat-9.0.17\conf\server.xml下

<Resource
    name="jdbc/myDataSource"
    auth="Container"
    type="javax.sql.DataSource"
    factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
    driverClassName="oracle.jdbc.driver.OracleDriver"
    url="jdbc:oracle:thin:@localhost:1521:orcl"
    username="USERNAME"
    password="PASSWORD"
    maxActive="20"
    maxIdle="5"
    maxWait="10000"
/>

步骤(3): 在LIFERAY-HOME\tomcat-9.0.17\conf\context.xml 下Context

<ResourceLink name="jdbc/myDataSource" global="jdbc/myDataSource" type="javax.sql.DataSource"/>

步骤 (4):要连接 Oracle 或任何专有数据库,需要以下 2 个 JAR:

  • Oracle Driver: 获取驱动放在liferay-ce-portal-7.2.1-ga2\tomcat-9.0.17\lib\ext
  • 外部数据库支持库:下载最新的

Liferay Portal Database All In One Support JAR

来自 Maven 存储库

https://mvnrepository.com/artifact/it.dontesta.labs.liferay.portal.db/liferay-portal-database-all-in-one-support/1.2.1

下载 JAR liferay-portal-database-all-in-one-support-1.2.1.jar 并放在 LIFERAY-HOME\tomcat-9.0.17\webapps\ROOT\WEB-INF\lib

步骤(5): 将以下内容定义到portal-ext.properties

jdbc.mydb.jndi.name=jdbc/myDataSource

步骤(6):在*-service:

下创建DataSourceProviderImplclass
package com.demo4.external.data.source.spi;

import javax.naming.InitialContext;
import javax.sql.DataSource;

import com.liferay.portal.kernel.dao.jdbc.DataSourceFactoryUtil;
import com.liferay.portal.kernel.dao.jdbc.DataSourceProvider;
import com.liferay.portal.kernel.util.PropsUtil;

public class DataSourceProviderImpl implements DataSourceProvider {

@Override
public DataSource getDataSource() {

DataSource dataSource = null;

try {
            
dataSource = DataSourceFactoryUtil.initDataSource(PropsUtil.getProperties("jdbc.mydb.", true));

            
//  **Note:** Sometimes above line dosn't work in some environments, then follow below approach. In this case above Step(5) is not required because it's directly making lookup into server's context.


//  InitialContext initialContext = new InitialContext();
//  dataSource = (DataSource) initialContext.lookup("java:comp/env/jdbc/myDataSource");


        } catch (Exception e) {
            e.printStackTrace();
        }

        return dataSource;
    }
}

步骤 (7):使用 JDK SPI(服务提供商接口)注册上述实现。为此,请在 *-service

下创建以下 folder/file
META-INF/services/com.liferay.portal.kernel.dao.jdbc.DataSourceProvider

在该文件下放置以下行:

com.demo4.external.data.source.spi.DataSourceProviderImpl

全部完成。只需构建服务,Gradle 刷新并启动服务器。这将完美地工作。

祝您学习愉快!