OrientDB - Kancalar

OrientDB HooksKullanıcı uygulamalarındaki her CRUD işleminden önce ve sonra dahili olayları etkinleştiren veritabanı terminolojisindeki tetikleyicilerden başka bir şey değildir. Özel doğrulama kuralları yazmak, güvenliği zorlamak veya ilişkisel bir DBMS'ye karşı çoğaltma gibi harici olayları düzenlemek için kancaları kullanabilirsiniz.

OrientDB iki tür kancayı destekler -

Dynamic Hook - Sınıf düzeyinde ve / veya Belge düzeyinde oluşturulabilen tetikleyiciler.

Java (Native) Hook - Java sınıfları kullanılarak oluşturulabilen tetikleyiciler.

Dinamik Kancalar

Dinamik kancalar Java kancalarından daha esnektir, çünkü çalışma zamanında değiştirilebilirler ve gerekirse belge başına çalışabilirler, ancak Java kancalarından daha yavaştırlar.

Belgelerinize kancalar uygulamak için önce sınıflarınızın genişlemesine izin verin OTriggeredtemel sınıf. Daha sonra, ilgili olay için özel bir özellik tanımlayın. Mevcut olaylar aşağıdadır.

  • onBeforeCreate - Aradı before yeni bir belge oluşturmak.

  • onAfterCreate - Aradı after yeni bir belge oluşturmak.

  • onBeforeRead - Aradı before bir belge okumak.

  • onAfterRead - Aradı after bir belge okumak.

  • onBeforeUpdate - Aradı before bir belgenin güncellenmesi.

  • onAfterUpdate - Aradı after bir belgenin güncellenmesi.

  • onBeforeDelete - Aradı before bir belgeyi silme.

  • onAfterDelete - Aradı after bir belgeyi silme.

Dinamik Kancalar arayabilir -

  • SQL, Javascript veya OrientDB ve JVM tarafından desteklenen herhangi bir dilde yazılmış işlevler.

  • Java statik yöntemleri.

Sınıf Seviyesi Kancaları

Sınıf düzeyinde kancalar, bir sınıfla ilgili tüm belgeler için tanımlanır. Aşağıda, Fatura belgelerine karşı sınıf düzeyinde hareket eden bir kanca oluşturmaya bir örnek verilmiştir.

CREATE CLASS Invoice EXTENDS OTriggered 
ALTER CLASS Invoice CUSTOM onAfterCreate = invoiceCreated

Fonksiyonu oluşturalım invoiceCreated Sunucu konsolunda oluşturulan fatura numarasını yazdıran Javascript'te.

CREATE FUNCTION invoiceCreated "print('\\nInvoice created: ' + doc.field ('number'));"
LANGUAGE Javascript

Şimdi yeni bir Invoice belge.

INSERT INTO Invoice CONTENT {number: 100, notes: 'This is a test}

Bu komut başarıyla yürütülürse, aşağıdaki çıktıyı alacaksınız.

Invoice created: 100

Belge Seviyesi Kanca

Yalnızca bir veya daha fazla belgeye karşı özel bir eylem tanımlayabilirsiniz. Bunu yapmak için sınıfınızın genişlemesine izin verinOTriggered sınıf.

Örneğin, mevcut bir Profil sınıfına karşı Javascript işlevi olarak, = 'Premium' mülk hesabına sahip tüm belgeler için bir tetikleyici yürütelim. Belgelerin silinmesini önlemek için tetikleyici çağrılacaktır.

ALTER CLASS Profile SUPERCLASS OTriggered UPDATE Profile 
SET onBeforeDelete = 'preventDeletion' WHERE account = 'Premium'

Oluşturalım preventDeletion() Javascript işlevi.

CREATE FUNCTION preventDeletion "throw new java.lang.RuntimeException('Cannot 
delete Premium profile ' + doc)" LANGUAGE Javascript

Ve sonra bir 'Premium' hesabı silmeye çalışarak kancayı test edin.

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

JAVA Kancaları

OrientDB Kancalarının (tetikleyiciler) yaygın kullanım durumlarından biri, herhangi bir veya tüm sınıflar için oluşturulan ve güncellenen tarihleri ​​yönetmektir. Örneğin, birCreatedDate alan bir kayıt oluşturulduğunda ve bir UpdatedDate alanı bir kayıt güncellendiğinde ve bunu, mantığı veritabanı katmanında bir kez uygulayacağınız ve uygulama katmanında bir daha bunun için endişelenmenize gerek kalmayacak şekilde yapın.

Oluşturmadan önce indirmeniz gerekecek orientdb-core.jarAşağıdaki bağlantıyı ziyaret ederek dosya OrientDB core indirin . Daha sonra bu jar dosyasını Java kaynak dosyasını depolamak istediğiniz klasöre kopyalayın.

Kanca Dosyası Oluştur

Adlı bir Java dosyası oluşturun HookTest.java, Java dilini kullanarak Hook mekanizmasını test edecek.

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;  
   }  
}

