27 Ağustos 2008 Çarşamba

BUSINESS INTELLIGENCE

Neden İş Zekası Demişler?
Bu kavram ilk olarak 1989 yılında Gartner Inc. firmasında analist olarak araştırma yapan Howard Dresner tarafından kullanılmıştır. O tarihe kadar DSS (decision support system) ve EIS (executive information system) gibi karışıklık yaratan kavramlar kulanılmaktaydı. Burada zekadan çok aslında bir yönlendirme söz konusu. Business Intelligence uygulamaları sayesinde karar vericiler,stratejik ve operasyonel kararlarında daha doğru ve hızlı adımlar atabilmektedirler.
Bu yazımızda Business Intelligence kapsamında Dataware house yapısından ,özelliklerinden ; ETL nedir, nasıl işler ondan bahsedelim...
DATAWAREHOUSE ÖZELLLİKLERİ

1. 1- Database'de sorgularımız kişi bazında olur.
2. 2- Bir çok kaynak sistemden veri alındığı için bütünleşik bir yapı vardır.
3. 3- Değişkenlik göstermeyen data yapısı içerir.
4. 4- Historik datalar saklanır.

OLTP SİSTEMLER İLE DWH ARASINDAKİ FARKLAR dan bahsedecek olursak
OLTP sistemler sadece önceden tanımladığımız operasyonlar , fonksiyorlar için geçerlidir fakat dataware house'da ise o iş için özel olarak tamınlamış sorgular söz konusudur.OLTP sistemler hızlı çalışan ve sürekli sistemin update edildiği sistemlerdir, DHW de ise haftalık , aylık, vb... update run' ları çalıştırılabilir.Sorgu yapısına örnek verecek olursak satış-pazarlama bazında verşi ambarının inceleyecek olursak sorgumuz " Bu kampandan en cok yararlanan müşteri kim?" iken eğer bu soru OLTP sisteme uyarlanacak olursa şu şekilde değişebilir : "Bu kampanyadan elde edilen toplam gelir ne kadardır?" DWH özneye yönelik iken , OLTP nesnelere yönelik sorguları destekler.
Veri ambarınızı temsilen farklı farklı mimariler kullanabilirsiniz.

1. Basic Model : Kaynak sistemlerden verinin geldiği, veri ambarında toplandıgı ve kullanıcılara açıldığı mimari.
2. Ara Katmanlı Model : Veri ambarına verinin gönderilmeden önce ara bir katmanda toplandığı mimari.
3. Ara Katmanlardan ve Data Martlardan oluşan Model : Verinin kullanıcılara açılmadan önce çeşitli data martlarda toplandığı mimari.

