OrientDB - Haczyki
OrientDB Hooksto nic innego jak wyzwalacze w terminologii bazy danych, które włączają zdarzenia wewnętrzne przed i po każdej operacji CRUD w aplikacjach użytkownika. Za pomocą punktów zaczepienia można pisać niestandardowe reguły walidacji, wymuszać bezpieczeństwo lub organizować zdarzenia zewnętrzne, takie jak replikacja względem relacyjnego systemu DBMS.
OrientDB obsługuje dwa rodzaje haków -
Dynamic Hook - Wyzwalacze, które można budować na poziomie klasy i / lub na poziomie dokumentu.
Java (Native) Hook - Wyzwalacze, które można zbudować za pomocą klas Java.
Dynamic Hooks
Dynamiczne podpięcia są bardziej elastyczne niż podpięcia Java, ponieważ można je zmieniać w czasie wykonywania i w razie potrzeby można je uruchamiać dla każdego dokumentu, ale są wolniejsze niż podpięcia Java.
Aby wykonać przechwyty na dokumentach, najpierw pozwól swoim klasom na rozszerzenie OTriggeredklasa bazowa. Później zdefiniuj właściwość niestandardową dla interesującego zdarzenia. Poniżej znajdują się dostępne wydarzenia.
onBeforeCreate - Zadzwoniłem before tworzenie nowego dokumentu.
onAfterCreate - Zadzwoniłem after tworzenie nowego dokumentu.
onBeforeRead - Zadzwoniłem before czytanie dokumentu.
onAfterRead - Zadzwoniłem after czytanie dokumentu.
onBeforeUpdate - Zadzwoniłem before aktualizacja dokumentu.
onAfterUpdate - Zadzwoniłem after aktualizacja dokumentu.
onBeforeDelete - Zadzwoniłem before usunięcie dokumentu.
onAfterDelete - Zadzwoniłem after usunięcie dokumentu.
Dynamiczne hooki mogą dzwonić -
Funkcje napisane w SQL, Javascript lub dowolnym języku obsługiwanym przez OrientDB i JVM.
Metody statyczne Java.
Haki na poziomie klasy
Haki na poziomie klasy są zdefiniowane dla wszystkich dokumentów, które odnoszą się do klasy. Poniżej znajduje się przykład konfiguracji haka, który działa na poziomie klasy w stosunku do dokumentów faktur.
CREATE CLASS Invoice EXTENDS OTriggered
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated
Stwórzmy funkcję invoiceCreated w Javascript, który wyświetla w konsoli serwera numer utworzonej faktury.
CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));"
LANGUAGE Javascript
Teraz wypróbuj hak, tworząc nowy Invoice dokument.
INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}
Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.
Invoice created: 100
Zaczep poziomu dokumentu
Możesz zdefiniować akcję specjalną tylko dla jednego lub kilku dokumentów. Aby to zrobić, pozwól swojej klasie na rozszerzenieOTriggered klasa.
Na przykład uruchommy wyzwalacz, jako funkcję JavaScript, w odniesieniu do istniejącej klasy Profile, dla wszystkich dokumentów z właściwością konto = „Premium”. Uruchomiony zostanie wyzwalacz, aby zapobiec usunięciu dokumentów.
ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'
Stwórzmy preventDeletion() Funkcja JavaScript.
CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot
delete Premium profile ' + doc)" LANGUAGE Javascript
Następnie przetestuj haczyk, próbując usunąć konto „Premium”.
DELETE FROM #12:1
java.lang.RuntimeException: Cannot delete Premium profile
profile#12:1{onBeforeDelete:preventDeletion,account:Premium,name:Jill} v-1
(<Unknown source>#2) in <Unknown source> at line number 2
Haczyki JAVA
Jednym z typowych przypadków użycia hooków OrientDB (wyzwalaczy) jest zarządzanie utworzonymi i zaktualizowanymi datami dla dowolnej lub wszystkich klas. Na przykład możesz ustawić plikCreatedDate za każdym razem, gdy tworzony jest rekord i ustawiany jest UpdatedDate za każdym razem, gdy rekord jest aktualizowany i rób to w taki sposób, aby logikę zaimplementować raz w warstwie bazy danych i nigdy więcej nie martwić się o to w warstwie aplikacji.
Przed utworzeniem będziesz musiał pobrać orientdb-core.jarplik, odwiedzając poniższe łącze pobierz rdzeń OrientDB . A później skopiuj ten plik jar do folderu, w którym chcesz przechowywać plik źródłowy Java.
Utwórz plik hooka
Utwórz plik Java o nazwie HookTest.java, który przetestuje mechanizm hooka przy użyciu języka Java.
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.orientechnologies.orient.core.hook.ODocumentHookAbstract;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHookAbstract;
import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;
public class HookTest extends ODocumentHookAbstract implements ORecordHook {
public HookTest() {
}
@Override
public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
return DISTRIBUTED_EXECUTION_MODE.BOTH;
}
public RESULT onRecordBeforeCreate( ODocument iDocument ) {
System.out.println("Ran create hook");
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
public RESULT onRecordBeforeUpdate( ODocument iDocument ) {
System.out.println("Ran update hook");
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
}
Powyższy przykładowy kod drukuje odpowiedni komentarz za każdym razem, gdy tworzysz lub aktualizujesz rekord tej klasy.
Dodajmy jeszcze jeden plik hook setCreatedUpdatedDates.java w następujący sposób -
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.locks.ReentrantLock;
import com.orientechnologies.orient.core.hook.ODocumentHookAbstract;
import com.orientechnologies.orient.core.hook.ORecordHook;
import com.orientechnologies.orient.core.hook.ORecordHookAbstract;
import com.orientechnologies.orient.core.db.ODatabaseLifecycleListener;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.record.ORecord;
import com.orientechnologies.orient.core.record.impl.ODocument;
public class setCreatedUpdatedDates extends ODocumentHookAbstract implements ORecordHook {
public setCreatedUpdatedDates() {
}
@Override
public DISTRIBUTED_EXECUTION_MODE getDistributedExecutionMode() {
return DISTRIBUTED_EXECUTION_MODE.BOTH;
}
public RESULT onRecordBeforeCreate( ODocument iDocument ) {
if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) {
iDocument.field("CreatedDate", System.currentTimeMillis() / 1000l);
iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l);
return ORecordHook.RESULT.RECORD_CHANGED;
} else {
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
}
public RESULT onRecordBeforeUpdate( ODocument iDocument ) {
if ((iDocument.getClassName().charAt(0) == 't') || (iDocument.getClassName().charAt(0)=='r')) {
iDocument.field("UpdatedDate", System.currentTimeMillis() / 1000l);
return ORecordHook.RESULT.RECORD_CHANGED;
} else {
return ORecordHook.RESULT.RECORD_NOT_CHANGED;
}
}
}
Powyższy kod wyszukuje każdą klasę zaczynającą się od liter „r'lub't'i ustawia CreatedDate i UpdatedDate, gdy rekord zostanie utworzony, i ustawia tylko UpdatedDate za każdym razem, gdy rekord zostanie zaktualizowany.
Kompiluj hooki Java
Skompiluj kod Java za pomocą następującego polecenia. Note: Zachowaj pobrany plik jar i te pliki Java w tym samym folderze.
$ jar cf hooks-1.0-SNAPSHOT.jar *.java
Przenieś skompilowany kod do miejsca, w którym może go znaleźć serwer OrientDB
Musisz skopiować gotowy plik .jar do katalogu, w którym serwer OrientDB będzie ich szukał. Oznacza to „./lib'folder w katalogu głównym serwera OrientDB będzie wyglądał następująco -
$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"
Włącz Test Hook w pliku konfiguracyjnym serwera OrientDB
Edytować $ORIENTDB_HOME/config/orientdb-server-config.xml i dodaj następującą sekcję pod koniec pliku.
<hooks>
<hook class = "HookTest" position = "REGULAR"/>
</hooks>
...
</orient-server>
Zrestartuj serwer OrientDB
Po ponownym uruchomieniu OrientDB Server, hak zdefiniowany w orientdb-server-config.xmljest teraz aktywny. Uruchom konsolę OrientDB, podłącz ją do bazy danych i uruchom następujące polecenie -
INSERT INTO V SET ID = 1;
Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.
Ran create hook
Teraz uruchom następujące polecenie -
UPDATE V SET ID = 2 WHERE ID = 1;
Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.
Ran update hook
Włącz Real Hook w pliku konfiguracyjnym serwera OrientDB
Edytować $ORIENTDB_HOME/config/orientdb-server-config.xml i zmień sekcję haczyków w następujący sposób -
<hooks>
<hook class="setCreatedUpdatedDates" position="REGULAR"/>
</hooks>
...
</orient-server>
Zrestartuj serwer OrientDB
Utwórz nową klasę zaczynającą się na literę „r'lub't'-
CREATE CLASS tTest EXTENDS V;
Teraz wstaw rekord -
INSERT INTO tTest SET ID = 1
SELECT FROM tTest
Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |1 |1427597275 |1427597275
----+-----+------+----+-----------+-----------
Mimo że nie określono wartości do ustawienia CreatedDate i UpdatedDate, OrientDB ustawił te pola automatycznie.
Następnie musisz zaktualizować rekord za pomocą następującego polecenia -
UPDATE tTest SET ID = 2 WHERE ID = 1;
SELECT FROM tTest;
Jeśli to polecenie zostanie wykonane pomyślnie, otrzymasz następujące dane wyjściowe.
----+-----+------+----+-----------+-----------
# |@RID |@CLASS|ID |CreatedDate|UpdatedDate
----+-----+------+----+-----------+-----------
0 |#19:0|tTest |2 |1427597275 |1427597306
----+-----+------+----+-----------+-----------
Możesz zobaczyć, że OrientDB zmienił UpdatedDate ale pozwolił CreatedDate pozostają bez zmian.
OrientDB Java Hooks może być niezwykle cennym narzędziem pomagającym zautomatyzować pracę, którą w innym przypadku musiałbyś wykonywać w kodzie aplikacji. Ponieważ wielu administratorów baz danych nie zawsze jest ekspertami w dziedzinie języka Java, mamy nadzieję, że informacje zawarte w tym samouczku umożliwią Ci dobry start i sprawią, że poczujesz się komfortowo z technologią, umożliwiając pomyślne tworzenie wyzwalaczy baz danych w razie potrzeby.