2011-10-07 12 views
12

JNDI seviyesinde veya webapp seviyesinde bağlantı havuzuna sahip olmak daha mantıklı mı?Bağlantı havuzu veya veri kaynağı? JNDI'ye hangi bilgileri koymalıyım?

<Context antiJARLocking="true"> 
    <Resource name="jdbc/myDataSource" 
    auth="Container" 
    type="javax.sql.DataSource" 
    driverClassName="com.mysql.jdbc.Driver" 
    url="jdbc:mysql://localhost/myDataSource" user="user" password="password" /> 
</Context> 

ve sonra thusly ilkbaharda havuzu yapılandırmak: Örneğin, ben sadece javax.sql.DataSource thusly de yaratabilir

<bean id="myDataSource" class="com.mchange.v2.c3p0.DataSources" 
    factory-method="pooledDataSource"> 
    <constructor-arg> 
    <jee:jndi-lookup jndi-name="java:comp/env/jdbc/myDataSource" /> 
    </constructor-arg> 
</bean> 

Ya da, doğrudan JNDI kendisi havuza yapılandırabilirsiniz:

<Resource name="jdbc/myDataSource" 
    auth="Container" 
    factory="org.apache.naming.factory.BeanFactory" 
    type="com.mchange.v2.c3p0.ComboPooledDataSource" 
    driverClassName="com.mysql.jdbc.Driver" 
    jdbcUrl="jdbc:mysql://localhost/myDataSource" 
    user="user" password="password" 
    minPoolSize="3" 
    maxPoolSize="15" 
    maxIdleTime="5000" 
    idleConnectionTestPeriod="300" 
    acquireIncrement="3" /> 

Leaving bu bahar:

<jee:jndi-lookup id="myDataSource" jndi-name="java:comp/env/jdbc/myDataSource" /> 

Her iki durumda da, myDataSource bahar fasulyesi bir c3p0 bağlantı havuzlu veri kaynağı olurdu, ancak hangisi daha iyi? JNDI'da havuza sahip olmanın en mantıklı olduğunu düşünüyorum, ancak bunun için dezavantajı, c3p0 lib'inizi şu anda farklı bir sürüm kullanıyorsa var olan servletlerle çakışmaya neden olabilecek servlet konteyner seviyesine itmenizdir. Bununla birlikte, JNDI'ye eklemek, uygulamalarınızın hiç bir şekilde havuz oluşturma konusunda endişelenmemesi anlamına gelir. Ne düşünüyorsun?

+0

Do it (her uygulama bu kadar kendi havuzu kullanarak başladığında bu böyle olur) eğer istersen, istediğin gibi. Mümkünse hepsini tek bir yerde en iyisi. – EJP

cevap

23

Sen zaten :) toplanmış olduğunda, JNDI elde edilen veri kaynağını, havuza gerekmez

bir kap-yönetici havuzu v.S. sahip arasındaki tek fark Uygulama havuzu, 1. durumda, standart arayüzleri (ör. JBoss konsolu) kullanarak havuzdaki iş yükünü izleme yeteneğinizdir. Ardından, uygulama sunucusunun yöneticisi, gerekiyorsa havuz boyutunu büyütme kararını yönetir. Ayrıca uygulamaları başka bir DB sunucusuna da geçirebilir (örneğin MySQL'den Oracle'a planlı geçiş). Dezavantajı, birim testleriniz için JNDI test veri kaynağını kurmak için biraz daha fazla çabaya ihtiyaç duymanızdır (bkz. here).

Ve 2. durumda, evet, DBCP veya c3p0 artı JDBC sürücüsünü uygulamanızla birlikte paketlemelisiniz. Bu durumda, Tomcat'te çalışan tüm uygulamalar için tüm havuzlarla ilgili istatistikleri toplamak o kadar kolay değildir. Ayrıca yeni JDBC sürücüsüne (MySQL 4 - MySQL 5) geçiş, tüm uygulamalar için aynı anda yapılamaz. Ve bir .property dosyası (projenin yeniden birleştirilmesi ve yeniden konuşlandırılması gerektiğinde değiştirilmesi) kullansanız bile bağlantı özellikleri uygulamanıza bağlıdır. Tek ihtiyacınız olan tek bir DB'niz ve yönetim yokluğunuz olduğu için belki de buna ihtiyacınız yok. Bu konuda

Fazla konu:

+5

Ayrıca dikkate alınması gereken Tomcat JDBC Havuzu (http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html) bulunmaktadır. – rit

İlgili konular