Concurrent access to several Ecto Dynamic Repositories

I’d like to connect to different databases on the fly based on details obtained at runtime. The application could be talking to several of these simultaneously.

The advice given in the Ecto documentation on using put_dynamic_repo sounds like it would be fine for talking to a single runtime-configured database at a time - the Ecto repo module, let’s call it MyApp.DynamicRepo, can be pointed at or use different databases at different times. However it would be only one at a time.

I could put a genserver in front of it to serialise access but that’s likely to be a bottleneck. Or I could hard code (or generate at runtime) a group of repo modules to serve as a “repo pool” and have all the database access code receive a repo module to use for its calls.

Are there saner alternatives that I’m missing here?

put_dynamic_repo/1 is per-process, so you can spin up 100 processes and all 100 can use a different repo by calling put_dynamic_repo/1.

One thing you could do is use ETS (or Registry, which IIRC uses monitors so automatically handles process bookkeeping) to look up the repo you want and set the dynamic repo to the returned pid.

3 Likes

Right, I see it uses Process.put/2, definitely missed that, thanks!