Java, PL/SQL Karşılaştırması ve Oracle’da Java Kodu Çalıştırmak

Herkese Selam,

Bu yazıda sizelerle,  Java ve PL/SQL arasındaki performans farklarını işlem türlerine göre karşılaştırıp, sebepler üzerinde  kısa bilgilendirmeler yapacağım. Bu karşılaştırmaları yapacağım örnek java kodlarını DB içinde kullanarak, Oracle üstünde Java kodu nasıl çalıştırılabiliride göstermeyi amaçlamaktayım.

Developerlar kullanıcı interaksiyonu barındıran projeler geliştirirken genellikle performansı çok düşünmeden ellerinin alıştığı şekilde projeleri çıkarmaya çalışırlar. Aslına bakarsak yazılım dünyasında bir projenin başarısı genellikle zamanla ölçüldüğü için bu şekilde çalışmakta pekte haksız sayılmazlar. Bu yazı kapsamında makaleyi okuyan uygulama geliştiriciler için küçükte olsa bu konuda farkındalık yaratmayı hedeflemekteyim.

Java programlama dili ile veritabanı interaksiyonu içeren projeler geliştirirken, yapacağımız işlemleri veri tabanı seviyesindemi çözüceğimiz yada Java seviyesindemi çözüceğimiz, yapılacak işlemin tipine göre değişkenlik göstermekte.  İşlemin CPU’yu yoğun kullanarak (CPU Intensive) sonuca gitmesi veya Database interaksiyonunu(Database Intensive) yoğun kullanarak sonuca gitmesi temel farklılığı meydana getirmekte.

Oracle 8i’den bu yana Java Virtual Machine’i kendi içinde barındırdığından dolayı Database içinde de Java kodları yazıp, derleyip, Database içinde de yine kulllanabilmekteyiz. Oracle’ın bu özelliğinden dolayı geliştirdiğimiz projeler Database projeleri olsa bile Database içinde Java programlama dilinin performans kazanımlarından ve kolaylıklarından faydalanabiliriz. Aşağıda performans incelemesi yapmak için yazacağım örnekleri doğrudan DB içinde yapacağımdan dolayı, Database içinde Java kodunun nasıl derlenip kullanıldığınıda bu vesile ile göstermiş olacağım.

HESAPLAMAYA DAYALI İŞLEMLER (CPU INTENSIVE)

Bu tarz işlemler adından’da anlaşılacağı gibi matematiksel işlemlerin yoğun olarak yapıldığı ve CPU’nun daha baskın kullanıldığı işlem tipidir. Bu işlem tipinde Java ve PL/SQL dilinin performanslarını bir örnek yazarak inceleyelim.

Örnek: Bu örnekte çok basit olarak, 1 den  parametre olarak verilen değere kadar kaç sayının 3’e tam bölündüğünü bulacağız. İlk olarak PL/SQL, daha sonra DB’de java kodu yazarak derleyip sonuçlarını inceleyelim.

PL/SQL Kullanarak 

CREATE FUNCTION plsqlcompme (topvalue NUMBER)
RETURN NUMBER
AS
numberofvar NUMBER := 0;
BEGIN
FOR i IN 1 .. topvalue
LOOP
IF MOD (i, 3) = 0
THEN
numberofvar := numberofvar + 1;
END IF;
END LOOP;

RETURN numberofvar;
END;

/ -- Şimdi ise fonksyonu deniyecek kod bloğumuzu yazalım.

SET timing on

DECLARE
RESULT NUMBER := 0;
BEGIN
RESULT := plsqlcompme (99999999);
DBMS_OUTPUT.put_line (RESULT);
END;

PL/SQL procedure successfully completed.
Elapsed: 00:02:12.77

Şimdi ise Database’de Java metodu yazıp onu kullanarak aynı işlemi tekrarlayalım.

JAVA Kullarak:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "compute"
AS

public class compute {

static public int compmet(int topvalue) {

int numberofvar = 0;

for (int i = 1; i <= topvalue; i++) {

if (i % 3 == 0) {
numberofvar = numberofvar + 1;
}

}

return numberofvar;
}
}

/

CREATE OR REPLACE FUNCTION javacompmet (topvalue NUMBER) RETURN NUMBER AS LANGUAGE JAVA NAME 'compute.compmet(int) return int';

/-- Şimdi ise yazdığımız metodu deneyecek kod bloğunu yazalım. set timing on DECLARE RESULT NUMBER := 0; BEGIN RESULT := javacompmet (99999999); DBMS_OUTPUT.put_line (RESULT); END; PL/SQL procedure successfully completed. Elapsed: 00:00:33.62

Evet sonuctanda göreceğimiz gibi en basit sayılacak örnekte bile Java’nın hesaplamanın ön planda olduğu işlemlerde PL/SQL’den  yaklaşık 5 kat daha hızlı olduğunu gözlemleyebiliriz. Bu durum bize gösteriyorki hesaplamaının ön planda olduğu işlemleri,  Java dilini kullanarak çözmek performans kazancı sağlamakta.

