2012-02-17 20 views
5

Bir yanıt için Stackoverflow'u arıyorum ancak Hazırda Bekletme veya başka bir veritabanı sarıcı içermeyen bir ürün bulunamıyor.Java MYSQL/JDBC sorgusu önbelleğe alınmış verilerden eski veriyi döndürüyor Bağlantı

Tomcat 6 Java EE uygulamasında JDBC'yi doğrudan MYSQL 5.18 JDBC sürücüsü aracılığıyla kullanıyorum. Bağlantı nesnelerini önbelleğe alıyorum, ancak Bildirim nesnelerini önbelleğe almıyorum. Sorgu için Sonuç Tabloları, ilk çalıştırmada güncel verileri doğru bir şekilde döndürüyor. PHPMyAdmin veya başka bir harici araç aracılığıyla birkaç satırı değiştirdiğimde, sorguyu yeniden çalıştırın, eski verileri eski durumuna getiriyorum.

Normal Tablolar kullanıyorum, PreparedStatements. ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE denedim. Ayrıca sonuç kümesini de kapatıyorum. Bunlar sorunu çözmez. Ayrıca, ResultSet.refreshRows() yöntemini denedim, ancak sorgunun JOIN yan tümcesi bulunduğundan bir hatayla sonuçlanır.

Sorunu açık bir şekilde çözen tek şey Bağlantıyı kapatmak ve veritabanına yeniden bağlanmaktır; bu da her bir sorgu girişimi için ağır bir maliyet oluşturur.

Eski veriler dönmeden Bağlantıları yeniden kullanmanın bir yolu var mı?

DÜZENLEME: Şu anda sorgu için işlem kullanmıyorum.

İşte genel kod. Önceden yardım için

Connection conn; //created elsewhere and reused 
... 

String query = "SELECT p.ID as oid,rid,handle,summary,city,state,zip,t.name AS category  
       FROM profiles AS p 
       JOIN (terms AS t) ON (p.tid = t.ID) 
       WHERE p.ID = 1"; 

ResultSet resultSet; 
Statement s; 
synchronized (conn) 
{        
    s = conn.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, 
          ResultSet.CONCUR_UPDATABLE);       
    resultSet = s.executeQuery(query); 
} 

//Iterate over the results using .next() and copy data to another data structure 
List retval = getResults(resultSet); 
s.close(); 

teşekkürler!

+2

İşlemler kullanıyor musunuz? Eğer öyleyse izolasyon seviyesi nedir? REPEATABLE READ davranışı gibi görünüyor. –

+0

İyi soru. Bu sorgular için işlem yok.Genel olarak güncellemeler/ekler için işlemleri kullanıyorum, ancak bu durumda, şu anda uygulamanın kendisinde hiçbirini yürütmüyorum. UPDATE'leri bir şeyler fırlatabilecek harici bir araçla yapıyorum. Kirli okumaları önlemek için işlemleri bir çözüm olarak önerirseniz, lütfen bir yanıtı paylaşın. Ayrıca, bağlantıda herhangi bir yalıtım seviyesi belirlemedim. Sorun bu muydu? – ricosrealm

cevap

9

. Brent Worden'a, etrafa bakmamı sağlayan ve otomatik taahhütleri devre dışı bıraktığımı ve sorgulamadan sonra taahhütte bulunmadığımı fark eden işlemler hakkındaki soruya teşekkürler. benim için çalıştı

Yani çözümleri:

conn.setAutoCommit(true); 

veya

statement.executeQuery(query); 
conn.commit(); 

Bu sorgular yıkanmalıdır ve bayat veri engellenir verir.

+0

Lütfen bunu cevap olarak işaretleyebilir misiniz? Bu şekilde, insanlar bu yazıyı bulabilir ve sorununuzu ve çözümünüzü okuyabilirler :). –

+0

2 gün içinde olacağım. Şu anda yapamam çünkü site bana izin vermiyor. – ricosrealm

+0

'conn.commit();' demek istediniz? –

0

Neden Apache DBUtils kullanarak JDBC havuzlarını kullanmıyorsunuz? Aynı bağlantıyı kullanmanıza ve ayrıca bağlantı boyutunu kontrol etmenize izin verir. Bağlantının, bir sorulmamış sorgular olduğu ortaya çıktığında, http://commons.apache.org/dbutils

+0

İşaretçi için teşekkürler. Bu koda bakıp deneyebilirim. Ancak daha büyük bir kod sarıcı olmadan burada çok basit bir şey yapmaya çalışıyorum. – ricosrealm

3

İşlem yalıtımı düzeyini aşağıdaki gibi ayarlayın.

connection.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);

1

benim MySQL kurulumu: MOTOR = InnoDB'nin varsayılan tx_isolation = REPEATABLE_READ

spring.xml

<tx:method name="find*" propagation="SUPPORTS" read-only="true" timeout="600" /> 

eğer hep aynı sonuçları getirecektir kullanımı toplanmış bağlantı!

mysql değiştir tx_isolation = READ_COMMITTED sorunumu çözdü.

İlgili konular