2008-09-15 12 views
1

Belirli bir iş parçacığı içinde belirli bir işlemin kilitlenmesini belirlemek için en iyi yöntemi arayan geliştirici. Kilitlenme hatalarını alıyoruz ancak bunlar FB 2.0ID-ing Firebird kullanan bir iş parçacığında kilitlenmeler

'de çok geneldir. Kilitlenmeler gerçekleşir ve istemci ile DB arasındaki DB bağlantısında arızalara yol açarlar.

  • DB'ye veri (saniyede bir kez) veri gönderiyoruz.
  • Yaklaşık 30 iş parçacığı olan bir iş parçacığı havuzu açıyoruz ve verileri almak için bunları kullanıyoruz (her saniye yaklaşık 1-2 kB).
  • Bazen DB, akıntıyı olabildiğince güncel tutmak için havuzdaki bir sonraki parçayı kullandığımız kadarını alabilir.

Bu durumda, maksimum iplik sayısına ulaşmaya ve bağlantıyı kesmeye ek olarak bir kilitlenme ortaya çıkar.

Bu nedenle, bu veri miktarını her saniye tüketmenin en iyi yöntemi olup olmadığı konusunda gerçekten neye ihtiyacımız var. DB'ye aynı anda vuran bu müşterilerde 100'e kadar vaktimiz var.
Ortalama işlemler günde yaklaşık 1,5 ila 1,8 milyon arasındadır.

cevap

1

Belirli bir iş parçacığı veya deyimi tanımlamanın belirli bir yolunu bilmiyorum. Birçok kez FB çıkmazlarla uğraşmak zorunda kaldım. Muhtemelen bazı satırlarda aynı satırı güncellemeye çalışan iki adım var, ancak bunları ayrı işlemlerde yapıyorlar.

Bulduğum en iyi çözüm, herhangi bir iş parçacığının güncelleştirebileceği satırları hiçbir zaman güncelleştirmek zorunda kalmayacak şekilde bir şeyler tasarlamaktır. Bazen bu, ortak bir tabloyu/satırı güncelleştirmek için mevcut olan bir iş parçacığına sahip olmak anlamına gelir. İşçi iş parçacığı bu iş parçacığına bir ileti gönderir. (Mesaj başka bir tablo üzerinden yapılabilir.)

Sahada birçok işlem gerçekleştiren FB'yi (günde milyonlarca değil) işlem gerçekleştiriyoruz ve tasarımın doğru olması üzerine FB'nin kaya gibi katı olduğunu gördük.

+0

Sanırım bu kadar doğru bir cevap var - Firebird'le bir süredir çalışıyoruz ve saklı yordamlardaki detaylara dikkat edilmesi sorunu azaltıyor veya ortadan kaldırıyor gibi görünüyor. Ayrıca, izleme için IBExpert'e de öneride bulunacağım - tek bir geliştirici koltuğu için lisansı ucuz ve özelliklerinin etkileyici olduğu. –

1

Firebird 2.1'de tablolar, bağlantılar ve işlemler için yeni izleme yetenekleri var, belki de size yardımcı olabilir (yükseltilebilirseniz). README.monitoring_tables.txt dosyasına bakın.

Örnek olsun aktif ifadeleri:

SELECT ATT.MON$USER, ATT.MON$REMOTE_ADDRESS, STMT.MON$SQL_TEXT, STMT.MON$TIMESTAMP 
FROM MON$ATTACHMENTS ATT 
JOIN MON$STATEMENTS STMT ON ATT.MON$ATTACHMENT_ID = STMT.MON$ATTACHMENT_ID 
WHERE ATT.MON$ATTACHMENT_ID <> CURRENT_CONNECTION AND STMT.MON$STATE = 1 
-1

Benim önerim, 3 katmanlı uygulama yazmak diğer konuları sadece verileri yığılıp kalabilmektedir (tek bir konuya veritabanı (ekleme) tüm erişimi seri hale getirmek olacaktır sıra) ve Firebird'i gömülü olarak kullanın (TCP/IP ek yükünü ortadan kaldırdığı için çok daha hızlıdır).

Kilitlenmeyi önlemenin yanı sıra, bu yaklaşım kuyruğu izlemenizi ve sistemin yük ile nasıl başa çıkabileceğini görmenizi sağlar.

+0

Aşağı oylama yapıyorum çünkü şişeyle ilgili veritabanı erişiminin tek bir iş parçacığına erişebildiğini düşünmüyorum. Gömülü Kitaplık yerine Firebird'in Sunucu Modelini kullanmanın temel nedeni birden çok eşzamanlı istemciyi desteklemektir. Hizmetin bu özelliğine zaten bağımlılar.Kısa bir süre önce (gömülü olmak üzere) bir Kullanıcı Arayüzü ve Servisinin her iki veriye doğrudan erişebilmesini sağladık ve böylece tek bir kullanım örneği olarak bileşenlerin seri halinde ve geri yükünü azalttık. –

+0

Sahip olduğunuz eşzamanlı istemciler, çıkmazın daha yüksek şansı. Eşzamanlı olarak yürütülebilen birden fazla bağımsız işleminiz olduğunda yorumunuzla aynı fikirdeydim, ancak bu durumda, soru birbirlerinin kilitlerini kapatan eşzamanlı işlemlerle nasıl başa çıkılacağıydı. –

İlgili konular