ETL NEDİR ?
ETL verinin Kaynak sistemlerden seçilip , taşınıp hedef sisteme yüklenmesidir. (Extraction , Transformation , Loading 'in kısaltması)
EXTRACTION ile başlayacak olursak : Kaynak sistemden data almak dedik, bunu yaparken 2 yolla yapabiliriz

1. Full Extraction : Her seferinde kaynak sistemden bir alım yapacaksak bütüm veriyi alıyoruz.
2. Incremental Extraction : Fakat ıncrementalda "son run'dan" sonraki veriyi aktarıyoruz sadece.

TRANSFORMATION : DWH mimarisi olarak Ara katmanlı ve Data martlardan oluşan yapıdan bahsettik. Bu da bize şunu gösteriyor. Data :

1. Kaynak sistemden ara katmana
2. Ara katmandan veri ambarına
3. Veri ambarından data martlara taşınıyor...

Bu taşınma işlemi heterojen yapılar için(farklı farklı database'ler ya da farklı işletim sistemlerinin taşınmasında) FTP ile ya da Tablespace ler ile yapılıyor.
LOADING : Kaynak sistemden alınan veri son aşama olarak da hedef sisteme yükleniyor. Eğer elimiz de Unix file'ler ya da tablolar varsa bunlar SQL Loader ya da Extern Table'lar ile Hedef sisteme taşıyoruz .
Böylece ETL sürecimiz sonlanmış oluyor.

17 Ağustos 2008 Pazar

Mobil Uygulama Geliştirme

Not: Bu yazıya buradan da ulaşabilirsiniz.

Merhaba arkadaşlar,

Bu yazıda mobil uygulama geliştirmede hedefleyebileceğiniz çeşitli platformlardan, bunlar için uygulama geliştirilebilecek programlama dillerinden, kullanabileceğiniz IDElerden, ve telefon spesifik SDKlardan bahsedeceğim.


Platformlar


Aslen 2 ana platform var. Symbian ve Windows Mobile. En çok bunlar kullanılıyor.
Google Android ve iPhone'u da unutmamak lazım tabii; ancak onlar bu yazının konusu değiller.


Symbian'a JME(Java Micro Edition) ve Symbian C++ ile yazabiliyoruz. Ancak farketmişsinizdir; direk C++ yazmak yerine Symbian C++ yazdım; çünkü C++ biliyor olmanız rahat bir şekilde Symbian C++ da yazabileceğiniz anlamına gelmiyor. En basitinden Symbian C++'ta stringleri kullanamıyorsunuz; çünkü Symbian'ın yazılım geliştiricilere açtığı API'ler parametre olarak 'descriptor' adı verilen şeyler alıyor. Descriptorları kullanmalarının amacı string'leri yazılım geliştiriciler için daha güvenli bir hale getirmeleri imiş. Aynı zamanda descriptorlar unicode; c++ stringleri ise değil. Exception handling de dahil olmak üzere daha birçok konuda farklılıklar var. Ancak Symbian C++'a derinlemesine girmek istemiyorum; Symbian C++ cidden bir derya ve anlatılabilecek cidden çok fazla şey var.


Peki ya, neden Symbian C++'ı kullanıyoruz ki o zaman diyebilirsiniz; JME çok daha rahat yazılıyor sonuçta değil mi?


Evet, aslında bir bakıma haklısınız; eğer birşeyi JME'de yapabiliyorsanız orda yapmalısınız, size çok zaman kazandıracaktır. Ancak, bazı özellikler telefonlardaki JME implementasyonları tarafından desteklenmiyor. Örneğin cell id'yi JME'den alamıyorsunuz; symbian telefonların büyük bir kısmında. Eski 3650'de alınabiliyordu diye hatırlıyorum, N96'da da alınabilecekmiş; ancak dediğim gibi, telefon üreticisinin buna izin vermesi gerekiyor. Bu tip durumlarda native(yerli) kod kullanarak hangi Symbian telefon olursa olsun, Symbian'ın bize açmış olduğu herşeye erişebiliyoruz. Ancak tabi bu sefer de Symbian işletim sistemi olmayan telefonlarda çalışmıyor :( Görüldüğü gibi, bu bir tradeoff aslında; hangisi sizin durumunuza daha uygunsa onu seçmelisiniz.


Başka bir husus da tabii doğal olarak Symbian C++'ta yazılmış bir uygulama JME'den daha hızlı çalışacaktır yerli kod olduğu için. Her 2 dildeki aynı özelliklere sahip uygulama geliştirme süreleri göz önüne alındığında, bu hız farkı çok da önemli olmayabilir tabi duruma göre. Symbian C++ ve JME karşılaştırması hakkında son bir cümle daha söyleyeyim ve bitireyim: Symbian C++ çok daha güçlü; ancak çok daha eziyetli de güzel bir kelime olurdu :)


Symbian'a aynı zamanda Python'la da yazabilirsiniz, ancak daha önce herhangi bir tecrübem olmadı, o yüzden pek fazla birşey yazamayacağım bu konuda.


Symbian'a .NET'le yazabiliyor olmak ister miydiniz? Birkaç sene önce aslında buna izin veren bir firmanın IDE'si(Appforge CrossFire) vardı, ancak daha sonra Oracle şirketin entellektüel mülkiyetini satın almıştı ve şirket operasyonlarına son vermişti. O zamandan sonra bu mümkün olmamıştı, ancak şimdilerde yine bir firma bir library aracılığı ile Symbian'a .NET uygulamaları yazılmasına izin veriyor. Ancak Net60 adı verilen bu library paralı ve sadece .NET CF 1.0 uygulamaların geliştirilmesine izin veriyor. Hali hazırdaki .NET CF 1.0 uygulamalarınızı Symbian'da çalıştırabiliyorsunuz böylece.


Windows Mobile'a ise herhangi bir para ödemeden daha geniş bir dil havuzuyla yazabiliyoruz denebilir sanırım..


Windows Mobile için uygulamalar daha çok .NET framework'ü ile ve C# ile yazılıyor; ancak bildiğiniz gibi .NET framework'ü aslında herhangi bir dile has değil, bildiğim kadarıyla yaklaşık bir 35-40 dilde yazılabiliyor. Ancak bunların hepsi 'managed' olmuş oluyor, yani .NET framework sonuçta hepsini tek bir dile çeviriyor. 'Managed' olmayan bir şekilde C++ ile yazmak da mümkün tabii. Aynı zamanda JME ile de yazabiliyorsunuz, ancak ben hiç denemedim. Benim gözlemlediğim, C# ile gerektiğinde DLL çağrıları yaparak istediğiniz herşeyi yazabildiğiniz. Ancak yine de önceden belirttiğimiz gibi uygulamanızın geniş bir telefon yelpazesinde çalışmasını istiyorsanız JME vazgeçilemez durumda şu an.


IDEler


IDE'leri inceleyecek olursak; JME uygulamaları için Mobility Pack'li Netbeans en iyi seçenek gibi gözüküyor.(Eclipse ME de bir seçenek) Windows Mobile uygulamaları için tabii ki Visual Studio'yu, ve son olarak Symbian C++ için Nokia'nın Eclipse'i baz olarak alıp ve onu geliştirerek yarattığı bedava olan Carbide.c++ IDE'sini kullanabiliriz. Aslında bazı özellikler sadece 1 aylığına bedava,(telefon üzerinde debuglama gibi) bundan sonra gerekli ücreti ödeyerek satın almanız isteniyor kullanmaya devam etmek için.


SDKlar


Ancak IDEler dışında, hedeflediğiniz telefon platformu ve işletim sistemi için gerekli SDK'ları(Software Development Kit) da yüklemeniz gerekiyor. Örneğin N95 için 3rd Edition Feature Pack 1 SDK'sını yüklemiştim ben, ona uygulama geliştirdiğimde. Aynı zamanda Windows Mobile için de işletim sistemi versiyonlarına göre ayrılıyor. Windows Mobile 5.0 veya 6.0 SDK gibi işletim sistemi versiyonuna uygun SDKyı yüklemeniz gerekiyor uygulama geliştireceğiniz sisteme.


Hangi SDK'yı yüklemem gerektiğini nasıl anlayabilirim diyorsanız; dostumuz Google'a "[telefonModeli] spec" tarzında aramalarda bulunarak, telefonun spesifikasyonunun olduğu bir sayfaya yönlenip oradan gerekli bilgiyi alabilirsiniz.


Evet, şimdilik bu kadar, umarım faydalı olmuştur, aklıma başka şeyler gelirse gerektiğinde eklemede bulunabilirim.


Ozan Safi
Soru ve önerileriniz için: ozansafi@gmail.com

14 Ağustos 2008 Perşembe

PARALLEL EXECUTION

Parallel Execution nasıl çalışıyor?

Birazdan örnektede göreceğimiz gibi verdiğimiz paralellik komularıyla sql sorgumuzu processlere(unıt) ayırıyoruz.Oracle paralel bir sql sorgusunu çalıştırırken bir çok process eş zamanlı olarak çalıştırıyor.Sorguyu parçalara ayırma mantığıyla tek bir process'in bir işi yapması yerine birden cok process bir iş için çalışıyor. Yanlız bunları yaparken dikkat etmemiz gereken konulardan biri de şu : "Eğer sorgularımızı paralel çalıştırmak istiyorsak yeterli disk alanına ve CPU ya ihtiyacımız var. "

Parallel Execution kullanılmadığında tek bir server process yapması gereken işleri sırasıyla yapıyor(full table scan) fakat sorguya paralellik verdiğimizde bir çok parallel execution server çalışıyor.Tablo dinamik olarak kordinatör tarafından execution anında kararlaştırılarak, parçalara bölünüyor ve her bir parça, bir parallel execution server tarafından işleniyor. Parçaların da bir araya gelmesi bize granülleri veriyor. Eğer elimizde bircok granül varsa , sırasıyla bir granül paralel işleniyor ve execution server bu granülü okumayı bitirdikten sonra diğer granüle geçiyor. Bu işlem elimizde birçok ufak processlerden oluşmuş granüller bitene kadar devam ediyor.

Sunumu sırasında arkadaşımız "A.Fuat SUNGUR" parallel execution 'ın gerekliliğine dair güzel bir örnek vermişti. Düşünün ki bir yazıyı paragraf paragraf özetleyeceksiniz ve eğer bu özeti parallel execution mantığıyla her kişiye bir paragraf düşecek şekilde kişilere paylaştırırsanız anlamsız olur.Bunu bir kişinin yapması daha mantıkıdır. Bu güzel örnekten
yola cıkarak SQL 'de de execution süresi kısa olan, az veri döndüren sorgularda Paralel Execution kullanmamalıyız. Peki ne zaman kullanmalıyız Parallel Execution'ı ?

  • Büyük boyutlu table scan , join , index scan yapmamız gerektiğinde ,
  • Büyük boyutlu indexler yaratmamız gerektiğinde ,
  • Fazla sayıda insert , update , merge veya delete olduğunda ,
  • Büyük boyutlu datayı sort etmemiz gerektiğinde kullanışlıdır.

Bu kullanımlarla :
  1. Saatlerce sürecek bir işi daha kısa bir zaman diliminde bitirebilirsiniz.
  2. Kaynakları daha verimli kullanırsınız (cpu,memory...)
ALTER table bigtab NOPARALLEL;
/
SELECT * FROM bigtab ;
--execution time=76.192 seconds


ALTER table bigtab PARALLEL;
/
SELECT /*+ PARALLEL(T 16) */ owner,object_name FROM bigtab T ;
--execution time=22.703 seconds

gzdalhan@gmail.com

27 Temmuz 2008 Pazar

Sürüm Yönetimi

Yazılan program parçalarının , değiştirildikçe oluşan yeni yapısı versiyon kelimesiyle takip ediliyor. Şirketler "Clear Case" gibi ortak paylaşım platformlarına programlarını koyuyorlar. Test aşamasında hata alan programlar kontrol ediliyor ve düzeltilmiş halleri bu sefer farklı bir versiyon numarasıyla tekrar Clear Case'e yükleniyor.Sürüm yönetiminin isminden kaynaklı olarak yaptığı iş bu versiyonları takip etmek gibi algılansa da esasında o kadar da basit değil. Aksine bir o kadar karmaşık. Sürüm yünetimi yapan kişiler kodun her aşamasında yer alıyorlar aslında.Süreç müşteriyi, analizi, tasarımı, kodlamayı, testi ve deploymentı kapsıyor aslında.

Genel olarak Sürüm Yöneticileri :

•IT servislerindeki değişimlere genel bakış sağlar ve teknik/teknik olmayan konuların birlikte yürütülmesini sağlar
•Planning, design, build, scheduling, configuration ve testing yapar
•Software, hardware ve diğer CI lardan sorumludur
•Müşteri beklentilerini karşılanması için kominikasyon sağlar
•DSL(Definitive Software Library) ve DHS(Definitive Hardware Store) kontrol eder bakımını yapar
•Çıkan ürünlerin güvenirliklerini sağlar
•Geri dönüş planlarını yaratır
•Ürünlerin dağıtımı ve kurulumundan sorumludur.
•Kodun okunması , yıllar sonraya taşınması , saklama ve performans standartlarının kotrollerinden sorumludur. Örnek verecek olursak nedir bu standartlar : Ben şirketimde Kodun çalışma performansını düşürmemek için 2 tane iç içe " if " ten fazlasını istemeyebilirim. Paket içinde her procedure 'ün sonunda "handling exception" mekanizması olacaktır diyebilirim ya da yorum satırları olmak zorundadır diyebilirim.

ZORLUKLAR && AVANTAJLAR

1-Kişi kontrol eden görevinde olduğu için tek proses ile tüm yapıyı kavramak ve anlamak zorundadır
2-Kişi DSL ve DHS yapılarının kontrolünü ve bakımını yapabilmesi için bu yapılara hakim olmak zorundadır.
3-Sürüm yönetimi bize "Standartların Oturtulması" gibi bir sonuç sağlar. Bir şirkette yapılacak işlerin standartlara oturtulması çözümleme , geliştirme , test ve bakım işlemlerini kolaylaştırır.
4-Acil çözümlerin süreci delmesi : Tüm bu kontrollerin arasında patronunuz çok daha acil bir iş çıkarabilir ve sizin bunun aciliyetini bile sorgulamaya vaktiniz yoktur =)
5-Kişiler çok miktarda değişimlerle başedebilmeli , servis kalitelerini yüksek tutmalıdırlar.
Yanlış veya izinsiz yazılım kullanımını önlenmesi de sürüm yönetimi kapsmına giriyor.Şirketinizde herhangibir kişi PC ye yaptığı downloadlar üzerinden programlar gelştirebilir ama ileride öngörülemeyecek sorunlarla uğraşmamak adına yasallıklar kontrol edilmelidir.

26 Temmuz 2008 Cumartesi

SQL, PL/SQL, and Java

Veritabanı ile içli dışlı olan birisiyseniz mutlaka SQL i duymuşsunuzdur.Sanırım,veritabanı sorgulama ve yönetim dillerinden birisi kendisi..Hem de neredeyse bütün ilişkisel veritabanı sistemleri ile iletişim kurabilme yeteneği sayesinde çok özel bir yere de sahip bir vatandaştır.

SQL komutları iki alt grupta incelenir:

1-DDL - Data definition Language (Veri tanımlama dili)
2-DML - Data manipulation Language (Veri İşleme dili)

Verilerimizi işleyen komutlar SELECT,INSERT,UPDATE ve DELETE'tir.Bunlara aynı zamanda DML komutları da denir.

Select, istediğimiz tablodan kendi belirlediğimiz kriterlere göre kayıtları önümüze serer.Tabloda hangi alanları görüntülemek istiyorsak alan isimlerinin arasına virgül koymamız yeterlidir.Örnek vereyim:

SELECT isim,soyisim FROM ogrenci;

Beni bu kesmez,tablonun hepsini görmem lazım diyorsanız * karekterini çok seven birisi olmalısınız :) Niye mi,örneği inceleyin ;)

SELECT * FROM ogrenci;

Ama çoğu zaman böyle bütün bilgilerin çarşaf gibi gelmesini istemeyiz.Çünkü zaman kısa ve kısa zamanda en uygun bilgiye ulaşmamız gerçeği ile karşı karşıyayız ;) Tamam, merak etmeyin bunun da yolu var... Anahtar kelime ise WHERE

Diyelim ki, John Fred adlı müşterim faturasını ödediği konusunda beni ikna etmeye çalışıyor.Sonuçta bende John'un çetelesini tutan birisi değilim,ama sonuçta bu tezi çürütmek için antitez sunmak gerekiyor.İşte bu noktada veritabanım ve SQL yardımıma koşuyor.Diyorum ki:

