6

Birisi, dbcp kullanarak bağlantı havuzu hazırlamanın nasıl hazırlandığını açıklayabilir mi? (Mümkünse bazı örnek kod ile). Nasıl açılacağını anladım - bir KeyedObjectPoolFactory'yi PoolableConnectionFactory'ye geçirdim. Ancak, daha önce hazırlanmış ifadeler bundan sonra nasıl tanımlanmalıdır? Şu anda havuzdan bağlantı almak için sadece PoolingDataSource kullanıyorum. Hazırlanan ifadeleri havuzdan nasıl kullanırım?dbcp'de PreparedStatement havuzu oluşturma

+0

KeyedObjectPoolFactory için nelerden geçiyorsunuz? GenericKeyedObjectPoolFactory için yapıcı bir KeyedPoolableObjectFactory gerektirir ve PreparedStatement için olan Bağlantı'yı kullanacak olanlardan birini nasıl oluşturacağımı göremiyorum. –

cevap

6

Havuzdan bağlantı kurmaktan "havuzsuz" bağlantıya kavuşmaktan bahsediyorsunuz, kodunuzda herhangi bir değişiklik var mı :)? Eminim yapmazsın. Hazırlanan ifadelerle aynı şekilde. Kodunuz değişmemelidir. Yani, bunun için kullanışlı bir kod örneği yoktur.

JDBC Veri Kaynağı uygulamanız için dokümanlar okumalı ve geliştiricilerin havuz oluşturma hakkında neler söylediklerini görmelisiniz. Bu konuda başka güvenilir bilgi kaynağı yok.

here'den itibaren: Bu bileşen ayrıca PreparedStatements'ı havuzlama olanağına da sahiptir.

* public PreparedStatement prepareStatement(String sql) 
* public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency) 

Yani, sadece prepareStatement() çağrısı kullanarak tutmak ve dbcp teoride ilgilenir: bir açıklama havuz aşağıdaki yöntemlerden birini kullanarak oluşturulan her Bağlantı ve PreparedStatements yaratılacak etkin zaman toplanmış olacak havuzlama (yani, "u.adibi gibi kullanıcılardan select * 'i seçmeye çalışıyorsanız: id", bu ifadeyi havuzda bulmayı dener)

+0

Gerçekten mi? O zaman neden PoolableConnectionFactory deyim havuzu için bir parametre var? Açıkçası, onu kurmanın bir yolu olmalı. Apache - her zamanki gibi - yardım yok. – sproketboy

+0

@Dan: Yorumunuzu genişletmek ister misiniz? Cevabımın hangi kısmına katılmıyorsunuz? Soruyu tekrar okursanız, yazar _already_ ifadeleri için havuzlamayı nasıl etkinleştireceğini bilir. Varsa kodda yapması gereken değişiklikleri merak ediyor. –

+1

Üzgünüz, Apache'deki belgelerin olmaması nedeniyle sadece kıpırdaydı. – sproketboy

1

Kullanacağım temel kod. Tek bir Connection kullanırsanız

GenericObjectPool connectionPool = new GenericObjectPool(null); 
    connectionPool.setMinEvictableIdleTimeMillis(1000 * 60 * 30); 
    connectionPool.setTimeBetweenEvictionRunsMillis(1000 * 60 * 30); 
    connectionPool.setNumTestsPerEvictionRun(3); 
    connectionPool.setTestOnBorrow(true); 
    connectionPool.setTestWhileIdle(false); 
    connectionPool.setTestOnReturn(false); 

    props = new Properties(); 
    props.put("user", username); 
    props.put("password", password); 
    ConnectionFactory connectionFactory = new DriverManagerConnectionFactory(url, props); 

    PoolableConnectionFactory poolableConnectionFactory = new PoolableConnectionFactory(connectionFactory, connectionPool, null, "SELECT 1", false, true); 
    PoolingDataSource dataSource = new PoolingDataSource(connectionPool); 
+2

Bu doğru olamaz. PoolableConnectionFactory üçüncü bağımsız değişkeni için null geçme, http://commons.apache.org/dbcp/apidocs/org/apache/commons/dbcp/PoolableConnectionFactory.html#PoolableConnectionFactory(org.apache.commons.dbcp uyarınca PreparedStatement önbelleğe almayı devre dışı bırakır. ConnectionFactory, org.apache.commons.pool.ObjectPool, org.apache.commons.pool.KeyedObjectPoolFactory, java.lang.String, boole, boole). Bu argüman için ne kullanılmalı? –

0

olan şu ki, bu isteseler de istemeseler PreparedStatement s önbelleğe alır, bu etkilemesi mümkün olan tek yolu DataSource özelliklerini kullanmak veya satıcıya özgü API kullanmaktır. Ancak, bu ifadeler diğer bağlantılar tarafından görülmez ve aynı ifadeyi başka bir bağlantı kullanarak hazırlarsanız, yeniden oluşturur. Bu nedenle, DBCP gibi kaputlar, kaputun altında PreparedStatement s farklı bağlantıların yeniden kullanılmasına izin verir (basit Connection yerine PooledConnection arayüzünü kullanır), tüm bağlantılar tarafından hazırlanan tüm ifadeleri takip ederler.

UPDATE: Bu bilgi yanlıştı, en azından C3P0 içinde bu işlevi bulamadık.