2012-03-23 15 views
6

कहें, मेरे पास एक सरल ऐप है जो डेटाबेस के साथ बातचीत करने के लिए एचडीबीसी का उपयोग करता है। यह एक स्नैप ऐप या कमांड लाइन ऐप हो सकता है। मुझे इस पर एक सामान्य दृश्य चाहिए - स्नैप या कुछ विशिष्ट नहीं। एक अच्छा उदाहरण "रियल वर्ल्ड हास्केल" का अध्याय 22 होगा।हास्केल: एचडीबीसी, कनेक्शन स्थिति और संभवतः पूल

तो मैं एक अलग डीबीएचएस फ़ाइल में कनेक्ट, सेव आर्टिकल, getArticle इत्यादि जैसे मेरे सभी एसक्यूएल संबंधित कार्यों को छुपा दूंगा। सभी डीबी फ़ंक्शन एक कनेक्शन के रूप में कनेक्शन हैंडल लेते हैं।

अब, मैं एक बार कनेक्शन कैसे शुरू करूंगा और इसे एक राज्य में रखूंगा ताकि सभी डीबी कार्य अलग-अलग कनेक्शन शुरू किए बिना इसका उपयोग कर सकें? क्या यह संभव है? हो सकता है कि मैं गलत सोच रहा हूं या ओओ अवधारणाओं को ध्यान में रख रहा हूं लेकिन ... मैं अपने कनेक्शन को "प्रारंभ करना" चाहता हूं (जैसे आप ओओ में एक ऑब्जेक्ट शुरू करेंगे)। मैं नहीं चाहता कि प्रत्येक डीबी फ़ंक्शन नए कनेक्शन को बनाने और बंद कर दे।

क्या मुझे पूल बनाने और कनेक्शन को हैंडल के बजाय तर्क के रूप में कार्यों को पास करना है? ऐसा करने का सबसे सरल उदाहरण क्या है?

चाहे यह पूल या कनेक्शन हैंडल है, मैं इसे एक राज्य में कैसे रखूं ताकि मेरे कार्यों को जरूरी होने पर इसे पकड़ लिया जाए और फिर से "खुले" और "बंद" न करें? यदि हां, तो यह सही तरीके से कैसे किया जाता है?

क्या मुझे पूल बनाने और इसे राज्य में रखने की आवश्यकता है, तो क्या कार्य वैश्विक राज्य से कनेक्शन के लिए पूल से पूछताछ करता है? फिर, उदाहरण वास्तव में सराहना की जाएगी।

धन्यवाद।

उत्तर

1

आप बोस 'resource-pool लाइब्रेरी पर एक नज़र डालना चाहते हैं।

+0

हां, मुझे यह चाहिए कि यह मेरी आवाज़ है :) क्या मुझे मेरे प्रश्न के भीतर उपयोग दिखाना संभव होगा? मुझे नेट पर कोई भी उदाहरण नहीं मिल रहा है। इसके अलावा, क्या मैं इस रिसॉर्ट पूल को एमवीआर में रख सकता हूं और इसे पास कर सकता हूं? धन्यवाद। –

2

मॉड्यूल राज्य या एप्लिकेशन स्थिति जैसी कोई चीज़ नहीं है, इसलिए आपको एक अन्य रणनीति मिलनी है। डीबी कनेक्शन रखने वाले वातावरण के साथ, मैं एक पाठक मोनड की सलाह देता हूं। इससे आपको कुछ कार्यों में कुछ रिटर्न मिलेगा, लेकिन यह बहुत ठोस होगा।

नीचे एक साधारण छद्म-हैकेल उदाहरण है।

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 
संबंधित मुद्दे