Merhaba arkadaşlar,

Daha önce burada bahsetmiştim ama bir soru içinde birden fazla soru sormak yasak olduğu için bu başlıkta soruyorum. Hibernate ile 1.5 dakika süren bir select'im var. Halbuki aynı select'i TOAD ile uyguladığımda 7 sn sürüyor. Select'i gizlilik gereği paylaşamıyorum. Ama anlatabilirim; 7 tablodan veri getiriyor ve çektiğim select'in içinde 5 tane daha select var. Selectception durumu yani.

Örnek Hibernate kodumu yazıyorum. Beki createSQLQuery'mi beğenmezsini. Belki başka yöntem söylersiniz ve select işlemimin zamanı kısalır.

Bu veri tabanı işlemi yapan class'ımın şuna benziyor;

   import org.hibernate.Query;
import org.hibernate.type.DateType;
import org.hibernate.type.IntegerType;
import org.hibernate.type.StringType;

public class SonucDonder extends HibernateDaoSupport {

public List<SelectimdenDonenVerilerIcinModelSinifi> getSelect(){

    List<SelectimdenDonenVerilerIcinModelSinifi> selectList = new ArrayList<SelectimdenDonenVerilerIcinModelSinifi>();

        Query query = getSession()
            .createSQLQuery("select ve icinde bir cok select daha")
            .addScalar("id", StringType.INSTANCE)
            .addScalar("date", DateType.INSTANCE)
            .addScalar("numara", IntegerType.INSTANCE)
            .addScalar("bir selctden donen bir sonuc", StringType.INSTANCE)
            .addScalar("baska bir selectden donen baska bir sonuc", StringType.INSTANCE)
            .addScalar("baska sonuc", StringType.INSTANCE)
            .setResultTransformer(Transformers.aliasToBean(SelectimdenDonenVerilerIcinModelSinifi.class));

            return selectList = query.list();
    }
}

Buda session için extend ettiğim support sınıfım;

public abstract class HibernateDaoSupport {

    @Autowired
    private SessionFactory sessionFactory;

    protected Session getSession() {
        // Kesinlikle yeni instance almaz.
        System.err.println("HIBERNATE SUPPORT SESSION FACTORY HASHCODE= " + sessionFactory.hashCode());
        return sessionFactory.getCurrentSession();
    }

}

Durum bundan ibaret hibernate'in select işleminin uzun sürdüğünden eminim log'lar ile test ettim. Bu işlemi kısaltmak için önerdiğiniz yöntemler var mı? Şunu değiş acayip hızlanacak dediğiniz her öneriye açığım. :)

soruldu: 30 Kas '15, 09:22

sin's gravatar image

sin
700162536
cevap kabul oranı: 13%


Merhabalar sadece daha net cevap vermebilmek için soruyorum eğer entity tarafında relationlar arasında çok fazla EAGER kullanmışsanız bundan kaynaklanabilir bunu kontrol edebilirmisiniz.

permanent link

cevaplandı: 30 Kas '15, 15:29

caglarturkurka's gravatar image

caglarturkurka
6653712
cevap kabul oranı: 6%

Aslında Entitiy class ım yok. Çünkü bir veya birden fazla tablodan dönen bir sonuç değil bir çok tablodan hatta bazı işlemlerden geçip dönen bir sonuç. O yüzden sadece gelen verileri tuttuğum pojo class'ım var. Hibernate için pek bir şey ifade ettiğini zannetmiyorum. Sende createSQLQuery metodu yerine başka bir metod kullana bilsem belki hız biraz daha iyileşir diyie düşündüm ama var mıdır ki böyle bir metod?

Ve aslında b entity class işi sormak istediğim başka bir soruydu Ben bu data tutan class'ı hibernate'e ait bir class'mış gibi nasıl kullanabilirim? yada kullanabilir miyim?

