Заставить Liferay использовать последовательности Oracle для генерации первичного ключа своих сущностей

Мы разрабатываем несколько портлетов, которые будут развернуты на Liferay 6.2.x с использованием базы данных Oracle 11g.

Мы реализовали несколько сервисов, которые вызывают сервис создания пользователя Liferay.

Насколько мне известно, в нашем Liferay не используются последовательности Oracle для генерации первичного ключа (и используется стратегия select max(id)+1 from table), которая очень медленна на очень больших пользовательских базах (у нас более 10 миллионов пользователей, а службы создают миллионы пользователей в партия).

Есть ли способ заставить liferay использовать последовательности оракула внутри для генерации первичного ключа внутренних объектов?


person Amir Pashazadeh    schedule 20.08.2014    source источник


Ответы (2)


Во-первых: вы измерили (и можете подтвердить), что это медленно? То, как вы задаете свой вопрос, звучит так, будто вы просто предполагаете, что это ваше узкое место.

Далее: Генерация счетчика Liferay не должна включать новый выбор для каждого созданного объекта (чтобы сгенерировать новый идентификатор. Если вы посмотрите на portal.properties, которые вы можете переопределить в portal-ext.properties, вы найдете этот раздел:

##
## Counter
##

#
# The counter operates with its own data source to prevent deadlocks. By
# default, the data source created for the counter uses the same settings as
# those used to create the data source used for the rest of the portal. That
# happens because the counter service will look up the properties prefixed
# with "jdbc.default." to create its data source. See the JDBC properties
# prefixed with "jdbc.default." for more information.
#
# Setting a different value for the counter JDBC prefix allows you to better
# fine tune the counter data source with its own set of configuration
# settings for high availability installations. Note that these settings,
# though separate, are a copy of the default settings with the newly
# overridden values.
#
counter.jdbc.prefix=jdbc.default.

#
# Set the number of increments between database updates to the Counter
# table. Set this value to a higher number for better performance.
#
counter.increment=100

#
# You can further fine tune the counter increment for specific counter
# names. This entry will ensure that the counter name
# "com.liferay.portal.model.Layout" or anything that starts with
# "com.liferay.portal.model.Layout#" will only increment by 1.
#
counter.increment.com.liferay.portal.model.Layout=1

Когда вы посмотрите на создание пользователя, вы обнаружите, что создание идентификатора выполняется CounterLocalService. Вы можете либо посмотреть на эту реализацию, но я рекомендую не менять такую ​​центральную службу. Однако ваш пробег может отличаться.

ИМХО, вы должны профилировать свое создание пользователя, проверить, что является вашим фактическим узким местом, и исправить его. Это может быть количество транзакций, это может быть что-то еще, что происходит во время этой операции (например, выбор ролей, групп и т. д.).

Также обратите внимание, что Liferay может работать с импортом пользователей по запросу, например. это один из режимов работы интерфейса LDAP: вы можете просто подключиться к LDAP без фактического импорта пользователей. Пользователи будут импортированы в тот момент, когда они войдут в систему. Если у вас есть миллионы пользователей, они, вероятно, не входят в систему одновременно, поэтому вы автоматически распределите нагрузку. Если вы реализуете что-то вроде LDAP или просто загружаете своих пользователей на сервер LDAP, это ваше решение.

person Olaf Kock    schedule 20.08.2014

У меня аналогичное требование:

У меня есть объект Liferay (таблица журнала), для которого Liferay автоматически генерирует первичный ключ.
Однако теперь внешнему приложению необходимо добавить записи в эту же таблицу базы данных.

Глядя на это требование, я вижу только два варианта:

  1. Если я могу изменить таблицу, чтобы использовать сгенерированный MySQL первичный ключ, то Liferay или внешнее приложение могут добавлять записи без каких-либо проблем.
  2. Если № 1 невозможен, то единственным вариантом является предоставление этого объекта с помощью веб-сервисов Liferay для внешнего приложения для добавления записей в эту таблицу БД.
person msa    schedule 14.10.2015