2016-10-07 59 views
6

Sorun:com.mchange.v2.c3p0.ComboPooledDataSource kaynağından özel bir bağlantı nasıl talep edebilirim?

  • program Sybase sunucusuna bağlanmak için com.mchange.v2.c3p0.ComboPooledDataSource kullanır
  • program sırayla 2 yöntem, runSQL1() ve runSQL2() yürütür
  • runSQL1() bir #temptable

    SELECT * INTO #myTemp FROM TABLE1 WHERE X=2 
    
  • oluşturur SQL çalıştırır
  • runSQL2(), bu #tem'den okuyan SQL'i yürütür ptable

    SELECT * FROM #myTemp WHERE Y=3 
    
  • SORUN: runSQL2()runSQL1() teslim olandan havuzundan farklı DB bağlantısını teslim alır. Ancak, Sybase #temptables bağlantıya özgü olduğundan, runSQL2() tablosu, tablosunu bulamadığında başarısız olur. Aklıma

en belirgin çözeltisi (kenara biz bile bir havuz gerekmez bu noktada havuz boyutu 1 yapma dejenere biri itibaren), nasılsa oldu özgü hangi havuzdan bağlantı hatırlamak runSQL1() tarafından kullanılan ve runSQL2() istek aynı bağlantı var.

com.mchange.v2.c3p0.ComboPooledDataSource'da bunu yapmanın bir yolu var mı?

Mümkünse, eşzamanlılık güvenli olan bir yanıt istiyorum (başka bir deyişle, eğer runSQL1() içinde kullanılan bağlantı başka bir iş parçacığı tarafından kullanılıyorsa, bağlantı kurmak için runSQL2() 'nin çağrısına kadar bekleyecektir. bağlantı başka bir iş parçacığı tarafından serbest bırakılır).

Ancak, eğer bu imkansızsa, DB bağlantılarının (benim ilgilendiğim şeylerin) tek bir iş parçacığı içinde olduğunu varsayan ve bu nedenle runSQL2() tarafından istenen herhangi bir bağlantı 100% olacaktır runSQL1() için kullanılabilirse kullanılabilir.

Ayrıca, çözümün bir parçası olarak "#temptables kullanmayı durdur" seçeneğini içermedikleri sürece, sorunu başka şekilde çözen herhangi bir çözümü de memnuniyetle karşılıyorum.

+0

Neden part1'i çalıştırmadan önce bağlantıyı istemiyorsunuz ve sonra bunu her iki çağrıya da bir parametre olarak iletemiyorsunuz? – Ivan

+0

@ivan bunu yaptı. Ama bu çözümü sevmiyorum, bu yüzden özel bağlantıyı nasıl alacağımı öğrenmek istiyorum. – DVK

+1

Ayrıca, @van'ın önerdiği çözümün uygun çözüm olduğunu düşünüyorum. Başka bir şekilde elde etmek için, ilk aldığınızda bağlantıya en az bir tanımlayıcı tutmanız gerekir. Bunu yaptıktan sonra havuz yöneticilerinde yansıma kullanmanız ve eşleşen bağlantıyı bulmanız gerekir. Bunun yerine sadece belirli bir bağlantıya referans yapmak daha temizdir. Bunu bir tanımlayıcı ile sorgulayarak gerçekten yapmanız gerekiyorsa, kendi sarmalayıcı bağlantı yöneticinizi yazıp bunu kullanabilirsiniz. – Kaan

cevap

0

Bunu yapmanın en kolay ve en açık yolu, yalnızca havuzdan bağlantı isteğinde bulunmak ve bu bağlantıyla runSQL1() ve runSQL2()'u çalıştırmaktır. Bu bağlamda kullanılması önerilen kullanım şekli, bir tür işlem yöneticisine etkili bir şekilde teşvik edeceği için, bağlantı havuzu yöneticilerinin genel tasarım ilkelerine aykırıdır.

Yukarıdakilere yardımcı olabilecek Java çerçeveleri vardır. Örneğin, @Transaction veya TransactionTemplate no.lu yayında, işlem sınırlarını belirlemek için kullanılabilir ve tek bir bağlantının tek bir iş parçacığı tarafından (veya daha doğrusu, işlem yayılma ek açıklamalarına göre) kullanılmasını garanti eder. İlkbahar birçok işlem yöneticisini kullanabilir, ancak muhtemelen DataSourceTransactionManager'u kullanmak daha kolay olurdu ve c3p0'u DataSource olarak kullanacak şekilde de yapılandırılabilir.