SELECT * FROM SuleymanHolding where isim="John" and soyisim="Fred";

Yukarıdaki kurtarıcı meleğim sayesinde John'a dersini vermiş oluyorum böylece.Nasıl yöntem ama :P

Aslında WHERE i biraz daha tanıyalım diyorum ben,çünkü kendisine haksızlık olacak:

Where, genelde grup çalışmasını seven bir arkadaşımızdır.Sizi birlikte çalıştığı operatörlerle tanıştırayım isterseniz:

<> Büyük
>= Büyük veya eşit
<= Küçük veya eşit !<> Büyük değil
= Eşit
<> veya != veya # Eşit değil

Onlar da sizinle tanıştıklarına memnun olmuşlar :)

Az daha unutuyordum, AND, OR ve NOT ile de araları çok iyi.Birden fazla sorgu olduğunda bir araya geliyorlar.Yoksa birbirlerini aradıkları sordukları yok bana kalırsa.
SELECT * FROM ogrenci where cinsiyet="K" AND sinif=6 OR ogrencisayisi <60;

SQL, düzenli ve tertipli insanları düşünerek kendisine DESC ve ASC gibi iki önemli komutu eklemiştir. Bunlar da nedir diyebilirsiniz,biraz sabredin bende tam onu açıklayacaktım.DESC,verilerin azalan sırada,ASC ile verilerin artan sırada listelenmesini sağlar.Hem de istersen istediğimiz kriterlere göre bile verilerimizi artarak ya da azaltarak listeletebiliyoruz.

SELECT * FROM ogrenci ORDER BY tarih DESC;
(Tarih kriterine göre azalan bir sırada listeleyecektir.)

ASC, örneğini de siz düşünün,her şeyi devletten beklemeyin canım :P

Biliyorsunuz ki veritabanı içindeki tablolar ve alanlar birbiriyle çok sıkı fıkı olabiliyor.Bu nedenle bazı veriler birden fazla yerde geçebiliyor, ki bu da select arkadaşımızdan bazı alanları listelemesini rica ettiğimizde o bilginin birden fazla listelenmesine sebep oluyor.SQL, buna da çözüm bulmuş.Dedi ki, eğer bunu önlemek istiyorsan DISTICT komutu kullan:
SELECT DISTICT bolum FROM ogrenci where ogrenciid>20 ;

Tamam her şey hoş güzel de bana, 20 ile 30 arasındaki ogrenciler lazim,20 den büyük deyince 20 sonraki bütün öğrenciler listeleniyor.Ne anladım ben bu işten diyorsunuz değil mi :) SQL de çözümler biter mi hiç, sizi bugün bir de BETWEEN kardeşimizle tanıştırayım.Mesleği mi nedir? Tam sizin istediğiniz şeyi yapan işte bu eleman.Örneğin:

SELECT * FROM ogrenci where ogretmenmaas BETWEEN 600000 AND 900000;

Ama kriteriniz bir tarih ise şunu kullanmanızı öneriyorum,ama tercih sizin :P
SELECT * FROM ogrenci WHERE derstarihi BETWEEN {2100-06-01} AND {2999-02-03};

Hayatınızda bir günde bu kadar kişiyle tanıştığınız mı bilmiyorum ama son olarak sizi AVG,SUM,MIN,MAX ve COUNT isimli arkadaşlarla tanıştırmak istiyorum."Kendini lafla değil,işle ve eserle anlat" demiş ya bir düşünür,isterseniz bende bu arkadaşları size işle anlatayım :)

SELECT MIN(ogrenciid) FROM ogrenci WHERE sinif=6;

* 6. sınıftaki ogrenciid si en büyük olanı getirir.
SELECT MAX(ogrenciid) FROM ogrenci WHERE sinif=7;

*Evet mikrofon sizde ;)
SELECT SUM(ogrencisayisi) FROM ogrenci where bolum="sayisal";

* Sayısal bölümdeki bütün öğrencilerin toplam sayısını getirir.

SELECT AVG(yas) FROM ogrenci WHERE bolum="esitagirlik";

*Eşit ağırlıktaki öğrencilerin yaş ortalamasını getirecektir.

SELECT COUNT(*) FROM ogrenci;

*ogrenci tablosundaki kayıt sayısını görüntüler.

Şimdilik bu kadar, SQL yeter sanırım,sonra devam ederiz.Biraz da PL/SQL nedir,ne işe yarar ,ne eder ne yapar onu bir inceleyelim diyorum ben.

PL/SQL , SQL'in bir üst kümesi olmak üzere yordamsal olarak geliştirilmiş bir dildir.Özellikle bir defada çok fazla işlem yapmamız gerekiyorsa tek veritabanı bağlantısıyla işi bitirmemizi ve de veritabanı olaylarının tetiklenmesinde işimize oldukça yarar.

PL/SQL, tanımlanan bloglar ile veritabanının kapısını çalar.Yoksa veritabanı ile bir türlü anlaşamaz,çünkü veritabanı ondan düzenli,net tanımlı,kendinin anladığı bir dilden konuşmasını ister.PL/SQL 'de Anonymous,Procedure ve Function olmak üzere 3 blok türünde veritabanı ile sohbeti oldukça ilerletmiştir :)

Örnek vermek gerekirse:

Anonymous

[DECLARE]

BEGIN
--Deyimler
[EXCEPTION]
END;

Procedure

PROCEDURE name
IS

BEGIN
--Deyimler
[EXCEPTION]
END;

Function

FUNCTION name
RETURN datatype
IS

BEGIN
--Deyimler
RETURN value;
[EXCEPTION]
END;


Değişkenler bizim istediklerimizi yapan ve bizden iş isteyen sadık elemanlarımızdır.Ancak bazı şartları varmış,sizinle bu şartların en önemlilerini sizinle paylaşayım.Diyorlar ki:

*Beni tanımlarken bir harfle başlamalısın.

*Declerative kesiminde tanımlamalısın.

İsterseniz artık yavaş yavaş ilk PL/SQL bloğumuzu yazmaya başlayalım:

SET SERVEROUTPUT ON

--Açıklama Satırı

DECLARE

tk_ISIM VARCHAR(20);

BEGIN

select ISIM into tk_ISIM from OKUL where OKUL_SN=5;

DBMS_OUTPUT.PUT_LINE(‘5 nolu okulun adı:’ || tk_ISIM);

END;

Değişkenlerle çok sık haşir neşir olacağımız için bu elemanların özelliklerinden biraz daha bahsetmek istiyorum:

*Kendilerinin anlamlı adlarla çağırılmalarından çok hoşlanırlar.

*NOT NULL kısıtlaması varsa mutlaka ilk değerin atanmasını isterler.

*CONSTANT tanımlanıp da ilk değeri atamazsanız sizi yarı yolda bırakır.

*Siz siz olun,kolon adlarını değişken adı olarak kullanmayın ;)

%TYPE Kullanımı

%TYPE , ikide bir karşıma çıkıyor,bu da neyin nesidir diyebilirsiniz.Çünkü ben ilk gördüğümde öyle demiştim J Meğer ki, tanımladığımız değişken türünü mevcut veritabanındaki tablodan üretilmesini sağlıyormuş.

Kullanımı : değişken tabloadı.kolonadı%TYPE;

emp_lname employees.last_name%TYPE;

min_balance balance%TYPE=1000;

%TYPE i daha kalıcı olarak anlayabilmemiz için bir örnek üzerinde görelim isterseniz:

/* Bugünün ve yarının tarihini ekrana yazdırır.*/

SET SERVEROUTPUT ON

DECLARE

bugun DATE:=SYSDATE;

yarin today%TYPE; /* Burda birinci değişkenden %TYPE ile faydalandık. */

BEGIN
yarin:=bugun+1;

DBMS_OUTPUT.PUT_LINE(‘Hello World’);

DBMS_OUTPUT.PUT_LINE(‘Bugun:’ || bugun);

DBMS_OUTPUT.PUT_LINE(‘Yarın:’ || yarin );

END;

PL/SQL ‘i biraz daha yakından incelediğimde IF,WHILE,FOR gibi döngülere sahip olarak kendisinde güçlü bir yetenek katmış olduğunu gördüm.Tabi durur muyum,hemen bu yetenekleri nasıl kullanabilirim üzerinde araştırma yapmaya başladım…

İsterseniz biraz örneklere göz atalım:

IF KULLANIMI

DECLARE

not number:=31; /* İlk değer vermemiz önemlidir.Aksi takdirde ELSE kesimi işleyecektir.*/

BEGIN

IF not <11

THEN

DBMS_OUTPUT.PUT_LINE(‘Tembel bir ogrenciyim..’);

ELSEIF not<71

THEN

DBMS_OUTPUT_LINE(‘Orta duzey bir ogrenciyim’);

ELSEIF not<86

THEN

DBMS_OUTPUT_LINE(‘Basarili bir ogrenciyim…’);

ELSE

DBMS_OUTPUT_LINE(‘Henuz bilmiyorum,kendimi ariyorum :P’);

END IF;

END;

WHILE KULLANIMI:

DECLARE

ulkeid mevki.ulke_id%TYPE := ‘CA’;

mev_id mevki.mevki_id%TYPE;
yeni_sehir mevki.sehir%TYPE := ‘İzmir’;

sayac SAYI :=1;

BEGIN

SELECT MAX(mevki_id) INTO mev_id FROM mevki

WHERE ulke_id=ulkeid;

WHILE sayac <= 3 LOOP

