потокобезопасность AbstractRoutingDataSource с пружинной загрузкой - PullRequest
0 голосов
/ 07 сентября 2018

как использовать соединение с несколькими базами данных в нескольких потоках ..

Я знаю, как динамически использовать соединение с базой данных с routingdataSource. но я думаю, что это не потокобезопасность, потому что класс статический. !!!

// first thread

ContextHolder.set("firstId");
mapper.select();
ContextHolder.clear(idFirst);


 // second thread

ContextHolder.set("secondId");
mapper.select();
ContextHolder.clear(idFirst);



public class ContextHolder {
  private static ThreadLocal<String> CONTEXT = new ThreadLocal<>();

  public static void set(String dbType) {
      CONTEXT.set(dbType);
  }

  public static String getClientDatabase() {
      return CONTEXT.get();
  }

  public static void clear() {
      CONTEXT.remove();
  }
}

как этот код.

    public class Poller implements Runnable {

        @Override
        public List<Map<String, Object>> getNext() {
            Map<String, Object> params = new HashMap<>();
            ContextHolder.set(dbConnectionId);
            List<Map<String, Object>> list = blogMapper.findAll(params)
            ContextHolder.clear();
            return list;
        }

    ....
    }

1 Ответ

0 голосов
/ 08 сентября 2018

The

 private static ThreadLocal<String> CONTEXT = new ThreadLocal<>();

создать локальную переменную потока. Это означает, что то, что вы помещаете внутрь, привязано к определенному потоку, и когда вы получаете что-то, это то, что в этом потоке возвращается.

Например, в потоке 1 вы устанавливаете:

CONTEXT.set(1);

в теме 2, которую вы установили:

CONTEXT.set(2);

и более поздние нити печатают то, что внутри с

CONTEXT.get();

будет напечатано 1 для потока 1 и 2 для потока 2.

Так что теперь, если вы используете стандартную синхронную модель, это нормально, если вы не забудете очистить значение при вводе и / или выходе из запроса.

Как только вы используете async (реактивный, исполнитель, ...), он завершится неудачей, так как часть вашего процесса будет запущена в другом потоке.

...