में मैं एक जावा प्रोग्रामर जो हास्केल सीखता हूँ।
मैं एक छोटे से वेब एप्लिकेशन HDBC के माध्यम से एक डेटाबेस के लिए Happstack और वार्ता का उपयोग करता है पर काम करते हैं।समवर्ती डीबी कनेक्शन पूल हास्केल
मैं और कार्यकारी चयन कार्यों लिखा है और मैं उन्हें इस तरह का उपयोग करें:
module Main where
import Control.Exception (throw)
import Database.HDBC
import Database.HDBC.Sqlite3 -- just for this example, I use MySQL in production
main = do
exec "CREATE TABLE IF NOT EXISTS users (name VARCHAR(80) NOT NULL)" []
exec "INSERT INTO users VALUES ('John')" []
exec "INSERT INTO users VALUES ('Rick')" []
rows <- select "SELECT name FROM users" []
let toS x = (fromSql x)::String
let names = map (toS . head) rows
print names
बहुत ही सरल रूप में आप देखते हैं। वहाँ क्वेरी, पैरामीटर और परिणाम है।
कनेक्शन निर्माण और प्रतिबद्ध/रोलबैक सामान चयन और निष्पादन के अंदर छिपा हुआ है।
यह अच्छा है, मैं इसके बारे में "तर्क" कोड में इसकी परवाह नहीं करना चाहता हूं।
exec :: String -> [SqlValue] -> IO Integer
exec query params = withDb $ \c -> run c query params
select :: String -> [SqlValue] -> IO [[SqlValue]]
select query params = withDb $ \c -> quickQuery' c query params
withDb :: (Connection -> IO a) -> IO a
withDb f = do
conn <- handleSqlError $ connectSqlite3 "users.db"
catchSql
(do r <- f conn
commit conn
disconnect conn
return r)
(\[email protected](SqlError _ _ m) -> do
rollback conn
disconnect conn
throw e)
बुरा अंक:
- एक नया कनेक्शन हमेशा हर कॉल के लिए बनाया जाता है - यह भारी बोझ पर प्रदर्शन को मारता है
- डीबी यूआरएल "users.db" hardcoded है - मैं नहीं कर सकता अन्य परियोजनाओं भर में इन कार्यों का पुन: उपयोग/संपादन
प्रश्न 1 ओ डब्ल्यू: कैसे कनेक्शन वाई का एक पूल शुरू करने की समवर्ती कनेक्शन की कुछ परिभाषित (न्यूनतम, अधिकतम) संख्या, तो चयन/निष्पादन कॉल के बीच कनेक्शन का पुन: उपयोग किया जाएगा?
प्रश्न 2: "users.db" स्ट्रिंग कॉन्फ़िगर करने योग्य कैसे करें? (कैसे ग्राहक कोड के लिए ले जाने के लिए?)
यह एक पारदर्शी सुविधा होना चाहिए: उपयोगकर्ता कोड स्पष्ट कनेक्शन हैंडलिंग/रिलीज आवश्यकता नहीं होनी चाहिए।
मेरे पास आपके लिए पूर्ण उत्तर नहीं है, लेकिन आपकी समस्या यह है कि आपने कनेक्शन को गलत तरीके से समझाया है। आप शायद इसे रीडर-जैसी संरचना में रखना चाहते हैं, ताकि यह प्रत्येक क्वेरी को पारित किया जा सके। – jrockway
हम्म, एसक्यूएल ऑपरेशंस सभी 'आईओ' मोनैड में फंस गए हैं, तो शायद 'रीडर टीओ'? उचित लगता है। – ephemient