INSERT INTO mevki(mevki_id,sehir,ulke_id) VALUES(mevki_id+sayac),yeni_sehir,ulkeid);

counter := counter+1;

END LOOP;

END;

FOR KULLANIMI:

DECLARE

Ulkeid mevki.ulke_id%TYPE :=’CA’;

mev_id mevki.mevki_id%TYPE;

yeni_sehir mevki.sehir%TYPE := ‘Hakkari’;

BEGIN

SELECT MAX(mevki_id) INTO mev_id

FROM mevki

WHERE ulke_id=ulkeid;

FOR i IN 1..3 LOOP

INSERT INTO mevki(mevki_id,sehir,ulke_id)

VALUES((mev_id+i),yeni_sehir,ulkeid);

END LOOP;

END;

Hep var olan tablolar üzerinden işlem yapıyoruz, hiç kullanıcıdan bilgi istemeyecek miyiz diye aklınıza soru gelebilir. Evet kesinlikle çok haklısınız. Onun için de ‘&’ i kullanıyoruz.

Örneğin;

UNDEFINE ISIM

SET SERVEROUTPUT ON

SET VERIFY ON

BEGIN

DBMS_OUTPUT.PUT_LINE(‘Adınız: &&ISIM’);

DBMS_OUTOUT.PUT_LINE(‘Adınız:’ || UPPER(‘&ISIM’));
END;

Sıra geldi, bileşik veri türlerine… Bu arkadaşları iki temelde inceleyebiliriz:

1-Satır temelli bileşik veri (PL/SQL Records) : Programlamadaki struct a benzetebiliriz.Tablonun bir satırının işlenmesi amaçlı değişkene aktarılması gerektiği durumlarda kullanılır.

Örneğin;

TYPE pers_record_type IS RECORD

(soyadi VARCHAR(25),

is_id VARCHAR(10),

maas NUMBER(8,2) );

pers_record pers_record_type;

pers_record.soyadi :=’Yıldırım’;

%TYPE’ nin akrabası olan %ROWTYPE ile tanışmaya geldi sıra… %ROWTYPE, bir tablonun satır yapısının aynısında PL/SQL Record değişkeni oluşturulmasını sağlar.Bu yapı derleme zamanı oluşturulur.Yani tablonun değişmesi durumunda kodun yeniden derlenmesi tavsiye edilir.

Örneğin;

DEFINE personel_no = 124

DECLARE

pers_rec emekli_personel%ROWTYPE;

BEGIN

SELECT personel_id,soyisim,is_id,yonetici_id,kira_tarihi,maas,komisyon,departman_id

INTO pers_rec FROM personel

WHERE personel_id = &personel_no;

INSERT INTO emekli_personel VALUES pers_rec;

END;

SELECT * FROM emekli_personel;

2-Birden çok veri saklayan bileşik veri (Index By Tables): Bu yapıyı iki kolonlu bir tablo gibi düşünebiliriz.Birinci kolon primary key gibi çalışırken,ikinci kolon değerleri saklamak için kullanılır.

Örneğin;

DECLARE

TYPE isim_tablo_tipi IS TABLE OF

personel.soyisim%TYPE

INDEX BY PLS_INTEGER;

TYPE kiratarihi_tablo_tipi IS TABLE OF

DATE

INDEX BY PLS_INTEGER;

tablo_ismi isim_tablo_tipi;

kiratarihi_tablo kiratarihi_tablo_tipi;

BEGIN

tablo_ismi(1) :=’ MODA’;

kiratarihi_tablo(2) := SYSDATE + 7;

IF tablo_ismi.EXISTS(1) THEN

INSERT INTO ….

….
END;

PL/SQL Record u farklı kullanım alanlarına bir göz atalım isterseniz:

Nested Table : Index By yapısı gibi dizelere benzer.Ayrıldıkları noktalar:

-Dizini negatif değerler almaz.

-Dizin değeri sıralıdır.

-Veritabanında VARCHAR2 gibi saklanabilir.

Örneğin;

SET SERVEROUTPUT ON

DECLARE

TYPE location_type IS TABLE OF locations.city%TYPE;

Offices location_type;

Table_count NUMBER;

BEGIN

Offices := location_type(‘Şırnak’,’Ağrı’,’İzmir’,’Ankara’);

table_count := offices.count();


FOR i in 1..table_count LOOP

DBMS_OUTPUT.PUT_LINE(offices(i));

END LOOP;
END;

Varray: PL/SQL’in farklı kullanımlarından bir tanesi de Varray’dir.En önemli özelliği dizi boyunun sabit olması ve dizi boyunun tanımlanırken belirlenmiş olmasıdır.

Belki daha bitmedi mi kardeşim,roman mı yazıyorsun diyebilirsiniz ama az kaldı biraz daha sabredin J

Explicit Cursor (Belirtilmiş İmleç): Bu garip şey de nedir diyor insan ilk gördüğünde değil mi? Şu işe yarıyormuş: Diyelim ki bir sorguyu çalıştırdık ve önümüze satırlar çıktı,bu çıkan satırlar geçici bir alanda saklanıyorlarmış.İşte explicit cursor tam bu noktada sahneye çıkarak o saklanan alanlardaki satırları çağırmamızı sağlıyorlarmış.

Örneğin;

SET SERVEROUTPUT ON
DECLARE

CURSOR emp_cursor IS

SELECT employee_id,last_name FROM employees

WHERE departman_id=30;

Empno employees.employee_id%TYPE;

Lname employees.last_name%TYPE;

BEGIN

OPEN emp_cursor;

LOOP

FETCH emp_cursor INTO empno,lname;

EXIT WHEN emp cursor%NOTFOUND;

DBMS_OUTPUT.PUT_LINE( empno || ‘’ || lname );

END LOOP;

CLOSE emp_cursor;

END;

SQL Cursor: Bazı zamanlarda kullanıcı tarafından açıkça cursor istenmemiş olabilir.Bu durumlarda Oracle sorgu sonucunda ilerleyebilmek adına kapalı bir SQL cursor kullanır.Bazı SQL Cursorlarından örnek vermek gerekirse: SQL%FOUND , SQL%NOTFOUND, SQL%ROWCOUNT diyebiliriz.

Örneğin:

VARIABLE rows_deleted VARCHAR2(30)

DECLARE

Empno employees.employee_id%TYPE := 176;

BEGIN

DELETE FROM employees

WHERE employee_id=empno;

:rows_deleted := (SQL%ROWCOUNT || ‘row deleted. ’);
END;

Stored Procedures & Functions : İlk başta blokları 3 e ayırmıştık.İsterseniz biraz da kısaca bu kalan bu iki blok hakkında biraz konuşalım.Daha iyi anlaşılması için anaonymous bloklarla stored Procedures & Functionları karşılaştıralım diyorum ben:

Anonymous Bloklar ; İsimsizdirler.Her çalışmada derlenirler.Veritabanında saklanmazlar.Başka bir uygulamaca çağrılmazlar.Değer döndürmezler.Parametre alamazlar.

Stored Procedures & Functionlar ise tam bunların tersini yapabildikleri için doğru yerde ve doğru zamanda kullanıldığında inanılmaz işimize yararlar.

Örneğin;

CREATE OR REPLACE FUNCTION check_ss1(empno employees.emplooyee_id%TYPE)

RETURN Boolean IS

dept_id employees.departman_id%TYPE;

sal employees.salary%TYPE;

avg_sal employees.salary%TYPE;

BEGIN

SELECT salary,department_id INTO sal,dept_id FROM employees WHERE employee_id=empno;

SELECT avg(salary) INTO avg_sal FROM employees WHERE departmen_id=dept_id;

ID sal > avg_sal THEN

RETURN TRUE;

ELSE

RETURN FALSE;
END IF;

EXCEPTION

WHEN NO_DATA_FOUND THEN

RETURN NULL;

END;

İşlev Çağırma:

BEGIN

DBMS_OUTPUT.PUT_LINE(‘Checking for employee with id 205’);

IF(check_sal(205) IS NULL ) THEN

DBMS_OUTPUT.PUT_LINE(‘Returned NULL due to exception’);

ELSEIF(check_sal(205)) THEN

DBMS_OUTPUT.PUT_LINE(‘Salary >average’);

ELSE

