2012-03-23 24 views
6

Bir veritabanında etkileşimde bulunmak için HDBC kullanan basit bir uygulama var. Bu bir snap uygulaması veya bir komut satırı uygulaması olabilir. Bu konuya genel bir bakış yapmak istiyorum. İyi bir örnek, "Real World Haskell" den bölüm 22 olabilir.Haskell: HDBC, bağlantı durumu ve muhtemelen havuz

Bu nedenle, tüm SQL ile ilişkili işlevlerimi bağlantı, saveArticle, getArticle vb. Ayrı bir DB.hs dosyasına gizlerim. Tüm DB işlevleri bir argüman olarak bir bağlantı tutacağı alır.

Şimdi, bağlantıyı bir kez nasıl başlatabilirim ve tüm bu DB işlevlerinin bağlantıyı tek başına başlatmadan kullanabilmesi için bir duruma nasıl sokardım? Bu mümkün mü? Belki yanlış düşünüyorum ya da OO kavramları aklıma geliyor, ama ... bağlantımı ("OO" da bir nesneyi başlatacağınız gibi) "ilklendirmek istiyorum". Her DB işlevinin yeni bağlantı oluşturup kapatmasını istemiyorum.

Havuz oluşturmak ve havuzu bağlantı tanıtıcısı yerine argüman olarak işlevlerine aktarmak zorunda mıyım? Bunu yapmanın en basit örneği nedir?

Bir havuz ya da bağlantı kolu olsun, bunu nasıl bir duruma koyarım, böylece işlevlerim gerektiğinde onu kapar ve sürekli olarak "aç" ve "kapat" etmeyin mi? Eğer evet ise, nasıl doğru yapılır?

Havuz oluşturma ve durumu bir duruma getirmem gerekiyor, böylece işlevler global durumdaki bağlantılar için havuzda sorgulanıyor mu? Yine, örnek gerçekten takdir edilecektir.

Teşekkürler.

cevap

1

bos 'resource-pool kütüphanesine göz atmak isteyebilirsiniz.

+0

Evet, ihtiyacım olan şey gibi geliyor :) Sorularımdaki kullanımı bana göstermek mümkün mü? İnternette herhangi bir örnek bulamıyorum. Ayrıca, bu rezorns havuzunu MVar'a yapıştırabilir miyim? Teşekkürler. –

2

Modül durumu veya uygulama durumu diye bir şey yoktur, bu nedenle başka bir strateji bulmanız gerekir. Db bağlantısını tutan çevre ile bir okuyucu monad tavsiye ederim. Bu bazı işlevlerde birkaç getiriye mal olacak, ama çok sağlam olacak.

Aşağıda basit bir sözde haskell örneği yer almaktadır.

type AppState = AppState { dbcon :: DatabaseConnection } 

type App = ReaderT AppState IO 

main = do 
    db <- makeNewDbConnection 
    runReaderT getDbTableCount $ AppState db 

getDbTableCount :: App Integer 
getDbTableCount = do 
    (count:_) <- runDb "select count(*) from table;" 
    return $ read count 

runDb :: String -> App [String] 
runDb req = do 
    con <- asks dbcon 
    return $ dbQuery con req 
İlgili konular