For each db server, add a common interface for the abstract call:
-module(db_server1).
...
do_something([Value1,Value2]) -> gen_server:call(db_handler, {do_something, "value1", "value2"}).
...
another not using gen server
-module(db_server2).
...
do_something([Value1,Value2]) -> something_else({do_something, "value1", "value2"}).
...
create a new process (gen_server: o) that receives as an init parameter a parameter that is used to select the db server and saves it in its state (for example, db_server2),
for each do_something function, implement a function such as:
do_something(Value1,Value2) -> gen_server:call(db_handler, {do_something, ["value1", "value2"]}).
...
handle_call({Func, Args}, _From, DB_server) ->
R = DB_server:F(Args),
{reply, R, DB_server}.
same for non-blocking interfaces using cast or equivalent
source
share