DBMS_OUTPUT.PUT_LINE(‘Salary

END IF;


END;

Amacımız PL/SQL’e kısa bir giriş yapmak olduğu için Trigger’lara da değinip bu yazımı sonlandırmak istiyorum:

Tetikleyici (Trigger) : Tetikleyiciler,olaylar yoluyla çalışırlar.Bir olaydan hemen sonra ya da hemen sonra çalışacak şekilde ayarlanabilirler.

Örneğin;

CREATE OR REPLACE trigger “t_SEQ_SEKTOR_PK” before insert

on “SEKTOR” for each row

BEGIN

SELECT “SEQ_SEKTOR_PK”.nextval

INTO : new.”SEKTOR_PK” FROM dual,

END;

Sözlerime burada son verirken son olarak oracle de java kullanımından birazcık bahsetmek istiyorum:

Oracle prosedürleri içerisinde bildiğiniz gibi Java kodu kullanmak mümkündür.Oracle, kendi içerisinde gömülü bir JVM içerir ve bu sayede istediğimiz Java kodunu Oracle veritabanı üzerinde tanımlayabilir ve çalıştırabiliriz.

Diyelim ki aşağıdaki gibi bir java kodumuz olsun:

create or replace and compile java source named runcommandjava as
import java.io.*;
import java.util.*;
public class RunCommandJava{
public static void run(String cmdText)
throws IOException, InterruptedException
{
int rtn;
Runtime rt = Runtime.getRuntime();
Process prcs = rt.exec(cmdText);
rtn = prcs.waitFor();
}
}

Bu java kodunu çalıştıracak Java prosedürünü şu şekilde yazabiliriz:

CREATE OR REPLACE PROCEDURE RUNOSCOMMAND
(param IN VARCHAR2) AS LANGUAGE JAVA
NAME 'RunCommandJava.run(java.lang.String)';

Çalıştırmak için de tek yapmamız gereken: exec runoscommand('echo deneme'); demektir.

Umarım faydalı bir yazı olmuştur.Lütfen varsa eksiklikleri ve düzeltmeleri paylaşınız.

21 Temmuz 2008 Pazartesi

Data Concurtency ve Consistency

Merhabalar arkadaşlar geçte olsa benim gibi tembel adamlara rağmen bir staj bloğuna başlanmış.Bu konuda öncü olanlara ve desteğini bizden esirgemeyen GURU Tonguç abimize çok teşekkür ederim.Siz gibi değerli arkaşalarımızın arasında bana düşmez bir şeyler yazmak ama karşımda sürekli çalışan Süleyman arkadaşımızı görünce onun bu azmi karşısında yazmaktan yorgun düşmüş klavyemin ucunda biriken nağmeler yeniden hortlayarak interruptlarını göndermeye başladı.:)
Tarih 20 Temmuz 2008 eğitimin tarihi ise 12 Temmuz 2008 .Nerdeyse eğitmenimiz Övünç Bozcan abiyi unutacağım.Daha yeni yazıyorum.Eğitmeni unutan eğitimide unutmuş olabilir bundan dolayı yanlış veya eksik yazılarım için şimdiden özür dilerim,düzeltme ve eklemeleriniz içinse sizden rica ederim.

DATA CONCURRENCY VE CONSISTENCY

Tek kullanıcılı databselerde kullanıcı istediği gibi verileri değiştirip okuyabilir.Fakat çok kullanıcılı databselerde birden fazla kullanıcı ayna anda aynı data üzerinde değişiklik yapmak isteyebilir.İşte o zamanda transactionın tutarlı ve anlamlı sonuçlar üretmesi gerekir.Bundan dolayı databasein concurrency ve consistent olması hayati önem taşırmış.

Concurency: Birçok kullanıcının aynı anda aynı kaynağa-dataya ulaşabilmesi demektir.

Consistency:Diğer kullanıcılar kendi transactionlarını gerçekleştirirken her kullanıcı verinin kararlı halini görmesidir.

Transactionlar aynı anda çalışırken veri tabanının consistent nasıl davranacağını karar vermek için araştırmacılar serializability adında transaction isolation model tanımlamışlar. Bu modda transactionlar birkaç yolla çalışırlarken concurently şekilde davranırlar.Transactionlar arasında isolationın bu derecesi genellikle birçok uygulama çalışırken aynı çıktıları üretmeleri arzu edilir.Concurrency locklardan etkilenir fakat bunlardan çok daha fazla bişeydir.

Transaction Isolation Level

Dirty reads:Commit edilmemiş datalar arası işlem yaparken başkasının gelip eski bilgiyi okuması demektir.Oracle da okuyucular datayı değiştirmiş olsalar bile diğer kullanıcı undo blocklardan değişmiş datayı okuyacağından dirty read yoktur.Aşağıdaki gibi sorunu çözer.



Non-Repeatable read:Bir kullanıcı bilgiyi okuyor geçiyor.Hemen ardından başka bir kullanıcı bilgiyi değiştirip commit ediyor.İlk kullanıcı yeniden veriyi okuduğunda ilk veriyle bir tutarsızlık oluyor.Buna deniyor.

Phantom Read:Burayı kaçırmışım galiba ama okuduğum kadarıyla yine bir kullanıcı gelip select yapıyor almak istediğini alıyor.İkinci bir kullanıcı geliyor adamın bu select yaptığı yere insert yapıyor.sonra ilk kullanıcı yeniden select çalıştırdığında aynı veriler elde edilmiyor.Bir üstekine çok benziyor anladığım kadarıyla bundaki tek fark insert edilmesiymiş.

Oracle Isolation Levels

Read Commited:Default olan transaction isolation leveldir.Oracleda her bir sorgu başladığında o ana kadar commit edilmiş bilgileri görür.Boylelikle dirty read olayını da önlemiş olur.

Serializable:Bunda transaction başlamasına kadar olan değişikliklere artı olarakkendi içinde yaptığı INSERT,UPDATE ve DELETE statementlarınada izin verir.
Read-Only:Bu sadece transaction başladığındaki bilgileri görür ve işlem yapar üsteki gibi INSERT,UPDATE ve DELETE statementlarınada izin vermez.

Flashback Concept

Flashback query geçmişte kalan bir bilgiyi elde etmemizi sağlayan birşeydir.Bun sorguyu zaman veya SCN bazında yapabiirsiniz. Bunu yaparkende undolardan yararlanır.Oracle undo retention period adında bir değişken tutar.Bu flashback yapılabilecek noktayı gösterir.

LOCK

Locklar aynı kaynağa ulaşmaya çalışan transactionların concurrency olmasını sağlayan mekanizmadır.Sql statement çalıştırıldığında ORACLE otomatik olarak lock mekanizmasını size sağlar.Oracle yüksek veri tutarlılığı için gerekli olan en düşük lock mekanizmasını kullanır.

Lock yapısı databaseler arası farklılık gösteren ve databaseleri bildiğimiz dosya sisteminden ayıran bir yapıdır.Bu yapıyı databaseler çok farklı şekilde kullandıklarından databaseler arası farklılığı bunlar oluşturur denilebilir.
Oracle okuma yaparken kilit kullanmaz ve kayıtları satır bazında kilitler.Siz bir row üzerinde değişiklik yapıyorsanız sadece o satır kilitlenir.Diğer satırlar bundan etkilenmez.

Databaselerde Lost update denen bir olay var.2 kullanıcı bir veri üzerinde değişiklik yapacak birinci kullanıcı yapıyor commit ediyor ikinci kullanıcı bunu görmeden oda değişiklik yapıp commit etmeye çalışıyor.Fakat yaptığı değişiklik olmayabilir çünkü birinci kullanıcı önceden veriyi değiştirmiştir.Bu durumun kontrol altına alınması gerekir.Bu MsSql de de disconnected layerde var.Bu durumu Oracle 2 şekilde ele alır:

Pessimistic Locking:Oracle’da “SELECT FOR UPDATE ” ile select statement çalıştırıldığı zaman kilit oluşturulur.Birinci kullanıcı raw a eriştiği an kilit oluşturulur,ikinci kullanıcının erişmesi engellenir.Tabi bu durum concurrency’i düşürür.Buda malumunuz istenen bir durum değildir.

Optimistic Locking:Burda durum hakkaten iyimserdir.Select yaptığınızda kilite gerek yoktur.Fakat update kısmında durum kontrol edilir.Oracle default olarak bunu kullanılır ve çeşitli şekillerde implemente eder.

Lock Tipleri
Oracle dataya farklı erişimlerin tutarlılığını sağlamak ve userlar arasındaki o birbirini yıkıcı durumları ortadan kaldırmak için otomatik olarak çeşitli lock mekanizmaları kullanırlar.Bu locklar 3 kategori altında incelenir.

DML locks (veri lockları) :DML lockları veriyi korurlar.Mesela tablo lockları tablonun hepsini,satır lockları ise seçilen satırı korurlar.

DDL locks(dictionary lockları ) :Schema objectlerini korurlar.Mesela tablo tanımları gibi

Internal locks and latches :Datafile gibi Internal olan veritabanı nesnelerini korurlar.

Değerli eğitimcimizden 2 saatte kapabildiklerimi sizinle paylaşmaya çalıştım.Sizde değerli yorumlarınızla katkıda bulunursanız sevinirim.Uykusuz ve yazmak için yazılan bir moda yazıyorum.
Bunu bile zor yazdım.Sabah sabah Anıl Hanımı görmeseydim ve o tılsımlı günaydını işitmeseydim bunuda yazamayacaktım aslında.Bir insan bu kadar ilham kaynağı olabilir.Kendisini o kadar çalışkan ki kendimdeki tembellik cevherini keşfettim.Yoğun olması sebebiyle fazla muhabbetimiz olmadı ama bir keresinde bana “Ah sizin gibi geçliğim eyvah” diyerek sezenişte bulunmuştu.Aslında hani o içimizdeki dinamizm olarak bakarsak ben onun en az 10 yaş üstü gibi görünüyorum. Neyse ben daha fazla geyik yapmadan desteklerinden dolayı Tonguç Abimize ve değerli Anıl Ablamıza teşekkür ederek herkese iyi çalışmalar dileyeyim…

18 Temmuz 2008 Cuma

Statement Processing and CBO Part1-Part 2


Merhaba arkadaşlar;


Bu yazıda sizlere Statement Processing and CBO hakkında bilgiler vermeye çalışacağım. Bu konuda çok iyi olduğum söylenemez :) Fakat yapmış olduğum bazı araştırmaları sizlerle paylaşmak istedim. Faydalı olmasını umarak başlayalım isterseniz.

Statement Processing deney olay esasında 4 temel kısımdan oluşur. Şimdi önce bu 4 temel olayın ne olduğunu söyleyeyim, daha sonra da bunların açıklamalarına geçeyim: Aslında önce isim sonra açıklama yapmak da olabilir; ama öncelikle ismleri belirtirsem daha yi olacağını düşündüğüm için böyle bir yöntem izledim. İsteyen arkadaşlar burayı atlayarak direkt isim açıklama bölümünden başlayabilirler. Tamam tamam farkındayım çok uzattım. Hadi başlayalım madem. :)