Bu tür işlemler üzerinden verilebilecek bir diğer detay ise, kütüphane bağımlı matematiksel işlemlere ihtiyaç duyan uygulamalarda PL/SQL programlama dilinin Java’ya göre performansının dahada düşmesidir. Bunuda aşağıdaki örnekle sınıyalım.

PL/SQL Kullanarak: 

CREATE OR REPLACE FUNCTION plsqlsquareroot (topvalue NUMBER)
RETURN FLOAT
AS
total FLOAT := 0;
BEGIN
FOR i IN 1 .. topvalue
LOOP
total := total + POWER (i, 0.5);
END LOOP;

RETURN total;
END;

/
SET timing on

DECLARE
RESULT FLOAT := 0;
BEGIN
RESULT := plsqlsquareroot (99999);
DBMS_OUTPUT.put_line (RESULT);
END;

PL/SQL procedure successfully completed.
Elapsed: 00:15:14.49

JAVA Kullarak:

CREATE OR REPLACE AND RESOLVE JAVA SOURCE NAMED "squareroot"
AS

import java.math.*;

public class squareroot {

static public float compsquareroot(int topvalue) {

float total = 0;

for (int i = 1; i <= topvalue; i++) {

total = total +(float) Math.sqrt(i);

}

return total;
}
}

/

CREATE OR REPLACE FUNCTION javasquareroot (topvalue NUMBER)
RETURN NUMBER
AS
LANGUAGE JAVA
NAME 'squareroot.compsquareroot(int) return float';

/

SET timing on

DECLARE
RESULT FLOAT := 0;
BEGIN
RESULT := javasquareroot (99999);
DBMS_OUTPUT.put_line (RESULT);
END;
PL/SQL procedure successfully completed.

Elapsed: 00:01:10.76

Evet kütüphane gereksinimi duyan matematiksel işlemlerde Java’nın 10 kat dan daha hızlı olduğunu gözlemleyebiliyoruz.

DATABASE YÖNELİK İŞLEMLER (DATABASE INTENSIVE)

PL/SQL programlama dili, Oracle Database Server üzerinde geliştirme yapmak için kullandığımız DB programlama dilidir. Bu sebepten dolayı PL/SQL, Oracle Database Server ile güçlü bir bağa sahiptir. PL/SQL’de kullanılan data tiplerinin birebir eş değerlikleri Oracle’ın kendi içindede bulunmaktadır, bu ilişkiden ötürü PL/SQL de tanımladığımız değişkenler Oracle üzerinde run edilirken conversion (tip dönüşümü) yapılmadan oldukları gibi kalabilirler. Olaya birde Java tarafından bakacak olursak, uygulamanın database ile ilişki kurabilmesi için araya JDBC katmanının girmesi gerekmektedir (JDBC, Java kodu ile SQL arasındaki bağlantıyı kuran katmandır). Java ile DB ilişkisi kurulurken az önce bahs ettiğim sebeplerden dolayı performans ve etkinlik PL/SQL’e göre düşecektir(Extra tip dönüşümleride yapılacaktır.). Araya başka bir katmanın girmesi etkinliği düşerecektir.

Batch Processing yada OLTP tarzı veritabanı işlemlerine bakacak olursak, bu konuda Java ile PL/SQL arasındaki farkı daha net algılıyabiliriz. OLTP işlemlerinde Java ile PL/SQL arasındaki performans farkı PL/SQL lehine  1,5 kat iken, batch tipi db işlemlerinde fark işlenecek data boyutuna göre PL/SQL lehine en az 2 kat mertebelerine  ulaşmaktadır. Dediğim gibi eğer batch işlenecek datanın boyutu artarsa teorik olarak PL/SQL’in performansıda o denli artmaya başlayacağını söyleyebiliriz.

Sonuç olarak ne Java nede PL/SQL tek başlarına en iyi çözüm olarak kullanılamaz. İkisininde  daha performanslı çalıtığı case’ler mevcut, Java’nın hesapişlemerdeki gücünü ve PL/SQL’in database intensive işlerdeki performansını düşünürsek  her ikisinide projelerimizde ortak kullanıp daha performanslı projeler oluşturabiliriz.

Advertisements

About ... from Emrah METE

Bilgisayar Mühendisi
This entry was posted in Java, Oracle, Root, Uncategorized and tagged , , , , , , , , , , , , , , , , . Bookmark the permalink.

5 Responses to Java, PL/SQL Karşılaştırması ve Oracle’da Java Kodu Çalıştırmak

  1. PL/SQL native compilation özelliği 11g ‘de çok basitleştirildi, ilk kıyaslamalara bir de native compile edilmiş PL/SQL bloğunu katmak gerek 🙂

  2. Konuyu öğrendikten sonra:) Yazıyı editleyeceğim, Feedback için teşekkürler Tonguç abi.

  3. Merhaba,
    Toad da “SET timing on” komutunu çalıştıramıyoruz sanıyorum değil mi?

  4. Merhaba Tekrar,
    Dediğiniz gibi sadece F5 komutuyla çalışıyor.
    Tşkler.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s