Если у меня есть Liferay 7.2 Community Edition и я хочу использовать Oracle 12c в качестве внешней базы данных для своих бизнес-данных, то какой самый простой и лучший способ подключения с помощью JNDI? Могу ли я создать DataSource в Tomcat и использовать поиск JNDI для подключения к Liferay Service Builder?
Вот простой способ, который я определил и использую:
Шаг (1): Определите/сопоставьте объекты в service.xml на основе существующих внешних баз данных. Если таблиц нет, создайте все таблицы и поля вручную, потому что Liferay Service Builder не будет генерировать код SQL для автоматического создания таблиц во внешней базе данных. Если вы хотите использовать пространство имен, сопоставьте вручную ниже сущностей и определите то же самое в базе данных.
Сервис.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-файла:
База данных портала Liferay All In One Support JAR
из репозитория Maven
Загрузите 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): Создайте класс DataSourceProviderImpl в *-service:
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
META-INF/services/com.liferay.portal.kernel.dao.jdbc.DataSourceProvider
Поместите следующую строку под этим файлом:
com.demo4.external.data.source.spi.DataSourceProviderImpl
Все сделано. Просто создайте сервис, обновите Gradle и запустите сервер. Это будет работать отлично.
Счастливого обучения!