2010-08-06 23 views
9

N sayıdaki veritabanı sistemini bağladığım bir uygulama üzerinde çalışıyorum [N 1 ila 350 arasında herhangi bir yerde].JDBC - Birden Çok Veritabanına Bağlan

Buradaki fikir şudur: kullanıcı bir veritabanı listesiyle sunulacaktır ve listeden herhangi bir veya tüm veritabanlarını seçmesi istenecektir. Veritabanları seçildikten sonra, veritabanının her birine bağlanmalı ve depolanmış bir prosedürü yürütmem gerekir.

Düz eski JDBC'yi kullanmayı ve her biri için bir kereliğine [veya birden fazla iş parçacığı çalıştırarak] bağlantı kurmayı ve mağaza yordamını yürütmeyi ve bağlantıyı kapatmayı planlıyorum.

Ve bunların hepsi bir işlemde olmalıdır. Bunu yapmanın en iyi yolu nedir?

JDBC değilse ... başka etkili bir yol var mı?

Güncelleme -

saklı yordam aslında bazı sql çalışan katılır

- örneğin bir sütun güncellenmesi, bir kullanıcı için izin vermek vb

Ben makul maksimum miktarın bir ThreadPool'da oluşturmak istiyorum
+1

ne tür? Masaüstü veya web? – skaffman

+0

Bir Web Uygulamasıdır. – jagamot

+0

Anlayışım, bunu tek bir işlemde yapmanız gerekmediği, bu doğru mu? Daha fazla dikkate alınması gereken daha fazla ihtiyaç var. – BalusC

cevap

3

Executors#newFixedThreadPool() yardımı ile, on ve yirmi iş parçacığı arasındaki iş parçacıkları, ve ExecutorService#invokeAll() kullanarak her bir Callable ayrı DB bağlantı ve SP yürütme görevlerini çağırır. Sonuçta en iyi performansı veren threadcount ve profil ile oynamak istersiniz. Aynı uygulamayı farklı DB çağrıları için yeniden kullanabilmeniz için, her Callable uygulamasının bağlantı ayrıntılarını ve SP adını yapıcı argümanı olarak alması gerekir.


Güncelleme: Tamam, bu bir WebApplication bu. İpleri harcamak istemezsin. Tek bir eşzamanlı kullanıcı tarafından kullanılması gerekiyorsa, o zaman iplikhanenin düzgün bir şekilde ya da oturumun en sonunda sonunda shutdown olduğundan emin olmalısınız. Ancak birden çok eşzamanlı kullanıcı tarafından kullanılması gerekiyorsa, o zaman threadpool'u uygulama kapsamı içinde paylaşmak istersiniz. Ayrıca burada, webapp kapatıldığında düzgün şekilde kapatıldığından emin olmanız gerekir. ServletContextListener burada yararlıdır.

0

Bu büyük bir karmaşaya benziyor, ama bu senin problemin.

Her veritabanı için bir bağlantı havuzuna ihtiyacınız vardır. Bağlantı ömrünü kendiniz halletmeye çalışmanızı tavsiye etmem. Uygulama sunucusunun bunu sizin için yapmasına izin verin.

Bir grup veritabanının büyük bir işlemde olduğunu görmek için JDBC XA sürücülerini numaralı telefondan kullanmanız gerekir. İşlemi sizin için denetlemek için bir JTA işlem yöneticisine de ihtiyacınız olacaktır.

Kayıtlı yordamlar işlemleri işlemek için herhangi bir mantık içeremez; JTA’nın yapmasına izin vermelisin.

Saklı yordamın ne yaptığını söylemezsiniz. Herhangi bir şey döndürme ihtiyacı yoksa, alternatif bir tasarım JMS, bir sıra ve bir dinleyici havuzu olabilir. Senin yerinde olsam iş parçacığı için endişelenirim. Konteynerin yapabildiğim kadar karmaşık şeyler yapmasına izin vermenin bir yolunu bulurdum.duffymo onun yorumunda belirtildiği gibi bir işlem koordinatörü ve iki fazlı bulunursanız

+0

Sanırım tüm veritabanı bağlantı URL'leri merkezi bir veritabanında tutuluyor. Uygulama sunucusunda veri kaynaklarını oluşturmak istemediğimize inanıyorum [yaklaşık 1 - 350 veri kaynağım var] ..... bu durumda bağlantı yaşam döngüsünü kendim halletmem gerekiyor sanırım? – jagamot

1

, sadece birden fazla veritabanı işlemleri yapmak mümkün olacak.

Bunun için JTA'yı işleyen bir J2EE yığınına ihtiyacınız olacaktır. Tomcat'ta veya JTA olmayan başka bir kapsayıcıda çalışıyorsanız, indirip yükleyebileceğiniz çeşitli seçenekler vardır.

Tabii ki Kapsayıcı değil veritabanı/saklı yordam hareket iptalleri ve Al halledeyim gerekecektir.

2

Eğer iki bağlantıyı kullanmak onları yönetmek için bağlantı havuzu c3p0 kullanmak için kabul edilebilir değilse. İki veritabanları bağlamak için ben beyan:

public Connection connection1; 
public Connection connection2; 
DataSource dataSource1; 
DataSource dataSource2; 

Sonra iki benzer yöntemleri: Uygulamanın

public Connection dbConnect1() throws SQLException { 
    ComboPooledDataSource cpds = new ComboPooledDataSource(); 
    try { 
     cpds.setDriverClass("com.mysql.jdbc.Driver"); 
    } catch (PropertyVetoException e) { 
    } 
    cpds.setJdbcUrl("jdbc:mysql://localhost:3306/myDatabase1?autoReconnect=true"); 
    cpds.setUser("myMYSQLServerLogin"); 
    cpds.setPassword("myMYSQLServerPassword"); 
    cpds.setMinPoolSize(5); 
    cpds.setAcquireIncrement(5); 
    cpds.setMaxPoolSize(20); 
    cpds.setMaxIdleTime(60); 
    cpds.setMaxStatements(100); 
    cpds.setPreferredTestQuery("SELECT 1"); 
    cpds.setIdleConnectionTestPeriod(60); 
    dataSource1 = cpds; 
    connection1 = dataSource1.getConnection(); 
    return connection1; 
} 

public Connection dbConnect2() throws SQLException { 
    ComboPooledDataSource cpds = new ComboPooledDataSource(); 
    try { 
     cpds.setDriverClass("com.mysql.jdbc.Driver"); 
    } catch (PropertyVetoException e) { 
    } 
    cpds.setJdbcUrl("jdbc:mysql://localhost:3306/myDatabase2?autoReconnect=true"); 
    cpds.setUser("myMYSQLServerLogin"); 
    cpds.setPassword("myMYSQLServerPassword"); 
    cpds.setMinPoolSize(5); 
    cpds.setAcquireIncrement(5); 
    cpds.setMaxPoolSize(20); 
    cpds.setMaxIdleTime(60); 
    cpds.setMaxStatements(100); 
    cpds.setPreferredTestQuery("SELECT 1"); 
    cpds.setIdleConnectionTestPeriod(60); 
    dataSource2 = cpds; 
    connection2 = dataSource2.getConnection(); 
    return connection2; 
} 
+0

Sadece 350 veritabanınız için bir döngü yapın. Kodu temizlemek için gerekirse, her bir veritabanı için ana veritabanınızdan parametreleri ayıklayın. – Zon