4 Temel Kısım

- Parsing
- Opitimization
- Row-source generation
- Execution.

Yukarıda vermiş olduğum kısımları şimdi sıra ile inceleyelim isterseniz.


1- Parsing

Şimdi Parsing denen olaya girmeden önce orada kullanacağım bazı kelimelerin anlamlarını sizlerle paylaşayım. Paylaşayım ki sonra bu neydi diye bana sormayın :) Aslına bakarsanız amacım anlatımın estetiğini korumak. Ondan en başta anlatıyorum. Yoksa zamanı geldiğinde de değinebilirdim. Neyse gelelim bu kelimlelere…


Shared pool check :

Kısaca Shared pool, SQL komutlarının memory de bulundukları yer olarak tanımlayabiliriz. Bu SQL cümlecikleri shared pool'un library cache denilen bölümünde hayatlarını sürdürür.

Biraz toparlayayım. Bildiğiniz ya da bilmediğiniz gibi Parse olayı biraz maliyetli bir iştir. Bizim de bu maliyeti olabildiğince aşağıya çekmemiz lazım. Bu amaç doğrultusunda bize hizmet eden şey. Shared pool oluyor. Şimdi bu adam bu kutsal hizmeti nasıl yapıyor bir de ona bakalım isterseniz. Parse edilen bir SQL komutu burada bir süre saklıyor. İlerleyen zamanda aynı komutu çalıştırmaya kalktığımızda bu komutun daha önce pars edildiğini fark ediyor ve tekrar pars edilmesinin önüne geçiyor. Ve bize ciddi kazançlar sağlıyor. Ya da bunun gibi bişey :)

Şimdi pars olayına geçelim. Pars olayı esasında şöyledir arkadaşlar :

SQL de yazdığımız cümleciklerin Oracle'ın anlayacağı dile çevrilmesi olayıdır. Yani esasında Oracle bizim SQL de yazdıklarımızın ne demek olduğunu anlamıyor. Anlayabilmek için bir şekilde kendi diline çevrilmesi gerekiyor. İşte bu çevrilme olayının yapıldığı duruma Parsing deniyor. Şimdi bu olay nasıl gerçekleşiyor ona bi bakalım. Bunu maddeler halinde sıralayalım.

* Öncelikle cümle parçalara ayrılıyor.

* Sonra ne tip bir operasyon olduğu belirleniyor.

* Daha sonra gerçekten geçerli ve anlamlı bir komut olup olmadığı tespit ediliyor. (syntactic ve semantic analizi yapılıyor)

* SQL cümleciğnin anlamlı olduğuna karar verilince sıra shared pool check'e geliyor. (Ne demek olduğunu yukarda anlattım :) ) Burada SQL cümleciği hem text, hem de işlev olarak tamamen aynı olup olmadığına dair bir kontrol gerçekleşir. Eğer SQL cümlemiz bu kontrolü geçemezse Optimization ve row source generation kısımlarına uğraması kendisine anlayacağı bir dille beyan edilir. Bu kısımlar ne demek mi? Biraz sabırlıolursanız anlatacam :)



2- Optimization

Burada da önce aşağıda kullanacağımız bir takım ifadeleri açıklamak istiyorum. Eee bu da benim tarzım. :) Herkesin yoğurt yiyişi farklı ne de olsa. :)


Rule Based Optimizer(RBO):

Bu vatandaş biraz kuralcı takılıyor. :) Kurala dayalı bir optimizer yani. Bu vatandaşın başlangıçta bir takım kuralları var. Bu kurallar çerçevesinde execution plan'ı belirliyor. Yalnız bu vatandaşın kuralları çok katı olduğundan ve bunun sonucunda bir takımı sıkıntıları olduğundan dolayı Oracle artık bunu kullanmıyor. Sıkıntıları ne diye soracak olursanız şu şekilde belirteyim. İndex i görünce vatandaş dayanamıyor ve duruyor. Be kardeşim ne duruyon. Tamam index kullanmak genel olarak avantajlı; fakat Her zaman index kullanmak avantajlı değil, bazen table da full scan yapmak daha makbul diyor kullanıcı ama dinlemiyor. Bunun üzerine Kullanıcı kızıyor ve sen sana söylediğimi yapsana diyor ama nafile. Adam dinlemiyor. Bunun üzerine kullanıcı vatandaşı büyük patron Oracle’a şikayet ediyor. Oracle da “Sen benim kullanıcımın dediğini yapmazsan sana ne hacet.” diyerek resti çekiyor. Ve bizim vatandaş böylece işinden oluyor. :)


Hint:

Hint i zor kullanmak ve “ben ne diyorsam o.” Demek ile eş anlamlı olarak görebiliriz. Zaten öyle de. Diyelim ki Oracle da birşeyler yapmak istiyoruz; fakat bazı prosedürler buna izin vermiyor. Ama o olayı mutlaka yaptırmamız gerekiyorsa o zaman devreye bizim hint giriyor ve konuya müdahale ediyor. Oracle başta direnir gibi yapıyor ama bizim eleman “ Kardeşim konuşma da sana söyleneni yap. Biz ne yaptığımızı biliyoruz. Senden ne isteniyorsa onu yap.” diyor. Tabi emir demiri keser hesabı sonuçta istediğimizi oracle a kabul ettiriyoruz. :) Yani oracle güzellikten anlamadığı zaman bazen böyle şeyler olması iyi oluyor dimi arkadaşlar :) Fakat yine de olayları şiddet kullanmadan halletmemiz önerildiği için çok zor durumlarda kalmadığımız sürece bu yöntemi kullanmazsak iyi olur. Çünkü burada her şeyden sen sorumlu oluyorsun. Ama diyorsanız ki hint olmadan bu işten çıkamam. O zaman yapacak bir şey yok. Yalanın bile mübah olduğu durumlar var.:)


Cost Based Optimizer(CBO):

Bu eleman tamamen maliyete dayalı bir mantık ile hareket eder. Adamın çalışma mantığı şu şekilde:

Tablo üzerinde daha önce toplanmış bazı istatistiklerden yararlanarak, istenen sorgu için maliyet çıkarır ve içlerinden en az maliyete sahip olan execution plan'ı seçer. Burada bu olay tamamen tahmin den ibarettir. Öyle ki aynı sorguyu farklı zamanlarda çalıştırdığında bile farklı sonuçlar verebilir. Yani eleman anlık düşünüyor ve ana göre hareket ediyor. :) Her ne kadar tahmin üzerinden iş yapsa bile istatistikleri sürekli güncel olduğundan dolayı yanılma payı çok azdır. Hal böyle olunca sözüne büyük ölçüde güvenilebilir. Fakat çok az yanıldığı her zaman doğru sonuçlar vereceği anlamına gelmez. Bu durumda da sorgu içerisinde hint vererek “Kardeşim ben ne yaptığımı biliyorum sen ne diyorsam onu yap.” diyip dediğimizi yaptırtabiliriz. O da hay hay sen nasıl istersen der ve dediğimizi yapar. Yani RBO gibi asilik yapmaz. :)

Bir de şöyle bir durum var. CBO süresi düşük olunca her zaman cevap süresi de kısa olacak diye bir kaide yok. Bazı durumlarda CBO süresi oldukça kısa olmasına rağmen cevap süresi oldukça uzun olabilir.

Şimdilik bu kadar açıklama yeter. Gelelim bizim optimizer dediğimiz elemanın ne iş yaptığına ve bunu nasıl yaptığına.

Optimization, bir SQL cümleciğinin nasıl çalışması gerektiğine karar veren elemandır. Sorgunun optimize edilmesini, en iyi şekilde nasıl çalışacağını belirleyen ve execution plan'ının oluşturulması olayıdır. Yukarda da değindiğim gibi şu anda sadece CBO kullanılıyor. RBO laf dinlemediği için artık Oracle ile çalışmıyor. :)


3- Row source generation:

Execution Plan'ın Oracle'ın anlayacağı şekle çevrilmesi ve özel data structure'ına dönüştürülmesidir. Bu aşama artık son aşama olup sorgu sonucunun kullanıcıya ulaştığı aşamadır.



4- Execution:

Bütün bu işlemlerden sonra execution gelir. Execution kesinlikle var olan bir adımdır. Execution asla ve asla es geçilemez. Çalıştırılan SQL bir DDL ise veya veriyi güncelleyen bir SQL ise ( update, insert delete ) execution adımı operasyonun son adımıdır.

Query ise (select) bir sonraki adım fetch adımıdır. Burada parse edilen komutlar kullanıcıya döner.



GÜN İLE İLGİLİ ÖNEMLİ NOKTALAR

"Eveeet. Nihayet bitti." dediğinizi duyar gibiyim. Ama daha bitmedi. Tonguç abi nin söylediği bazı önemli noktaları yukarıda yazmadım. Onlar önemli ve özel oldukları için ayrıca yazmakta fayda olacağını düşündüm ve burada onları yazmaya karar verdim. Onlar da bittikten sonra daha da bir şey yok. :)


* Pars için ayrılan süre olabildiğince kısa tutulması büyük uygulamalar için oldukça önemlidir.

* Bir tablodan az miktarda bilgiyi kullacaksak tablonun tamamını çekmemek gerekir.

* Az olan bilgiye ulaşmak için index kullanmak oldukça avantaj sağlarken tablonun tamamı için paralel kullanılmalıdır.

* Bir SQL in nasıl çalışması gerektiğine karar veren yapı OPTIMIZER’dir.

* Hint kullanmak çok fazla önerilmez. Fakat çok zor durumlarda kullanılması avantaj sağlayabilir.

