Menu

22 Aralık 2010 Çarşamba

JSF 2 Tutorial Dokuman

http://www.coreservlets.com/JSF-Tutorial/jsf2/


http://www.mkyong.com/tutorials/jsf-2-0-tutorials/

6 Aralık 2010 Pazartesi

Sinav Dokumanlari

http://examlab.tk/scjp6.html

http://scjptest.com/

http://osborne.onlineexpert.com/elearning/

http://emrahkocaman.blogspot.com/

http://www.javaprepare.com/quests/test.html

http://www.dumpsquestions.com/

25 Kasım 2010 Perşembe

Apache Digester Example

package dgstudent;

import java.util.ArrayList;
import java.util.List;

public class Academy {

    private List students;
    private List teachers;
    private String name;

    public Academy() {
        students = new ArrayList();
        teachers = new ArrayList();
    }

    public void addStudent(Student student) {
        students.add(student);
    }

    public void addTeacher(Teacher teacher) {
        teachers.add(teacher);
    }

    public List getStudents() {
        return students;
    }

    public void setStudents(List students) {
        this.students = students;
    }

    public List getTeachers() {
        return teachers;
    }

    public void setTeachers(List teachers) {
        this.teachers = teachers;
    }

    public String getName() {
        return name;
    }

    public void setName(String newName) {
        name = newName;
    }
}



package dgstudent;

public class Course {

    private String id;
    private String name;

    public Course() {
    }

    public String getId() {
        return id;
    }

    public void setId(String id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}


package dgstudent;

import java.util.ArrayList;
import java.util.List;

public class Student {

    private List courses;
    private String name;
    private String division;

    public Student() {
        courses = new ArrayList();
    }

    public void addCourse(Course course) {
        courses.add(course);
    }

    public String getName() {
        return name;
    }

    public void setName(String newName) {
        name = newName;
    }

    public String getDivision() {
        return division;
    }

    public void setDivision(String newDivision) {
        division = newDivision;
    }

    public List getCourses() {
        return courses;
    }

    public void setCourses(List courses) {
        this.courses = courses;
    }
}



package dgstudent;

import java.util.ArrayList;
import java.util.List;

public class Teacher {

    private String name;
    private List certifications;

    public Teacher() {
        certifications = new ArrayList();
    }

    public void addCertification(String certification) {
        certifications.add(certification);
    }

    public String getName() {
        return name;
    }

    public void setName(String newName) {
        name = newName;
    }

    public List getCertifications() {
        return certifications;
    }

    public void setCertifications(List certifications) {
        this.certifications = certifications;
    }
}

package dgstudent;

import java.net.URL;
import java.util.List;
import org.apache.commons.digester.Digester;
import org.apache.commons.digester.xmlrules.DigesterLoader;

public class DigestXMLJavaAcademy {

    public void digest() {
        try {
            //Create Digester using rules defined in academyRules.xml
            URL rules = DigestXMLJavaAcademy.class.getResource("./academy-rules.xml");
            Digester digester = DigesterLoader.createDigester(rules);
            //Parse academy.xml using the Digester to get an instance of Academy
            Academy a = (Academy) digester.parse(DigestXMLJavaAcademy.class.getResourceAsStream("./academy.xml"));

            List vStudents = a.getStudents();
            List vTeachers = a.getTeachers();
           
            for(Student s : vStudents){
                System.out.println(s.getCourses().get(0).getName());
            }


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        DigestXMLJavaAcademy xmlDigest = new DigestXMLJavaAcademy();
        xmlDigest.digest();
    }
}








25 Ekim 2010 Pazartesi

Oracle BI linkler

http://www.gtech.com.tr/demo.aspx

http://www.iszekam.net/

18 Ekim 2010 Pazartesi

Apex 11gr2 Baslatmak

http://oraclue.com/2009/02/17/apex-in-11g-database/

http://iniu.net/content/apex-installation-and-configuration-oracle-database-11g

http://www.gokhanatil.com/2009/01/oracle-10g-veritabanina-apex-31-kurulumu/

4 Ekim 2010 Pazartesi

rman connection authorization