Yukarıdaki örnek kod, o sınıfın bir kaydını her oluşturduğunuzda veya güncellediğinizde uygun yorumu yazdırır.

Bir kanca dosyası daha ekleyelim setCreatedUpdatedDates.java aşağıdaki gibi -

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; 
      } 
   }  
}

Yukarıdaki kodun yaptığı şey, 'harfleriyle başlayan herhangi bir sınıfı aramaktır.r'veya't've kayıt oluşturulduğunda CreatedDate ve UpdatedDate'i ayarlar ve kayıt her güncellendiğinde yalnızca Güncelleme Tarihini ayarlar.

Java Hook'larını derleyin

Aşağıdaki komutu kullanarak Java kodunu derleyin. Note: İndirilen jar dosyasını ve bu Java dosyalarını aynı klasörde saklayın.

$ jar cf hooks-1.0-SNAPSHOT.jar *.java

Derlenmiş Kodu OrientDB Sunucusunun Bulabileceği Yerlere Taşıyın

Bitmiş .jar dosyasını, OrientDB sunucunuzun onları arayacağı dizine kopyalamanız gerekir. Bu, './libOrientDB Sunucusu kök dizininizin altındaki klasör şöyle görünecektir -

$ cp hooks-1.0-SNAPSHOT.jar "$ORIENTDB_HOME/lib"

OrientDB Sunucu Yapılandırma Dosyasında Test Kancasını Etkinleştirin

Düzenle $ORIENTDB_HOME/config/orientdb-server-config.xml ve aşağıdaki bölümü dosyanın sonuna yakın bir yere ekleyin.

<hooks> 
      <hook class = "HookTest" position = "REGULAR"/> 
   </hooks> 
   ... 
</orient-server>

OrientDB Sunucusunu Yeniden Başlatın

OrientDB Sunucusunu yeniden başlattığınızda, içinde tanımladığınız kanca orientdb-server-config.xmlşimdi aktif. Bir OrientDB konsolu başlatın, onu veritabanınıza bağlayın ve aşağıdaki komutu çalıştırın -

INSERT INTO V SET ID = 1;

Bu komut başarıyla yürütülürse, aşağıdaki çıktıyı alacaksınız.

Ran create hook

Şimdi aşağıdaki komutu çalıştırın -

UPDATE V SET ID = 2 WHERE ID = 1;

Bu komut başarıyla yürütülürse, aşağıdaki çıktıyı alacaksınız.

Ran update hook

OrientDB Sunucu Yapılandırma Dosyasında Gerçek Kancayı Etkinleştirin

Düzenle $ORIENTDB_HOME/config/orientdb-server-config.xml ve kancalar bölümünü aşağıdaki gibi değiştirin -

<hooks> 
      <hook class="setCreatedUpdatedDates" position="REGULAR"/> 
   </hooks> 
   ... 
</orient-server>

OrientDB Sunucusunu Yeniden Başlatın

'Harfiyle başlayan yeni bir sınıf oluşturunr'veya't'-

CREATE CLASS tTest EXTENDS V;

Şimdi bir kayıt ekleyin -

INSERT INTO tTest SET ID = 1 
SELECT FROM tTest

Bu komut başarıyla yürütülürse, aşağıdaki çıktıyı alacaksınız.

----+-----+------+----+-----------+----------- 
#   |@RID |@CLASS|ID  |CreatedDate|UpdatedDate 
----+-----+------+----+-----------+----------- 
0   |#19:0|tTest |1   |1427597275 |1427597275 
----+-----+------+----+-----------+-----------

Ayarlanacak değerleri belirtmemiş olsanız bile CreatedDate ve UpdatedDateOrientDB bu alanları sizin için otomatik olarak ayarladı.

Ardından, aşağıdaki komutu kullanarak kaydı güncellemeniz gerekir -

UPDATE tTest SET ID = 2 WHERE ID = 1; 
SELECT FROM tTest;

Bu komut başarıyla yürütülürse, aşağıdaki çıktıyı alacaksınız.

----+-----+------+----+-----------+----------- 
#   |@RID |@CLASS|ID  |CreatedDate|UpdatedDate 
----+-----+------+----+-----------+----------- 
0   |#19:0|tTest |2   |1427597275 |1427597306 
----+-----+------+----+-----------+-----------

OrientDB'nin UpdatedDate ama izin verdi CreatedDate değişmeden kalır.

OrientDB Java Kancaları, aksi takdirde uygulama kodunda yapmanız gereken işleri otomatikleştirmeye yardımcı olacak son derece değerli bir araç olabilir. Çoğu DBA her zaman Java uzmanı olmadığından, umarız bu eğitimde yer alan bilgiler size bir başlangıç ​​sağlar ve teknolojiyle ilgili rahat hissetmenizi sağlar ve ihtiyaç duyduğunuzda başarılı bir şekilde veritabanı tetikleyicileri oluşturmanıza yardımcı olur.