2009-03-03 8 views
0

proxool java bağlantı havuzunu kullanıyorum (sürüm 0.9.1). Her şey maksimum bağlantı sayısına ulaşana kadar iyi çalışıyor. gösterilirProksol maksimum bağlantı sayısı

java.sql.SQLException: Couldn't get connection because we are at maximum 
connection count (n/n) and there are none available 
Tabii

yerine n maksimum bağlantı sayısı: maksimum bağlantı sayısı proxool ulaşılırsa derhal SQLExcepion atar.

Proxool, uygun bir bağlantıyı beklemek yerine neden bir SQLException atıyor? Elbette değil, ama yapılandırılabilir bir zaman aşımı harika olurdu.

Önemli mi bilmiyorum, ama bir Tomcat J2EE uygulamasında proxool kullanıyorum. Proksol parametreleri context.xml'da tanımlanmıştır ve Proxool DataSource Support kullanıyorum.

cevap

2

Proxool postalama listesinde soru soruyordum ve maalesef answer nolu bir negatif aldım.

Artık, yapılandırılabilir (veya herhangi bir tür) zaman aşımı için destek yoktur, ancak bu özelliği uygulama planları vardır.

1

Kaynak koduna hızlı bir şekilde baktım ve bu, ConnectionPool.getConnection için standart davranışa benziyor. documentation aynı şeyi söylüyor.

Başka bir veritabanı havuzu oluşturma kütüphanesi (Apache DBCP ve C3P0 gibi) vardır, ancak bunları kullanmak için bazı refactoring yapmak zorundasınız. Alternatif olarak getConnection yöntemini kendiniz sarmalamak (veya proxool kaynağını değiştirmek) ve istediğiniz şekilde çalışmasını sağlamaktır.

0

İşlemek için Thread.sleep() öğesini kullanabilirsiniz. Proksol, maksimum bağlantı sayısına ulaşıldığında bir istisna atar. Bunu tespit ettikten sonra, "Thread.sleep()" diyerek biraz bekleyebilirsin, umarım bu süreden sonra, bağlantılar tekrar kullanılabilir olur.

 
public Connection getConnection() throws SQLException { 
    Connection conn = null; 
    while (conn ==null){ 
     try { 
     conn = DriverManager.getConnection("proxool."+connectionPoolAlias); 
     } catch (SQLException e) { 
     e.printStackTrace(); 
     String methodName =e.getStackTrace()[0].getMethodName(); 
     if (methodName.equalsIgnoreCase("checkSimultaneousBuildThrottle") || 
            methodName.equalsIgnoreCase("quickRefuse")){ 
      try{ 
      Thread.sleep(500); 
      }catch(InterruptedException ie){} 
     }else{ 
      throw e; 
     } 
     } 
    } 
    return conn; 
    }