טיפ לעצמי: Firebird Events, Java, JayBird

אני עושה ניסויים עם JRuby. הבעיה שלי היא שאין לי ברובי תמיכה באירועים של Firebird ואין לי זמן ללמוד להוסיף את התמיכה הזו לרובי, ולכן אני מנסה ללמוד לעבוד עם האירועים של JayBird לג'אווה. השימוש שלי ב JRuby אם מישהו סתם רצה לדעת הוא דווקא בגלל הצורך שלי להשתמש בThreads, ולצערי ברובי 1.8 הם עדיין ירוקים, ולכן אני נאלץ לעבוד עם JRuby.

הסיבה שאני מעוניין לעבוד עם  Firebird היא בזכות האירועים שלו, אשר מאפשרים לי לדעת מתי פעולה שמעניינת אותי מתבצעת ולהמשיך משם וכך התור שאני מנסה ליצור (מחדש) יעיל יותר, היות ואני לא צריך כל פרק זמן לקרוא את מסד הנתונים בשביל לראות מה השתנה, אלא אני בודק את מסד הנתונים רק כאשר הוא מדווח לי שמשהו השתנה.

הקוד של מסד הנתונים לבדיקה:

/****************** GENERATORS ********************/

CREATE GENERATOR GEN_USERS_ID;

/******************** TABLES **********************/

CREATE TABLE USERS
(
ID Bigint NOT NULL,
NAME Char(24),
PRIMARY KEY (ID)
);

/******************** TRIGGERS ********************/

SET TERM ^ ;
CREATE TRIGGER NEW_USER FOR USERS ACTIVE
AFTER INSERT POSITION 0
AS
BEGIN
  POST_EVENT 'new_user'; /* raise an event for all listeners */
END^

CREATE TRIGGER USERS_BI FOR USERS ACTIVE
BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE tmp DECIMAL(18,0);
BEGIN
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GEN_USERS_ID, 1);
  ELSE
  BEGIN
    tmp = GEN_ID(GEN_USERS_ID, 0);
    if (tmp < new.ID) then
      tmp = GEN_ID(GEN_USERS_ID, new.ID-tmp);
  END
END^
SET TERM ; ^

GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE ON USERS TO SYSDBA WITH GRANT OPTION;

הקוד למעלה יצור לכם את מסד הנתונים שתרצו. יצרתי trigger מיוחד עבור הזנת ערכים חדשים לטבלת ה USERS, כך שרק כאשר אנחנו מסיימים להזין בהצלחה את הנתונים וכמובן שעשינו commit, אז האירוע ישלח לכל דורש עם כמות הפעמים שהtrigger רץ עד לפעולת ה commit.

הקוד להתמודד עם זה נכתב כאמור בג'אווה באמצעות JayBird והנה הוא:

import java.sql.SQLException;
import java.util.Date;

import org.firebirdsql.event.EventManager;
import org.firebirdsql.event.FBEventManager;
import org.firebirdsql.event.EventListener;
import org.firebirdsql.event.DatabaseEvent;
import org.firebirdsql.gds.impl.GDSType;

/**
 * @author ik
 *
 */
public class Test1 implements  EventListener {
 private EventManager eventManager;

 public Test1() {
 eventManager = new FBEventManager(GDSType.getType("PURE_JAVA"));
 eventManager.setDatabase("/tmp/jtest.fdb");
 eventManager.setUser("sysdba");
 eventManager.setPassword("masterkey");
 }

 public void run(){
   try {
     eventManager.connect();
     eventManager.addEventListener("new_user", this);
     while (true) {
      Thread.sleep(1);
     }
   } catch (SQLException e){
      System.out.println(e);
   } catch (InterruptedException e) {
      System.out.println(e);
   }
 }

 public void eventOccurred(DatabaseEvent event){
   System.out.println(new Date().toString() + ' '
     + event.getEventName() + " occurred "
     + event.getEventCount() + " time(s)\n");
 }

 public static void main(String[] args) {
 Test1 listener = new Test1();
   listener.run();
 }

}

