2013-01-14 17 views
10

Müşterilerden bir web sunucusu kullanma isteği aldık. Bu web sunucusunun bir bileşeni bir veritabanına bir bağlantı tutar.JDBC bağlantısının hala iyi olup olmadığını anlamanın güvenli bir yolu var mı?

Kullanmaya başlamadan önce bağlantının kapatılıp kapatılmadığını veya bir şekilde işlev görmediğini anlayabilmem gerekir.

// Decide connection details on alias. 
private String alias = null; 
// I must have my own because I prepare statements. 
private Connection connection = null; 

public Connection getConnection() { 
    try { 
    if (connection.isClosed()) { 
     // Start afresh. 
     connection = null; 
    } 
    // ** More tests here to check connection is ok. 
    if (connection == null) { 
     // Make a new connection. 
     connection = Connections.getConnection(alias); 
    } 
    } catch (SQLException ex) { 
    // Cause a NPE further down the line. 
    connection = null; 
    } 
    return connection; 
} 

Ne yazık ki bu bazen çeşitli hatalardan biri olsun böyle bir bayat bağlantı döndürür: Şu anda böyle bir şey yapmak. Bu tür oluşacağı:

java.sql.SQLException: Io istisna: bu sadece kaydedilen hatalardan biri olduğunu

Not soket yazma hatası ve bu bir yaklaşık sonra olur: yazılım bağlantı iptaline neden 72 saat boşta.

Aradığım şey, bağlantının açık, çalışır durumda ve kararlı olup olmadığını sürekli olarak belirtmesi gereken bir bağlantının en az bir veritabanı genel test kullanıcısıdır. Mümkün mü?

Buna karşı çok küçük bir sorgu çalıştırmayı umursamıyorum, ancak her iki veritabanında da agnostik olmalı ve çok az zaman alacak/hiç zaman harcamamalıdır.

BTW: Java 5 altında çalışıyorum, bu yüzden Connection.isValid benim için bir çözüm değil.


sonra bu soruyu ziyaret olanlar için

Eklendi - Sonunda danışma sunulan aldı ve gerçek bir bağlantı havuzuna taşındı ve sadece yapmak şaşırtıcı kolaydır değildi ama hepsi arasında Sorunlarım kayboldu.

Tek garip bölüm, bir bağlantı havuzu ile bağlantınızı bitirdiğinizde bağlantınızın close olması gerektiğini fark ettiniz. Havuz, kapanmayı engeller ve sahnenin arkasındaki havuza döndürür.

+1

Bağlantıları rutin bir sorun olarak doğrulayan hazır bağlantı havuzlarına karşı neye sahipsiniz? –

+0

@MarkoTopolnik - hiçbir şey - olduğu gibi - ama bu bağlantılara ekli ifadeler hazırladım, böylece bunları kendim halletmem gerekiyor. Yoksa ben mi? – OldCurmudgeon

+1

Aslında, bu havuzların da hazırladığı ifade havuzlarıyla başa çıkma endişesi. Btw benim seçimim * boneCP *. –

cevap

11

En iyi yol, Oracle için SELECT 1 veya SELECT 1 FROM DUAL gibi basit bir SQL ifadesi yapmaktır. (Lütfen satıcınıza özel sözdizimi için veritabanınıza bakın.)

Başarısız olursa, bağlantıyı yenileyin. WebLogic gibi Java EE uygulama sunucuları, bunu yapmak için yapılandırırsanız, bunları test etmek için yapar. bağlantı kapatıldı ve hala geçerli edilmemiş ise

+0

Bazı uygulama sunucularının zaten bu denetimi otomatik olarak gerçekleştirdiğini (eğer bunları yapılandırırsanız yapılandırırsanız) gerçeği vurgulamanız (cevabınızda biraz belirgin gibi görünüyor) önerilir. WebSphere bir noktada. – Isaac

+0

Bitti - teşekkürler. – duffymo

+0

'SELECT 1 'tüm veritabanlarına karşı çalışır mı? – OldCurmudgeon

8

java.sql.Connection.isValid(int timeout) 

döndürür doğrudur deneyin.

+0

Üzgünüm - Tabanlı olmalıyım Java 5 altında çalışıyorum. – OldCurmudgeon

+0

Bilgimden sadece bir miktar bilgi eklendi, "java.sql.Connection.isValid (int timeout)" yöntemi "SELECT 1" – JackB

4

Her veritabanı, varolan tablolara bağlı olmayan bir sorguya sahiptir.

values 1 
+0

"değerlerini çağırıyor" 1 "? Bu tanıdığım herhangi bir SQL değil ... – duffymo

+1

DB2, bu sözdizimini kullanarak değer listesinden geçici tablolar oluşturmak için kullanır. "VALUES ifadesi" belgelerini arayın. –

+0

Teşekkürler, ama DB2 kullanmıyorum (şükürler olsun). – duffymo

0

Im Davam, ben java kullanın: Oracle, birçok diğer veritabanları için

select 1 from dual 

(MySQL, H2) deneyin, deneyin

select 1 

DB2 öyle kendine özgü sözdizimi vardır .sql.Connection.isValid (int zaman aşımı):

Bir getConnection yöntemim var (veya bu örnekte getInstance yok yok):

try { 
    if (connect == null) || ! connect.isValid()) { 
     connect.DriverManager.getConnection(...); 
} catch (SQLException e) { 
    logger.error(...); 
    connect = null; 
} 
return connect; 
+0

Bu çözümün bir seçenek olarak kabul edilmesine kesinlikle değer ancak 'inValid' in sadece Java 1.6'dan itibaren mevcut olduğunu unutmayın. Genel - benim tavsiyem olurdu * bir bağlantı havuzu için *. – OldCurmudgeon

İlgili konular