IT - архив

[възникна грешка при обработката на тази директива]

Използване на Java технологии в Oracle 8i

[възникна грешка при обработката на тази директива] (няма)

Java съхранени процедури в Oracle 8i.

Въведение.

Oracle отдавна активно въвежда езика за програмиране Java в своите технологии. Революционна иновация в тази област беше пускането на нова версия на Oracle 8i Database Server и Oracle Application Server. Преди 8i Java, ако присъстваше в продуктите на Oracle, беше сякаш допълнителна функция към основния PL \ SQL език. Но като се започне с тази версия, той застана наравно и в много отношения дори изпревари PL \ SQL. Изисква се да се вземе предвид наличието на много по-широки възможности на Java в сравнение с PL \ SQL (многопоточност, динамично зареждане на клас, мрежови възможности и др.), Както и по-голям брой Java библиотеки и разработчици.

Езикът Java не е избран случайно. Първо, езикът Java е междуплатформен (има JDK за всички платформи, поддържани от Oracle). На второ място, Java, подобно на Oracle, има високо ниво на защита (Java 2 Security), което ви позволява безопасно да изпълнява Java код вътре в базата данни.

Поддръжката на Java код в базата данни на Oracle беше извършена чрез включване на JServer в базата данни.

Трябва да се отбележи, че естествено трябва да платите за богатството от нови функции - повишени изисквания за конфигурация на сървъра или намалена скорост.

JServer.

Както вече беше отбелязано, за да поддържа Java на сървърите на базата данни, той включва JServer - Java сървър, който отговаря за зареждането на java класове в базата данни, компилирането на java кода и осигуряването на изпълнението на приложението. Фигурата показва схемата JServer:

база данни

JServer включва виртуалната машина Java Aurora, която изпълнява Java код. JServer също така включва всички JRE класове, много от които са естествен код за подобряване на производителността. Също така, за да подобри производителността, Aurora използва JIT (точно навреме) прекомпилатор, който компилира java байт код в роден код и едва след това се изпълнява. Това увеличава производителността с 2-10 пъти, но силно натоварва системата. Също така е възможно да се свържат външни ускорители на Java.

Особеностите на Java програмирането за JServer включват невъзможност за свързване на персонализиран собствен код от съображения за сигурност, невъзможност за работа с графичен изход (можете да създавате графични обекти, но не можете да ги визуализирате). За да се свържете с база данни, в която се изпълнява Java код, въпреки че се използва JDBC, връзката JDBC вече не е сесия в базата данни, а обикновен вътрешен сесиен канал, в който се изпълнява кодът. Такава връзка се отваря почти моментално и работи много бързо, освен това изчезна необходимостта от проследяване на затварянето, както и фиксиране и връщане назад за всяка връзка - това може да се направи във всяка връзка за цялата сесия. Не можете да използвате OCI драйвера за връзки с друга база данни (тъй като не можете да използвате собствен код). Включена е обаче по-бърза поддръжка на тънки драйвери.

Проблемните моменти включват неясно спазване на приоритетите на нишките. Този проблем възникна поради голямото натоварване на JIT сървъра от прекомпилатора.

Основните характеристики на изпълнението на Java на JServer включват принципа на JVM Aurora. JServer има своя собствена JVM Aurora, но за всяка сесия, когато Java кодът е достъпен за първи път, се стартира своя собствена JVM Aurora с правата, които има потребителят, отворил връзката. Всяка JVM има своя собствена памет и заредени класове. По този начин класовете се зареждат в паметта за всяка сесия, но това не влияе на скоростта, тъй като всички класове са в базата данни.

Обикновено можете да предположите, че променливата CLASSPATH е зададена в корена на Java хранилището за някои схеми на база данни. Базата данни може да съдържа не само изходен код и класове на Java, но и други ресурси, като сериализирани обекти или файл със свойства.

Две Java сесии не могат да комуникират помежду си, освен чрез обекти на база данни (последователности, таблици и т.н.) Това е от съществено значение за работата на уеб сървърите. Също така трябва да се помни, че статичните променливи се инициализират наново във всяка сесия.

Въпреки че тази сложност на JVM изисква значително количество сървърна памет и други ресурси, тя значително увеличава сигурността на изпълняваните Java приложения в базата данни и също така опростява събирането на боклука (почистване на паметта от ненужни обекти).

базата данни

Когато сесията на Java завърши, съответната JVM се унищожава. Краят на Java сесия настъпва, когато сесията в базата данни приключи, по време на изчакване или при извикване:

Ако някой клас, използван от сесията, се е променил по време на сесията (изходният му код, съхраняван в базата данни, е променен или е създаден наново), тогава при следващия достъп до Java ще се генерира грешка и ще се появи нова сесия започнете.

Ограничаване на възможностите на Java приложения, сигурност.

Както беше отбелязано, Java има много повече функции от PL \ SQL. Следователно става необходимо тези възможности да се ограничат до някои потребители. На всяка схема на база данни може да бъдат зададени лични разрешения за извършване на определени действия в Java приложения. Схемата не изисква специални права за стартиране на Java.

Java използва принципа „това, което не е позволено, е забранено“, за да провери правата. За предоставяне на права за извършване на операция се използват два метода: издаване на роля на Java на схема или директно издаване на конкретно право на един от типовете разрешения.

  • Списък на основните роли на Java:
  • JAVA_ADMIN - не се проверяват права - всичко е позволено. Може да разпространява права на други потребители.
  • JAVAUSERPRIV - ниски права, включително четене на JVM свойства.
  • JAVASYSPRIV - големи права, включително промени в защитени пакети.
  • Ето списък на видовете възможни резолюции:
  • java.util.PropertyPermission
  • java.io.SerializablePermission
  • java.io.FilePermission
  • java.net.NetPermission
  • java.net.SocketPermission
  • java.lang.RuntimePermission
  • java.lang.reflect.ReflectPermission
  • java.security.SecurityPermission
  • oracle.aurora.rdbms.security.PolicyTablePermission
  • oracle.aurora.security.JServerPermission

По този начин можете да предоставите разрешения за четене/запис на определен файл или директория, да отворите сокет, да сериализирате обект, да промените свойствата на JVM, да прочетете свойствата на класа, да разпределите права на Java и т.н.

Разпределението и изборът на права на Java може да се извърши по два начина, чрез SQL и Java.

Има специален пакет dbms_java за разпространение на права на Java чрез SQL. Съдържа няколко десетки процедури. Има две основни:

Получателят е схемата, която получава разрешение. Permission_type - тип разрешение. Permission_name е името на разрешението. Permission_action - разрешени действия.

Пример за предоставяне на достъп за четене/запис на WWW схемата в директорията D: \ www, с изключение на файла password.txt.

Изисква се да се помни, че след сесията на разпространение и избор на права е необходимо да се извърши ангажимент, тъй като всички промени се случват в таблицата SYS.JAVA $ POLICY $ (там можете да видите предоставените права, но е по-добре да не направете промени директно).

За разпространение на права чрез Java има клас с подобни статични методи oracle.aurora.rdbms.security.PolicyTableManager.

Възможно е да създадете свои собствени типове разрешения и самите разрешения.

Съхранени процедури в Java.

Създаването на съхранена процедура в Java задължително се извършва по следния начин.

  • Разработването на код може да се осъществи във всяка удобна за вас среда. Зареждането на кода може да стане по няколко начина:
  • Чрез ръчно създаване на Java Source с SQL израз.
  • Чрез помощната програма loadjava (със или без предварителна компилация (зареден .class) (зареден .java)).

Публикуването създава проста (PL \ SQL) съхранена процедура, която препраща към статичен метод на заредения клас.