(01 Ara '15, 01:56) sin sin's gravatar image

Merhabalar Hibernate Entity yapabilmek için anatosyon yada xml ile data classınızı Hibernate Entity e çevirebilir ve bu şekilde Criteria API ve HQL kullanarak select çekebilirsiniz.Ancak yalın SQL de aslında performans problemi yaratmamalı bundan dolayı aslında öncelikle bunları yapmadan SQL incelemeniz ve tam olarak burdaki sorunu belirlemenizi öneririm.

permanent link

cevaplandı: 01 Ara '15, 17:21

caglarturkurka's gravatar image

caglarturkurka
6653712
cevap kabul oranı: 6%

Hibernate ile daha önce küçük bir çalışmam olmuştu. Her zaman bir tabloya karşılık gelen yapılardı. Yani User entity'im varsa tam karşısında DB'de de User tablom vardı. Ancak burda durum dediğim gibi karşılık gelebilecek bir tablo yok. Bu şekilde de entity kullanıp createSQLQuery işine girmeden verileri listeleyebilir miyim. Map işlemini neye göre yapacağım peki?

(02 Ara '15, 05:00) sin sin's gravatar image

Merhabalar hibernate te eğer bir Bean nı entity olarak persist etmek istiyorsanız bunun DB tarafta bir karşılığı olması beklenir.

(04 Ara '15, 17:02) caglarturkurka caglarturkurka's gravatar image

"eng: annotation" olsa olsa anotasyon olur "anatosyon" degil :) Klasik "Dinosaur" dinazor, dinozor hatasi gibi....

(04 Ara '15, 18:23) eser eser's gravatar image

Bir kere session factory'yi dependency injection ile alman başlı başına bir performans sorunu. Öncelikle onu düzeltmeni öneriririm.

SessionFactory, tüm yazılımda bir kere initialize edilse kafii. Nasıl ?

private static SessionFactory sessionFactory;

static {
        try {
            Configuration configuration = new Configuration();
            Properties properties = new Properties();
            properties.setProperty("hibernate.connection.url", url); // connection url
            properties.setProperty("hibernate.connection.username", username); // connection username
            properties.setProperty("hibernate.connection.password", password); // connection passwd
            properties.setProperty("hibernate.dialect", "org.hibernate.dialect.PostgreSQL94Dialect"); // hibernate dialect
            properties.setProperty("hibernate.connection.driver_class", "org.postgresql.Driver");
            properties.setProperty("hibernate.show_sql", "true"); // see the sql queries
            properties.setProperty("hibernate.hbm2ddl.auto", "update");
            properties.setProperty("connection_pool_size", "250"); // connection pool
            properties.setProperty("hibernate.temp.use_jdbc_metadata_defaults","false");
            sessionFactory = configuration.addPackage("org.paket.entities")
                    .addProperties(properties)
                    .addAnnotatedClass(Entity.class) // tüm entity'ler bu şekil eklenmiş olmalı.
                    .buildSessionFactory();
            Logger.getLogger(HibernateConnection.class).info("log");
        } catch( Exception e ) {
            Logger.getLogger(HibernateConnection.class).error(e);
        }
    }

getter ekledikten sonra çeşitli dizayn paternleri ile bu şekil kullanman gerekir. Çünkü SessionFactory oluşturmak gerçekten çok çok pahalı bir işlemdir. Bu zaten başlı başına işlemini uzatır. Hemde veritabanın küçük değil ise düşündüğünden çok etkiler işlemi.

Benim gözüme takılan kısım burasıydı. Bir diğer yandan işlemin 1.5 dakika falan sürüyorsa bir şeyi yanlış yaptığından emin ol zira süre çok abes. Biraz daha bilgi verirsen daha sağlıklı cevaplar verebiliriz. Çünkü şundandır diyebileğimiz bir kaynak vermemişsin.

iyi çalışmalar...

permanent link

cevaplandı: 31 Mar, 18:51

lw0xh2's gravatar image

lw0xh2
01
cevap kabul oranı: 0%

değiştirildi: 31 Mar, 18:52

Cevabınız
toggle preview

Bu soruyu takip et

E-Posta üzerinden:

Üyelik girişi yaptıktan sonra abonelik işlemlerini yapabilirsiniz

RSS üzerinden:

Cevaplar

Cevaplar ve Yorumlar

Yazı Formatlama

  • *italic* ya da _italic_
  • **bold** ya da __bold__
  • link:[text](http://url.com/ "başlık")
  • resim?![alt text](/path/img.jpg "başlık")
  • liste: 1. Foo 2. Bar
  • temel HTML etiketleri de kullanılabilir

Bu sorunun etiketleri:

×1,076
×109
×97

Soruldu: 30 Kas '15, 09:22

Görüntüleme: 405 kez

Son güncelleme: 31 Mar, 18:52

powered by BitNami OSQA