15 Ekim 2013 Salı

Hibernate Connection Pool

Not : Eğer "Using Hibernate built-in connection pool (not for production use!)" şeklinde bir mesaj alırsak sebebi Hibernate ile gelen DriverManagerConnectionProvider sınıfının veritabanı connection pool olarak kullanılmasıdır. Tavsiye edilen buradaki örnekteki gibi C3P0ConnectionProvider sınıfının kullanılmasıdır.

Hibernate ve Connection Pool
Hibernate ile bir çok connection pool kütüphanesi kullanmak mümkün. Bunlar arasında C3P0, Proxool, DBCP sayılabilir. Hibernate ile bu kütüphanelerin hangi arayüz ile birleştirildiğini aşağıdaki şekilde görmek mümkün.

Connection Pooling başlıklı yazıda tüm kütüphanelerin konfigürasyon parametreleri ile ilgili bilgi mevcut. Ayrıca Hibernate: Providing Connections for Hibernate başlıklı yazıya göz atmak faydalı olabilir.

C3P0
C3P0ConnectionProvider bir connection pool sağlayıcısıdır. En önemli özelliklerinden birisi de How to check if connection alive? sorusunda da açıklandığı gibi pasif bekleyen veritabanı bağlantılarını aşağıdaki SQL benzeri bir cümle ile arada bir kontrol etmesidir.
Bu sınıfı kullanmak için aşağıdaki kütüphaneyi projeye eklemek yeterli.
Dikkat edilmesi gereken nokta burada açıklandığı gibi hibernate ayarları için kullanılan konfigürasyon anahtar değerler ile C3P0 ile kullanılan konfigürasyon anahtar değerler farklı.
Aşağıdaki C3P0 içindeki ComboPooledDataSource sınıfını kullanma örneği var.
protected Connection getConnection() throws NamingException, SQLException {
    ComboPooledDataSource cpds = new ComboPooledDataSource();
    try {
        cpds.setDriverClass( "net.sourceforge.jtds.jdbc.Driver" ); //loads the jdbc driver    
        cpds.setJdbcUrl( "jdbc:jtds:sqlserver://10.38.28.77/MyDB" );  
        cpds.setUser("sa");                                 
        cpds.setPassword("password");  
        cpds.setMaxStatements( 180 );
    } catch (PropertyVetoException e) {
        e.printStackTrace();
    }     
    return cpds.getConnection();
 }
DBCP
Apache'nin kütüphanesi. Burada kod içinden kullanma örneği mevcut. Önemli sınıfları şunlar

org.apache.commons.pool.impl.GenericObjectPool
Connection nesnelerini saklayan sınıf

GenericObjectPool connectionPool = new GenericObjectPool();
connectionPool.setMaxActive(10);

GenericObjectPool sınıfının addObject() metodu çağırılarak pool'u önceden doldurmak mümkün.


org.apache.commons.dbcp.DriverManagerConnectionFactory 
Gerektikçe yeni bir connection nesnesi açan factory.


org.apache.commons.dbcp.PoolableConnectionFactory
DriverManagerConnectionFactory ve GenericObjectPool nesnelerini birleştirir.

org.apache.commons.dbcp.PoolingDataSource
 Bilindik DataSource arayüzünü gerçekleştiren sınıf.



Hiç yorum yok:

Yorum Gönder