Popularity
1.0
Declining
Activity
0.0
Stable
1
1
1

Monthly Downloads: 16
Programming language: Haskell
License: BSD 3-clause "New" or "Revised" License
Tags: Database     Multipool    

multipool alternatives and similar packages

Based on the "multipool" category.
Alternatively, view multipool alternatives based on common mentions on social networks and blogs.

Do you think we are missing an alternative of multipool or a related project?

Add another 'multipool' Package

README

Multipool - Generalized machinery for replicated systems

Multipass

Multipool lets you manage connections for multiple masters and/or read replicas in Haskell via a unified interface.

Currently supported backends

persistent-postgresql is supported via the multipool-persistent and multipool-persistent-postgresql packages.

Example

import Database.Persist
-- from postgresql-common-persistent
import Database.Persist.Postgresql.Common
-- from multipool-persistent-postgresql
import Data.MultiPool.Persist.Postgresql

share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
User
    name String
    lastLsn LSN Maybe default=pg_current_wal_lsn()
    deriving Show
|]

doSomeQueries :: IO ()
doSomeQueries = do
  let masterConn = "host=localhost port=5432 user=postgres"
      replicaConn = "host=localhost port=5433 user=postgres"
  mp <- runNoLoggingT $ initMultiPool connStr 1 [(mkInstanceName "replica", connStr, 1)]

  user <- runWriteAny mp $ do
    migrateAll
    k <- insert $ User "bob" Nothing
    getJust k

  -- We got us a user.
  print r

  -- At this point maybe the user row has replicated... Or maybe not? Can't say for sure...
  mr <- runReadAny mp $ get userK
  print mr

  -- Just a little time to let replication happen...
  threadDelay 50000

  -- Get current replication status for each replica.
  -- In real-world implementations, there would be a background
  -- thread or something of the sort periodically updating an IORef
  -- or other caching mechanism.
  replicationStatusByReplica <- gatherLSNs b
  replicatedUser <- runReadCurrent mp replicationStatusByReplica (userLastLsn $ entityVal u) $ getJust (entityKey u)
  -- This always should be @Just user@ since we are only selecting from sufficiently replicated sources (or master as a fallback if no replicated sources exist.)
  print replicatedUser