* Bir sistemde ne kadar az kaynak (disk, bellek, network…vs ) kullanılırsa cevap süresi bir o kadar daha kısalır.

* Primary key indexlenen kolon bilgilerinin yanı sıra RowID leri de tutar.

* DDL(Data Definition Language) : "Data Dictionary" üzerinde değişikliğe sebep olan create, drop, alter gibi işlemlerdir.

* DML(Data Manipulation Language) : Veriye ulaşmak ya da değiştirmek amacıyla yapılan işlemlerdir.(Select, update,delete vs.)

* “Selectivity” ; bir satır kümesinin parçası anlamına gelir.Örneğin “all_objects” tablosunda “… where object_type = ‘TABLE’” koşulu için dönen satırlar “selectivity” kavramını karşılar. [0-1] arası değer alır.”0” ın anlamı satır kümesinden hiç satır dönmemesi, “1” de satır kümesindeki tüm satırların dönmesi olarak yorumlanır.


* Oracle da en fazla iki tablo join edilebilir.

* SGA(system Global Area), içersinde veri barındıran bir grup paylaşımlı bellek yapısı(shared memory structure) ve Oracle veritabanı “instance”’ı hakkında kontrol bilgileri taşıyan bellek
kısmıdır.




Not: Arkadaşlar ben ilk yazımı yazarken iki günü tek yazı halinde yazdım. Bir de baktımki ayı bir part olarak yazılacakmış o. :) Buradan kesip ayrı bir yazıymış gibi yazmak yerine durumu izah edeyim dedim. Part 1 ve Part 2 burada sizlere sunulmuş durumda.



GERÇEKTEN THE END :)

Oracle Utilities

Introduction to Oracle Utilities
Oracle Utilities’e Giriş:

Oracle's database utilities şunları sağlar:

Data ve metadatanın Data Pump Export and Import kullanarak bir databaseden başka yere yüksek hızda taşınmasını sağlar.

Extract and manipulate, database objeleri için metadatanın representation’larını Metadata API kullanarak tamamlar.

Data ve metadatanın hepsini ya da bir kısmını Data Pump API kullanarak bir database’den diğerine taşır.

SQL*Loader kullanarak operating system dosyalarından ya da external tablolarını kullanarak external sources’tan oracle tablolarına veri yükler.

Redo log dosyalarını, LogMiner’lı SQL arayüzüne sorgular.

DBDATAFY ile data-dosyasında ya da bir çevrimdışı (ör: backup) database’de fiziksel data yapısını bütünlük kontrollerini icra eder.

DBNEWID yardımcı programını kullanarak, bir işlemsel database için database adı (DBNAME) ve dahili database tanıtıcısını (DBID) sağlar.

Overview of Data Pump Export and Import
Oracle Data Pump teknolojisi, databaseden başka bir database’e data ve metadataların çok hızlı taşınmasını etkinleştirir. Bu teknoloji, Oracle’ın data taşımasının temelidir (Data Pump Export and Data Pump Import).
Data Pump, data ve metadataların alt kümesinin hareket edip etmemesi gerektiğini belirtmenizi sağlar.
Bu, Export ve Import parametreleri boyunca uygulanan data filtreleri ve metadatalar filtreleri kullanılarak yapılır.


Data Pump Export
Data Pump Export ‘dump file set’ denilen işletim sistem dosyalarının bir kesinine data ve metadatalerın unload olması için bir yardımcı programdır. ‘Dump file set’, Data Pump Import yardımcı programıyla başka bir sisteme taşınabilir ve tarafından yüklenebilir.
Dump file kümesi; table data, database object metadata, and control information içeren bir ya da daha fazla disk dosyasının oluşumudur.
Dosyalar sadece Data Pump Importla okunabilen binary formatta yazılır. Import işi sırasında Data Pump Import, bu dosyaları dump file içindeki her database nesnesini yerleştirmek için kullanır.


Data Pump Import
Data Pump Import, export dump dosyalarının hedef sisteme yüklemeye yarayan programdır. The dump file; table data, database object metadata, and control information içeren bir veya daha fazla disk için hazırlanır. Dosyalar, binary formatta yazılır.


Overview of the Data Pump API
Data Pump API'SI, başka bire bir databaseden bir site için data ve metadatalerin bir bölümünü ya da bütünü taşımak için bir çok hızlı bir mekanizma sağlar. Data Pump API'SIni kullanmak için, sen DBMS DATAPUMP PL-SQL paketinde sağlanmış procedure’ler kullanılır. Data Pump Export'si ve Data Pump Import işlemleri, Data Pump API'SInde bulunur.

Overview of the Metadata API
Meta dataler uygulama programlama arayüzü (API) şunları sağlar:

Object's meta data tiplerine XML olarak erişilir.

XML in çevrilmesinin çeşitli yolları vardır bunların bir tanesi de SQL in kullandığı DLL dosyalarıyla gerçekleşir.

Meta datalar API'SIni kullanmak için, DBMS_METADATA PL/SQL paketinde sağlanmış procedureler kullanılır. Databasedeki her entitiy, Meta datalar API'SInin amaçları için, object type’ına ait olan object gibi şekillendirilir. Örneğin, scott.emp tablosu objecttir ve object type’ı TABLE'dır. Bir object'nin metadatalarını fetch edildiğinde, object type’ını belirtmelisiniz.

17 Temmuz 2008 Perşembe

Introduction to Java Enterprise Edition

Java konusundaki ilk sunumumuz olan Introduction to Java Enterprise Edition konusunda izlenimlerimi ve araştırmalarımı paylaşmak adına bu bloğu yazmak istedim.

Temel bir bakış açısıyla meseleyi değerlendirmek gerekirse, bir uygulamayı yazmadan önce o uygulamanın bütün ayrıntılarını ve planlamasını yapmak şüphesiz ki en önemli adımlardan birisini oluşturmaktadır.Javaya bir nevi giriş seviyesinde olan bu paylaşımı özellikle bu konuya dikkat çekmek isteyerek başlamak istedim.

Dünya üzerinde geçerli olan bir diğer önemli faktörse ihtiyaç analizidir.Birçok konuda geçerli olan bu faktör yazılım dünyasının de varoluş ve sürdürebilirlik nedenini oluşturmaktadır.Bu açıdan bu konuda ilerlemek ve büyük işler yapmak istiyorsak mutlaka ihtiyaçların karşılanma derecesini önplanda tutmamız çok önemlidir.

Diyelim ki bütün ayrıntıları hesapladık,planlamamızı yaptık ve gördük ki üzerinde çalışmak istediğimiz uygulama ihtiyaç duyulan bir uygulama kapsamına da giriyor.Bu aşamalardan sonra sözkonusu uygulamayı yazıp piyasa sürmekle işimizin bittiğini düşünüyorsunuz öyle değil mi?Gerçekçi olmak gerekirse asıl iş bundan sonra başlıyor ve bu sürecin çok iyi kontrol edilmesi ve soruna acil çözüm mekanizmaları oluşturulması gerekiyor.Bu kapsamda en fazla karşılaşılan sorunların başında uygulama yazma esnasında çok katmanlı mimariyi kullanmamak geliyor.Bu durum ise modüler çalışmayı sağlamadığından programın bütününde hataları düzeltmek hem zaman anlamında hem de maddi anlamda çok büyük kayıplar yaşatıyor.Ama çok katmanlı mimari yapısını kullanmak bu sorunları çözdüğü gibi,bunun yanında yazılımın çok yönlü ve sistemli geliştirilmesine de bir zemin hazırlamaktadır.

Bu uzun girişten sonra isterseniz ısınmak adına biraz javaya giriş yapalım... Ne dersiniz?

Javanın çalışma mantığından kısaca bahsedelim:

Yazmış olduğunuz java kodu derlendikten sonra bytecode'a çevrilir.Daha sonra JRE(Java Runtime Environment) tarafından sunulan JVM(Java Virtual Machine) vasıtasıyla o anda kullanılan bilgisayarın çalışma mantığına uygun bir yapıya dönüştürülür.Java, platformdan bağımsızdır denilen olayı aslında oluşturan asıl sebep budur.Daha açık bir ifade ile, yazılan kodlar makine üzerinde değil,makinede kurulu olan JVM tarafından çalıştırılır.

Derlenen java kodlarının bytecode çevrilerek JRE ortamına aktarıldığını söylemiştik.Demek ki öncelikle yapmamız gereken şey makinemize bir JRE kurmaktır.
http://java.com/en/download/manual.jsp adresinden işletim sisteminize uygun olan JRE'yi yükleriz.Yükledikten sonra yüklendiği kontrol etmek için başlat->run->cmd yazdıktan sonra karşımıza geken komut satırına
java -version yazdığımızda versiyon bilgileri çıkıyorsa JRE yi doğru ve sorunsuz yüklemişiz demektir.

Buraya kadar yaptıklarımız javanın çalışma ortamının oluşturulması içindi.Daha sonraki aşama ise kodlarımızı derleyebilmek için complier yükleme aşaması... Java desteklediği özelliklere göre complierler 3 kısma ayırmıştır.Bunlara kısaca değinmek gerekirse:

J2ME(Java 2 Micro Edition): Mobil uygulamalar geliştirebilmemiz için vardırlar.Kullanılan fonksiyonlar ve özellikler mobil ortamlara göre sınırlandırılmıştır.

J2SE(Java 2 Standart Edition):
Standart java uygulamaları için kullanırlar.

J2EE(Java 2 Enterprise Edition): Yukarıda bahsedilen derleyicileri desteklemekle birlikte ek olarak çok katmanlı proje geliştirme,servlet,jsp gibi birçok özellikleri de kapsamaktadır.

