2012-03-23 2 views
6

HDB를 사용하여 데이터베이스와 상호 작용하는 간단한 앱이 있습니다. 스냅 응용 프로그램이나 명령 줄 응용 프로그램 일 수 있습니다. 나는 이것에 대한 일반적인 견해를 원한다. 좋은 예가 "Real World Haskell"의 22 장입니다.하스켈 : HDBC, 연결 상태 및 가능한 풀

그래서 연결, saveArticle, getArticle 등의 모든 SQL 관련 함수를 별도의 DB.hs 파일에 숨겨 둡니다. 모든 DB 함수는 연결 핸들을 인수로 취합니다.

이제 연결을 초기화하고 모든 DB 기능이 연결을 개별적으로 시작하지 않고 사용할 수있게하려면 어떻게해야합니까? 이것이 가능합니까? 어쩌면 잘못 생각했거나 OO 개념을 염두에두고 있지만 ... "OO에서 객체를 초기화하는 것처럼"내 연결을 "초기화"하고 싶습니다. 모든 DB 함수가 새 연결을 만들고 닫는 것을 원하지 않습니다.

풀을 만들고 연결 핸들 대신 인수로 함수에 풀을 전달해야합니까? 가장 간단한 예제는 무엇입니까?

풀 또는 연결 핸들인지 여부에 관계없이 내 기능을 필요할 때마다 잡아서 반복적으로 "열거 나 닫지"않는 상태로 만드는 방법은 무엇입니까? 그렇다면 제대로 된 방법은 무엇입니까?

풀을 만들어 전역 상태의 연결에 대해 풀에 쿼리하는 기능이 있어야합니까? 다시 한 번 예가 정말 감사 할 것입니다.

감사합니다.

답변

1

bos 'resource-pool 라이브러리를 살펴볼 수 있습니다.

+0

네,이 소리가 필요합니다 :) 내 질문에 사용법을 보여줄 수 있습니까? 나는 그물에 어떤보기든지 찾아 낼 수있을 것 같습니다. 또한, 내가 MVar 에이 resorse 풀을 스틱과 주위에 전달할 수 있습니까? 감사. –

2

모듈 상태 또는 응용 프로그램 상태와 같은 것이 없으므로 다른 전략을 찾아야합니다. DB 연결을 유지하는 환경에서 독자 모나드를 많이 추천합니다. 그러면 일부 기능에서 약간의 수익이 발생하지만 매우 견고합니다.

다음은 간단한 의사 - 잡음 예제입니다.

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