私はHaskellを学ぶJavaプログラマーです。
私はHappstackを使用し、HDBCを介してデータベースと通信する小さなWebアプリで作業しています。
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
ご覧のとおり、非常にシンプルです。クエリ、パラメータ、結果があります。
接続の作成とコミット/ロールバックは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)
悪い点:
- 呼び出しごとに常に新しい接続が作成されます-これにより、高負荷でのパフォーマンスが低下します
- DBURL「users.db」はハードコードされています-編集せずに他のプロジェクトでこれらの関数を再利用することはできません
質問1:定義された(最小、最大)数の同時接続で接続のプールを導入して、接続がselect / exec呼び出し間で再利用されるようにするにはどうすればよいですか?
質問2:「users.db」文字列を構成可能にする方法は?(クライアントコードに移動する方法は?)
これは透過的な機能である必要があります。ユーザーコードは、明示的な接続処理/解放を必要としないはずです。