Параллельный пул соединений с БД в 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)

Плохие очки:

a new connection is always created for every call - this kills performance on heavy load DB url "users.db" is hardcoded - I can't reuse these functions across other projects w/o editing

QUESTION 1: как ввести пул соединений с некоторым определенным (минимальным, максимальным) числом одновременных соединений, чтобы соединения использовались повторно между вызовами select / exec?

QUESTION 2: Как сделать & quot; users.db & quot; настраиваемая строка? (Как перенести его в код клиента?)

Это должна быть прозрачная функция: пользовательский код не должен требовать явной обработки / освобождения соединения.

Ответы на вопрос(3)

Ваш ответ на вопрос