הקוד מוגש כאן למטרות לימוד, ואתם יכולים להתנסות עליו כמה שאתם רוצים. אין צורך בזכויות יוצרים או משהו כזה כל עוד הוא ללימוד. תהנו !

7 מחשבות על “טיפ לעצמי: Firebird Events, Java, JayBird

  1. meir

    נזכיר כי ל-PostgreSQL יש תכונה דומה, בשם Notify‏:
    http://www.postgresql.org/docs/8.1/static/sql-notify.html

    כאשר בגרסה 9 הבאה עלינו במהרה בימינו יש אפשרות להוסיף payload להודעה:
    http://developer.postgresql.org/pgdocs/postgres/sql-notify.html

    הבעיה בכל הנ"ל היא שזה נועל אותך לבסיס נתונים מסויים בתחביר. נו, שום דבר לא מושלם בחיים.

  2. ik_5 מאת

    סה"כ Firebird ו PostgreSQL מאוד מאוד דומות אחת לשנייה מבחינת יכולות.
    הבעיה של Pg הוא שאם אני נגיד מעביר את האינדקס וחיבור אחר בנתיים טיפל בברשומה, אז אני אולי בבעיה, והפוך בלזרוס. אם מישהו טיפל ברשומה בנתיים, אז אני לא אמצא אותה בכלל.

  3. elcuco

    אתה משתמש ב-Ruby שהיא כבר שפה שיש לה מעט משתמשים.
    אתה משתמש ב-JRuby (כדי לקבל thread support כמו שאמרת לי), וכבר הקטנת בהרבה את מעגל המשתמשים שלך בטכנולוגיות.
    אתה משתמש ב-Firebird שגם פה יש לו מעט מאוד משתמשים.

    בחיאת …. אם זה לא נקרא vendor lock in אני לא יודע מה זה. מישהו שמשלם לך יהיה תקוע איתך להמשך הפרוייקט, אין יותר מ-10 אנשים בארץ שיכלו להתמודד עם קוד כזה.

    זאת הסיבה שאני הרבה פעמים מעדיף להשתמש בטכנולוגיה דפוקה אבל יותר מפורסמת – יש מי שיכול להמשיך את העבודה.

  4. ik_5 מאת

    כמה זה מעט משתמשים בדיוק לטעמך ?
    אתה מוזמן לעבוד קשה עם טכנולוגיות הכי גנריות בעולם שיש להם מליארדים של משתמשים בעולם. אני מעדיף לעשות לעצמי חיים קלים, ואיפה שלא צריך לעבוד קשה אני לא עובד קשה.

  5. פינגבק: טיפ לעצמי: Jruby + Firebird Events « לראות שונה

  6. Fernando Herculano

    Desculpe a intromissão, mas o senso de seguir a multidão ( cardume) não leva a nada, os grandes passos dados pela humanidade foram dados por pessoas que decidiram não ir com a multidão e fizeram seus próprios caminhos. Depois a multidão mudou de rumo e seguiu estes lideres.
    Portanto siga com o seu projeto, no futuro, quem sabe a multidão vai seguir estes 10 entusiastas.

    Translated by Google Translate:
    Sorry to intrude, but the sense of following the crowd (school) leads nowhere, the strides made by mankind was given by people who decided not to go with the crowd and made ​​their own paths. Then the crowd changed direction and followed these leaders.
    So go with your project in the future, who knows the crowd will follow these 10 enthusiasts.

  7. פינגבק: הרעיון של תכנון מערכות גמישות – חלק ראשון | לראות שונה

כתיבת תגובה

הזינו את פרטיכם בטופס, או לחצו על אחד מהאייקונים כדי להשתמש בחשבון קיים:

הלוגו של WordPress.com

אתה מגיב באמצעות חשבון WordPress.com שלך. לצאת מהמערכת / לשנות )

תמונת Twitter

אתה מגיב באמצעות חשבון Twitter שלך. לצאת מהמערכת / לשנות )

תמונת Facebook

אתה מגיב באמצעות חשבון Facebook שלך. לצאת מהמערכת / לשנות )

תמונת גוגל פלוס

אתה מגיב באמצעות חשבון Google+ שלך. לצאת מהמערכת / לשנות )

מתחבר ל-%s