 Logged on to the box with a local user that is a member of both the
local Administrators group and the local ora_dba group.

Connection to db with sqlplus, using local credentials, is quite happy:


C:\TEMP>sqlplus "/ as sysdba"

SQL*Plus: Release 10.2.0.1.0 - Production on Tue Jun 13 12:23:12 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.

Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production

But connecting to rman requires me to spell it out ...


C:\TEMP>rman target / nocatalog


Recovery Manager: Release 10.2.0.1.0 - Production on Tue Jun 13

12:23:26 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.


RMAN-00571: ========================

RMAN-00569: ==== ERROR MESSAGE STACK FOLLOWS ====
RMAN-00571: ======================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04005: error from target database:
ORA-01031: insufficient privileges

C:\Documents and Settings\1oraadmin>rman target sys/*********

Recovery Manager: Release 10.2.0.1.0 - Production on Tue Jun 13
12:50:38 2006
Copyright (c) 1982, 2005, Oracle. All rights reserved.
connected to target database: EPSREP (DBID=2061389341)
RMAN> quit
Recovery Manager complete.

So, what am I overlooking? I've never before had a problem with "rman

target / nocatalog"

Where did you get NOCATALOG?


just: rman target / will get you in.

--
Daniel A. Morgan
University of Washington
damorgan@xxxxxxxxxxxxxxxx
(replace x with u to respond)
Puget Sound Oracle Users Group
www.psoug.org

Well, this just gets more curious ..


Microsoft Windows [Version 5.2.3790]

(C) Copyright 1985-2003 Microsoft Corp.

C:\Documents and Settings\1oraadmin>sqlplus "/ as sysdba"


SQL*Plus: Release 10.2.0.1.0 - Production on Thu Jun 15 08:21:33 2006


Copyright (c) 1982, 2005, Oracle. All rights reserved.



Connected to:

Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options

SQL> exit


=== so, things are correctly set up for connecting with local sysdba

credentials

Disconnected from Oracle Database 10g Enterprise Edition Release

10.2.0.1.0 - Pr
oduction
With the Partitioning, OLAP and Data Mining options

C:\Documents and Settings\1oraadmin>rman target /


Recovery Manager: Release 10.2.0.1.0 - Production on Thu Jun 15

08:23:41 2006

Copyright (c) 1982, 2005, Oracle. All rights reserved.


RMAN-00571: ===========================================================

RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-00554: initialization of internal recovery manager package failed
RMAN-04005: error from target database:
ORA-01031: insufficient privileges

C:\Documents and Settings\1oraadmin>


but rman doesn't like it.


For the record, Oracle support finally came up with a solution, but it

raises still more questions. The box had two Oracle homes on it, one
for a single 10g datbase and one for the 10g oem agent. In the PATH
environment variable, the agent home preceeded the db home. Flipping
that -- putting the db home first -- solved the problem and allowed
'c:\rman / target' to connect as it is supposed to. Of course, that
raises the question of why path ordering should matter in this
particular issue ....

Must be something in that home that is different... maybe it couldn't

find the correct $ORACLE_HOME/dbs/passwd... ?

28 Eylül 2010 Salı

Transactions


Transaction’ın kelime anlamı işlem, iş görmedir. Yani veri bloğuna yapılan işlemdir diyebiliriz. Bir grup DML deyiminin session tarafından execute edilmesidir.
Update, Delete, Insert,  Merge, Select For Update, Lock Table deyimlerinden biri ile başlar. Commit ya da rollback ile biter.
‘A’ (Atomicity): Bir tansactionın ya tamamen olması ya da  hiçbir işlemin yapılmamasıdır. Örneğin bankamatikten bir işlem yapan bir kişinin elektrilerin kesilmesi, cihazın bozulması vb durumlar ile yarıda kesilmiş bir işlem karşısında yaptığı işlemlerin hepsi rollback edilerek başlangıç durumuna geri döndürülmesi olayıdır.
                            Sağlıklı bir transaction
                                                Yarıda kesilen bir transaction

‘C’ (Concurency): Veri tabanı tutarlı veri sağlar.
‘I’ (Isolation) : Veritabanına birden fazla kullanıcı erişebilir. Birinin yaptığı işlemi diğerinin yaptığı işlem etkilemez.

 Yukarıdaki örnekte A kişisi Mehmet’in salary bilgisini 500, b kişisi ise Ahmet’in salary bilgisini 300 olarak update işlemi yapıyor. Ama select ettiklerinde sadece kendi değişikliklerini görebiliyorlar çünkü henüz ikisi de commit işlemi yapıp transactionı bitirmediler.


Commit yaptıklarında yani transactionı bitirdiklerinde ise her iki değişikliği de görebilirler.
‘D’ (Durability): Commit edilen işlemlerin veritabanına işlendiğinden emin olunmasıdır.
Transaction Kontrol Deyimleri
       COMMIT : Unique system change number (SCN) atanır. Log writer process (LGWR), SGA’s redo log bufferları redo log file’lara yazar. Oracle rowlarda tutulan kilitleri serbest bırakır. Transactionı bitirir.
       ROLLBACK : Yapılanları geri alır. Rowlarda tutulan kilitleri serbest bırakır. Transactionı bitirir.
       SAVEPOINT : Transaction içinde bir point (noktayı) işaretlemeni sağlar. Bir den çok point de işaretlenebilir.
       ROLLBACK TO : Herhangi bir durumda istenildiğinde işaretlenen pointlere geri dönülmesi sağlar.
       SET TRANSACTION : Transactionın isolation levelının vb belirlenmesini sağlar.
-          Isolation Level
-          Specifying UNDO Segment
Farklı Atomicity’ler
Statement-Level Atomicity : Oracle, Sybase and SQL Server’s ların aksi şekilde hareket eder. 
  
   1: create table t2 ( cnt int );
   2: insert into t2 values ( 0 );
   3: commit;
   1: create table t ( x int check ( x>0 ) );

   1: create trigger t_trigger
   2: before insert or delete on t for each row
   3: begin
   4:    if ( inserting ) then
   5:         update t2 set cnt = cnt +1;
   6:    else
   7:         update t2 set cnt = cnt -1;
   8:    end if;
   9:    dbms_output.put_line( 'I fired and updated '  ||
  10:                                    sql%rowcount || ' rows' );
  11: end;
   1: insert into t values (1);
   2: insert into t values(-1);
   3: select * from t2;


Yukarıdaki gibi check constraint’li bir t tablosu, içinde 0 değeri olan bir t2 tablosu ve insert ve deleteden önce tetiklenecek bir trigger yaratalım. T tablosuna aşağıdaki gibi insert işlemlerini yapmaya çalıştığımızda ilk insertin yapıldığı ikincinin ise yapılmadığı görülmektedir. Yani ilk işlem başarı ile gerçekleşmiş ama oracle tarafından commit işlemi yapılmış kullanıcıya bırakılmıştır, ikincisinde ise işlem başarısız olmuştur.

Başarılı olan işlemler için commit ya da rollback yapmaz. Kullanıcıya bırakır.
Procedure-Level Atomicity : Kullanıcı bir kod bloğunu çalıştırır. Oracle çevresine savepoint yerleştirir. 

   1: create or replace procedure p
   2: as
   3:  
   4: begin
   5:  
   6:         insert into t values ( 1 );
   7:  
   8:         insert into t values (-1 );
   9:  
  10: end;
  11:  
bir p procedure2u yaratalım ve çalıştıralım.

   1: select * from t;
   2: select * from t2;

sorgusu yaptığımızda görüldüğü gibi iki insertü de yapmamıştır. Çünkü ikinci insert hata verdiği için ardışık işlem kesintiye uğramış ve bu yüzden oracle procedure’un başına koyduğu savepointe geri dönmüştür. 

   1: begin
   2:  
   3:     savepoint sp;
   4:  
   5:     p;
   6:  
   7: exception
   8:  
   9:     when others then
  10:         null;
  11:  
  12:         rollback to sp;
  13:  
  14: end;
  15:  

   1: begin
   2:  p; 
   3: exception 
   4: when others then null; 
   5: end; 
   6: / 
   7:  
   8: I fired and updated 1 rows 
   9: I fired and updated 1 rows 
  10:  
  11: PL/SQL procedure successfully completed.
  12:  
  13: select * from t;
  14:  
  15: X
  16: ----------
  17: 1
  18:  
  19: select * from t2;
  20:  
  21: CNT
  22: ----------
  23: 1
  24:  
 
1. insert işlemi gerçekleşir, ikinci de hata oluştuğu için exception bloğuna düşer.
Immediate Constraints :
Sql deyimi bittikten sonra integrity constraints kontrolü yapılır. Aşağıdaki örnekte t tablosu yaratılmış ve 1, 2 değerleri insert edilmiş. Aşapıdaki update işlemi çalıştırıldığında eğer her satırda constraints kontrolüü olsaydı ikinci satırda hata alınırdı ama sql deyimi bittikten sonra kontrol yapıldığı için işlem gerçeklenmekte.


   1: create table t  ( x int unique );
   2:  
   3: insert into t values ( 1 );
   4:  
   5: insert into t values ( 2 );
   6:  
   7: update t set x = x+1;
   8:  
 
Kötü Transactionlar
-          Loop içinde cmmit işlemi yapmak.
-          Autocommit özelliğinin açık olması (default ). 

   1: INSERT INTO T SELECT OBJECT_NAME FROM ALL_OBJECTS;
   2:  
   3: COMMIT; 
   4:  
   5: FOR x in (SELECT * FROM ALL_OBJECTS )
   6:  
   7: LOOP
   8:  
   9:      INSERT INTO T VALUES ( x.object_name);
  10:  
  11:      COMMIT; 
  12:  
  13: END LOOP; 
  14:  
 
Distributed Transactions
Uzak sunucuda da değişiklik yapılıyorsa ya ikisinde de yapar ya da hiçbirinde yapmaz(Atomicity). 2PC protokolünü kullanır.
DDL’ler kendi içinde commit yapar, commit yapılamadığından DDL de yapılamaz.
DDL yapılmasının tek yolu DBMS.JOB ya da Oracle 10g, the scheduler packageile gelen DBMS_SCHEDULER kullanılarak uzaktan bir iş tanımlanır ve bu işlem ile commit yapılabilir.

Autonomous Transactions
Sadece loglama işlemlerinde kullanımalıdır.Transaction içinde transaction yaratarak, commit ve rollback değişikliklerini parent transactiondan bağımsız gerçekleştirir.


Yazan : Bahar Gezici
http://www.bahargezici.com/post/2010/07/28/Turkcell-Staj-e28093-Transactions.aspx

REDO & ROLLBACK 2

Yaptığımız işlemler ile ne kadar redo üretiyoruz?
Developer olarak yazdığımız kodun ne kadar redo ürettiği ile de ilgilenmeli ve bunu önemsemeliyiz. Çünkü ne kadar çok redo üretirsek kodumuzun yaptığı iş o kadar yavaşlar, performansı düşürür.
Insert, Update, Delete işlemlerinin satır sayısı ile redo üretimi ilişkisi aşağıdaki gibidir. Tabloyu inceleyeck olursak, Update ve Delete işlemlerinin 1 kerede 200 satırın işlem görmesi ile tektek işlem görmesi sırasında üretilen redo miktarı hemen hemen aynı. Ama Insert biraz daha farklı. 200 satırı data bloka yazarken farklı, tek tek yazarken farklı davranır. Bu sebep ile Tek bir satırda yaptığı işlem, satır satır yaptığı işleme göre daha az redo üretir. 
 Ayrıca loop içine commit eklersek  redo miktarı ciddi derecede artar ve 3 kat yavaşlar. 


Bu yüzden mümkün olduğunca az satırda işlemlerimizi yapmalı, commiti ise gerçekten ihtiyacımız olduğunda kullanmalı ve rollback yapmaktan kaçınmalıyız.
Trigger kullanıldığında ise, before trigger deyimi değerlerde bir değişiklik yapmamasına rağmen genellikle redo miktarını arttırmaya eğimlidir. Before ya da After trigger Delete redo miktarını etkilemez, Insert redo miktarı ise her ikisi için de aynıdır, Update redo miktarı ise before’dan etkilenir ama after’dan etkilenmez. 
Redo Log’ları devredışı bırakabilir miyim?
Redo Log’ları devredışı bırakamıyoruz. Çünkü database için redo loglar çok önemlidir. Ama bazı operasyonlar redo log miktarını azaltabilmektedir. Bazı sql deyimleri nologging özelliğini desteklemektedir. Ama bu loglamayı sıfırladığı anlamına gelmez. Normale göre daha az redo log üretilir.
Block CleanOut
Locklar block headerda yer almaktadır. Block’a bir sonraki erişimde header bilgisini yani transaction bilgisini silmemiz gerekebilir. Bu faaliyet redo üretir ve block’un kirlenmesine (dirty data) neden olur.

 Bir tablo yaratttık ve içine veriler ekledik, commit ettik.
 Önce redo_size(Kyte’ın kitabında oluşturduğu bir view)’ımıza bakıp datayı okuduk. Okuma sırasında oluşan redo miktarını aldık. Select sırasında üretilen redo miktarı yaklaşık 30KB. Bu da table full scan sırasında block headerların değiştiğini gösteriyor. İkinci kez run ettiğimizde;


Hiç redo üretilmediğini görmekteyiz, tüm data block headerlar temiz.
Eğer süreç
 Çok miktarda yeni datanın bluk loading ile database’e yüklenmesi
      - Yeni eklenen tüm datanın update edilmesi
      - Dataya sorgu yapılmasına izin verilmesi
     ‘den oluşuyorsa, bu durumdan ciddi anlamda etkilenirsiniz.
Dataya bir sorgu yaptığınızda, data ek processlere maruz kalabilir. Data update edildikten sonra istatistik toplatılması block headerların silinmesini sağlayacaktır.
Temporary Tables ve Redo/Rollback
Temprorary tables Oracle 8.1.5 ile gelmiştir. Bu bölümde sadece logging üzerindeki etkisinden söz edeceğim. Database Tables bir sonraki bölüm o kısımda daha ayrıntılı bahsedeceğimJ.
Temprorary tables data block’ları için redo oluşturmazlar. Yani bu tablo üzerinde yapılan bir değişiklik recoverable değildir. Ama Temprorary tables rollback yaparlar ve bu yüzden rollback loglanır. Bu yüzden az da olsa redo üretirler.
 İki tane tablo yaratalım; biri temprorary table diğeri normal table.
 Tablolar üzerinde birkaç sql yapan bir procedure yazdık. Ve sonuçları analiz ettik.
Normal tabloya yapılan Insert çok fazla redo üretir, temp tanlosu için ise nerdeyse üretmez. İnsert için sadece rollback datası loglanmıştır. 

Normal tabloya yapılan Update temp tabloyadaki redonun iki katı cıvarındadır. Temp tablosu için Update işleminin ilk (before) kısmı loglanırken sonraki(after) kısmı loglanmaz. Bu yüzden aradaki fark iki kattır.
Delete işleminde redo miktarları birbirlerine yakındır. Değişen blokların için yapılan redo az ama rollback için yapılan redo büyüktür. Bu yüzden normal tablo çok az daha fazla redo üretir.

  •      - Temp tablolarında Delete yerine Tuncate kullanılmalıdır.

  •      - Insert ve select işlemleri için daha çok temp tabloları kullanılmalıdır.

  • Set Transaction

  • SET TRANSACTION hangi rollback segmentini kullanmak istiyorsak onu seçmemize imkan sağlar.

  • SET TRANSACTION USE ROLLBACK SEGMENT rb_seg_name;


  • Özellikle çok büyük rollback segmentlerine ihtiyaç duyulduğunda ve tanımlanan rollback segmentinin kullanılacağı her transactionın başında çalıştırılmalıdır.

REDO & ROLLBACK

Günler çok çabuk geçerken sunumlar da artıyor ve ben bu yazı dizisinde kitabın 5. chapterına gelmiş bulunuyorum. Bu chapter DBA ile developer arası bir konudur. Bu chapterı iki makaleye böldüm, oldukça uzun ve önemli bir konu olduğunu düşünüyorum. Daha ayrıntılı bir aktarım için bu şekil daha iyi olacak sanırım.
Peki Redo nedir ?
Yapılan tüm transaction işlemlerinin kayıt haline alınmış halidir. Geri gönüş yapılmak istendiğinde redo ve rollbackten faydalanılabilir. Recovery amacı ile kullanılır. Transaction Logs olarak da adlandırılır. Rollback’e aynı zamanda Undo denilmektedir yani redo ve undo tamamen zıt şeylerdir.
İki tip redo log file yapısı vardır: Archived Redo Logs ve Online Redo Logs . Yapıları aynı, üstlendikleri görevler farklıdır.
Güç gittiğinde -> instance failure’a sebep olur. Online Redo Log ile recover edilir.
Disk sorunlarında -> Archived Log ve Online Redo Log’lar kullanılır.
Kaza –> kaza ile silinmemesi gereken bir object silindiyse vb durumlarda kazadan önceki zamana dönmek için kullanılır. Archived Redo Logs ve Online Redo Logs ‘dan yararlanılır.
Online Redo Log : Her oracle veritabanının en az 2 tane online redo logu vardır.
Archived redo Log: Online redo logların kopyasıdır.  Online redolog da yer kalmadığı zaman ARCH process tarafından başka bir locationa yazılır.
Commit ne yapar?
Commit transactionın boyutundan bağımsız, hızlı bir operasyondur.  Büyük transaction daha uzun sürede commit edilir diye bir şey yoktur. Dolayısı ile transactionı küçük parçalara bölmek işlem hızını arttırmaz. Bu yanlış bir düşüncedir.
Peki neden ?
Commit yapılmadan zaten database gerekli değişiklikleri arkaplanda yapmıştır.
-          Rollback segment kayıtları SGA’da oluşturulmuştur.
-          Değişen datablockler SGAda oluşturulmuştur.
-          Buffer redo oluşturlmuştur.
-          Yukarıdaki 3 işlemin büyüklüğüne bağlı olarak diske flush edilmiş olabilir.
-          Kilitler elde edilmiştir.
Commit yapıldıktan sonra
-          Unique system change number (SCN) atanır.
-       Log writer process (LGWR), SGA’s redo log bufferları redo log file’lara yazar.
-       Oracle rowlarda tutulan kilitleri serbest bırakır.
-       Transactionı bitirir. v$Transaction daki verimiz kaybolur.
SCN Ne İşe Yarar ?
-          Transactionları sıralar.
-          Hata sonrası sistem kurtarmayı sağlar
-          Tutarlı okumayı sağlar (read consistency)
-          Checkpointing
Bir insert, update vb.. yapıldığında sadece değişen kısmını alır.
Her commit sırasında I/O işlemi yapılır. 3sn de bir commit edilmese bile redo log file’lara yazılır. Asıl uzun süren bu I/O işlemidir. Redolog bufferın sizeına da bakılmalı, eğer dolmuşsa 3 snden az bir süre içinde de yazılabilir.  I/O işlemi olduğundan configurasyona göre değişir.
Batch işlem yapılıyorsa blok olarak data alınmalı, insert edilmeli,daha sonra commit edilmeli. Database crash olması ihtimaline karşı nerde kalındığını bilmek için bir kolonda işlendi işlenmedi bilgisi tutulabilir.
Rollback Ne Yapar?
Rollback yapılmadan zaten database gerekli değişiklikleri arkaplanda yapmıştır.
-          Rollback segment kayıtları SGA’da oluşturulmuştur.
-          Değişen datablockler SGAda oluşturulmuştur.
-          Buffer redo oluşturlmuştur.
-          Yukarıdaki 3 işlemin büyüklüğüne bağlı olarak diske flush edilmiş olabilir.
-          Kilitler elde edilmiştir.
Rollback yapıldıktan sonra
-          Rollback segmentindeki data okunur.
-          Yapılan işlemin tersi yapılır (insert edildiyse,delete işlemi vb..)
-          Kilitler serbest bırakılır.
-          Bütün değişiklikler geri alınmış olur.
Rollback işlemi biraz daha farklı ve maliyetlidir.