Я работаю в Java проекте веб-приложения (Spring, Hibernate, Oracle DB, Tomcat 8), openLDAP и PL / SQL, которые синхронизируют оба.
openLDAP имеет такую структуру:
An user entry: "uid=user00001, ou=People, cd=company,dc=com"
имеет список имен связанных атрибутов:
{
uid = "user0001",
cn = "User name",
sn = "User surname",
passw = "userPasswMd5"
}
// more 100 different attributes....
ТАБЛИЦА oracle db ATTRIBUTES содержит те же атрибуты openLDAP с идентификатором:
CREATE TABLE ATTRIBUTES
(
ID_ATTRIB NUMBER NOT NULL,
NAME_ATTRIB VARCHAR2(1000 BYTE) NOT NULL
);
-- same openldap attributes....
INSERT INTO ATTRIBUTES (ID_ATTRIB, DESC_ATTRIB) VALUES(1,'uid');
INSERT INTO ATTRIBUTES (ID_ATTRIB, DESC_ATTRIB) VALUES(2,'cn');
INSERT INTO ATTRIBUTES (ID_ATTRIB, DESC_ATTRIB) VALUES(3,'sn');
INSERT INTO ATTRIBUTES (ID_ATTRIB, DESC_ATTRIB) VALUES(4,'passw');
Для каждого атрибута openLDAP я определил одно и то же имя атрибута для констант в PL SQL и финальных переменных в Java, чтобы получить идентификаторы. Например:
В PL SQL я использую функции для получения идентификатора атрибута:
-- Get id of an attribute by name attribute
CREATE OR REPLACE FUNCTION getIdAttribByName (p_attribName in varchar)
is
id number;
begin
SELECT A.id_attrib into id from ATTRIBUTES A WHERE A.atribName = p_attribName;
return id;
end,
-- And define a constant to use in the plsql/java code:
ID_ATRIB_UID CONSTANT NUMBER := getIdAttribByName ('uid') ;
В Java Я использую методы для получения идентификатора атрибута:
public int getIdAttribByName( java.lang.String p_attribName){
Query query = createSQLQuery("SELECT A.id_attrib from ATTRIBUTES A
WHERE A.atrribName = :p_attribName");
query.setString("p_attribName", p_attribName);
List<int> idlist = query.idlist();
return (int) idlist.get(0);
}
//And define a final var with the same PLSQL name to use in the plsql/java code:
final int ID_ATRIB_UID = AttibutesClassDao.getIdAttribByName(uid);
Итак,
Правильно ли определять константы или конечные переменные, назначенные для запросов к БД, и получать идентификаторы в этом сценарии? Я также беспокоюсь о производительности.
Должен ли я вызывать функции pl sql из java вместо метода повтора / функций в обоих местах? Я тоже беспокоюсь о производительности, мне бы хотелось, чтобы приложение java / Tomcat имело наименьшую рабочую нагрузку, а база данных Oracle - самая высокая.
Это хорошая практика или это неправильно?
Спасибо.