Параллельный пул соединений с БД в Haskell
Я программист на Java, который изучает Haskell.
Я работаю над небольшим веб-приложением, которое использует Happstack и общается с базой данных через HDBC.
Я написалselect а такжеexec функции, и я использую их так:
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
Очень просто, как видите. Естьquery, params а такжеresult.
Создание соединения и фиксация / откат скрыты внутри select и exec.
Это хорошо, я не хочу заботиться об этом в моей "логике" код.
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)
(\e@(SqlError _ _ m) -> do
rollback conn
disconnect conn
throw e)
Плохие очки:
QUESTION 1: как ввести пул соединений с некоторым определенным (минимальным, максимальным) числом одновременных соединений, чтобы соединения использовались повторно между вызовами select / exec?
QUESTION 2: Как сделать & quot; users.db & quot; настраиваемая строка? (Как перенести его в код клиента?)
Это должна быть прозрачная функция: пользовательский код не должен требовать явной обработки / освобождения соединения.