Çalışmalarımızın çeşitine göre istediğimizi kullanabiliriz ama elbetteki j2EE yi kullanmak ekstra uygulamalar geliştirmelerde avantaj sağlayacağı için şahsen ben bu derleyiciyi kullanmayı tercih ediyorum.

Şimdi sıra geldi J2EE yi yüklemeye... http://java.sun.com/javaee/downloads/index.jsp adresinden ister standart halini isterseniz ek bileşenleriyle birlikteki halini yükleyebilirsiniz
.

Biliyorum bir kodu çalıştırmak için bu kadar mı uğraşılır, daha bitmedi mi diye düşünebilirsiniz ama javanın güzelliklerini ve anavtajlarını da sağlayan bu ek özellikler olduğu için insan javanın bu presedürlerine katlanıyor :) Geldik son adıma...Yazdığımız kodları notepad ile derlerim ben diyen yoksa bir IDE (Integrated Development Environment) edinmemiz gerekiyor.Netbeans,Eclipse..vb çok fazla IDE mevcuttur,ama ben Eclipse kullanıyorum.İnternet üzerinden http://www.eclipse.org/downloads/ adresinden yükleyebilirsiniz.

Eclipse yükledikten sonraki aşamadan biraz bahsetmek gerekirse:

Yukarıdaki adresten yüklediğimiz dosya zip halinde inecektir.Bu dosyayı extract ettikten sonra direk eclipse.exe a tıklayarak programı çalıştırabilirsiniz.İlk çalışmada uygulamalarınızı kayıt edeceğiniz çalışma ortamını(workspace) soracaktır,burayı kendi isteğiniz doğrultusunda belirleyebilirsiniz.

Bu aşamadan sonra karşınıza Eclipse'nin karşılama ekranı çıkacaktır:


Öncelikle Eclipse'e yüklediğimiz JRE'yi tanıtmamız gerekiyor.Bunun için üst menüde bulunan Window-> Preferences a tıkladığınızda karşınıza gelen pencereden Java'ya tıklayın.Çıkan alt menüden Installed JREs kısmından Add diyerek yüklediğiniz dosyadaki JRE yi gösterin.

Karşınıza gelen ekrandan JRE Home kısmından browse ye tıklayarak yüklediğiniz JRE'yi seçiyoruz ve işlemi tamamlıyoruz.Böylece Eclipse in gerekli ayarlamalarını bitirdik.Şimdi sıra geldi Eclipse ile nasıl çalışacağımıza...

Üst menüden File->New Project dedikten ve karşımıza gelen pencerede projemize ismini yazdıktan sonra bir proje oluşturmuş oluyoruz.Javada paketsel çalışma büyük kolaylık sağladığı için şimdiden paketsel çalışmaya alışmamız açısından öncelikle bir paket oluşturalım.Oluşturduğumuz projenin hemen altında olan src ye sağ tıkladıktan sonra New->Package dediğimizde karşımıza gelen penreceden com.uygulama.test gibi makul bir paket ismi tanımlayıp işlemizi bitiyoruz.

Elbette ki daha sonra aşamamız oluşturduğumuz bu paketin içini doldurma aşaması...Oluşturduğunuz paketin üzerine sağ tıklayarak New->Class diyerek bir class tanımlayalım.Örneğin MerhabaDunya olsun...Ve olusturdugumuz sınıfa aşağıdaki kodları yazalım:

public class MerhabaDunya {
public static void main( String[] args)
{
System.out.println("Merhaba java dostu,seni burda görmek güzel...");
}


Sıra geldi kodumuzu çalıştırmaya... Çalıştırmak istediğimiz uygulamanın üzerine sağ tıkladıktan sonra Run As'e gelerek Java Application ile çalıştırabilirsiniz.Alt+Shift+X e bastıktan sonra elinizi çekip J tuşuna basarsanız da aynı işlemi yapmış olursunuz.

Bu giriş kısmından sonra isterseniz bir Dynamic Web Project üzerine bir çalışma yapalım:

Öncelikle bir ear oluşturalım.Ear, enterprise application project uygulamalarında kullanılan, açılımı erterprise application archive olan bir arşivdir.

File->New->Project->J2EE->Enterprise Application Project i seçip next diyoruz.Proje ismimizi SampleEAR olarak belirleyelim.Target Runtime da eğer seçili serveriniz yoksa bir server oluşturmamız gerekiyor.


Server olarak JBoss4.2 kullandım ve
http://www.jboss.org/downloading/ projectId=jbossas&url=http://sourceforge.net/project/showfiles.php?group_id=22866&package_id=16942&release_id=548923 adresinden bilgisayarıma yükledim.

Şimdi kaldığımız yerden devam edebiliriz, Target Runtime ın yanında olan new butonuna tıklayarak JBoss4.2v i seçip browse den yukarıdaki linkten yüklediğimiz dosyayı seçip tamam a tıklıyoruz,next e tıklıyoruz.Sadece Generate Deployment Descriptor kısmını işaretleyip finish e tıklıyoruz.Ve böylece ear ımızı oluşturmuş oluyoruz.

Şimdi sıra geldi, EJB uygulamamızı oluşturmaya... EJB, Enterprise Java Beans in kısaltmasıdır.Genel olarak tarif etmek gerekirse EJB,tüm uygulama sunucularında çalışabilen bir bileşen modeldir.Daha net ifade etmek gerekirse veritabanı ile sunum katmanının arasındaki alandır,yani business katman da denilebilir.

Ctrl + N -> EJB -> EJB Project e gelip SampleEJB ismini verip Add project to an EAR ı tikleyip next diyoruz.

Karşımıza gelen pencereden EJB Module ve Java kısmını tikleyip next deyip,bir sonraki adımı da geçerek uygulamamızı oluşturuyoruz.

Sonunda sunum katmanına gelebildik :) Şimdi Dynamic Web Project imizi oluşturacağız.

Ctrl + N -> Web -> Dynamic Web Project i seçerek projemizin ismini SampleWAR olarak tanımlıyoruz.En altta bulunan add to project to an EAR kısmını tikleyip next diyoruz.Karşımıza gelen pencereden java,Dynamic Web Module kısımlarını seçip projemizi oluşturuyoruz.Bu projemiz bir kenarda dursun...

Oluşturduğumuz EJB ye işlerlik kazandırmak ve business katmanında istediklerimizi yaptırmak adına SampleEJB içinde RemoteBusinessInterface adında bir interface oluşturuyoruz ve paketimizi sampleear olarak tanımlıyoruz.

Oluşturulan interface in kodlarını ekte bulabilirsiniz.

İnterface ve beanimizi oluşturduktan sonra SampleWAR uygulamamızın üzerine gelip index.jsp adında bir jsp sayfası oluşturuyoruz.index.jsp nin kodlarını ekte bulabilirsiniz.

Şimdiki adım ise servlet... Servlet,web bağlantılarının sunucu tarafında çalışabilen küçük programlardır diyebiliriz.Servlet sayesinde sunucunun kabiliyetlerini oldukça arttırma imkanına sahibiz.Kısacası servlet ler işin sunum katmanında bulunan bir basamaktır diyebiliriz.

SimpleWAR projesinden new->Servlet diyerek MyServlet adında bir servlet oluşturalım.Oluştururken paketimizi sampleear olarak yazmayı unutmamalıyız.İsmi tanımladıktan sonra next diyoruz.Create Servlet kısmında istersek URL Mapping kısmını edit e tıklayarak istediğimiz şekilde değiştirebilirsiniz,ben /sayHello olarak değiştirdim.Ve Servlet imizi finish e tıklayarak oluşturuyoruz.Oluşturulan MyServlet.java kodlarını ekte bulabilirsiniz.

Ve son olarak SimpleWAR uygulamamızın üzerine gelip Run As->Run on Server diyerek uygulamamızı çalıştırıyoruz.

Dynamic Web Project konusunda örneğimizi de sizinle paylaştıktan sonra kaldığımız yerden devam edelim...Bütün bu yapılanlardan sonra bazı çıkarımlarım oldu,isterseniz sizlerle bunları paylaşmak istiyorum:

*İnterface in javada gerçekten çok önemli bir yeri olduğunu keşfettim.Çünkü,class ların kabiliyetlerini inanılmaz derecede arttırma yeteneklerine sahipler.

*Paket isimlerini ne olursa olsun yazmamız lazım.Çünkü küçük uygulamalarda bile birçok sorunla karşılaşıyorken geliştireceğiniz büyük uygulamalarda ne kadar büyük sorunlara yol açacağını siz düşünün..

*Yukarıda bahsetmedik ama fırsat bulmuşken burda bahsedelim.WEN.INF dosyasının altında bulunan web.xml dosyası uygulamamızın ayarlarını oluşturur.

*WebContent kısmına oluşturduğumuz web sayfalarını koymamız ve bu alışkanlığı kazanmamız standartsak çalışma için ve karmaşık bir çalışma metodundan uzaklaşmamız için çok faydalı olacaktır.

*@ gibi referans tanımlamaları bizi yeni nesne oluşturma işlemlerinden kurtarıyor.Bu servlet in bize sağladığı en güzel şeylerden birisi olarak görebiliriz..

*Biraz dikkatli bakarsak görebileceğimiz üzere,servlet ler tıpki bizim kontrol aracımız gibi davranır.Burda tanımlamalar yaparız ve bu tanımlara göre işlemlere servlet yön verir. Bu kadar uzun bir yazı olmasını beklemiyordum ama laf lafı açtı işte :) Umarım faydalı bir yazı olmaya aday bir yazı olmuştur.

Not: Yanlış veya eksik kısımlar varsa lütfen paylaşınız.

Kodları indirmek için tıklayınız : İndir