Две декларативных модели SQLAlchemy должны совместно использовать тот же declarative_base ()?

Используйте ConcurrentHashMap, чтобы вы могли использовать putIfAbsent. Вам не нужно кодировать AtomicInteger для синхронизации.

   public final ConcurrentMap<String, AtomicInteger> userSessions =
       new ConcurrentHashMap<String, AtomicInteger>();

   public void registerUser(String userLogin) {
       AtomicInteger newCount = new AtomicInteger(1);
       AtomicInteger oldCount = userSessions.putIfAbsent(userLogin, newCount);
       if (oldCount != null) {
           oldCount.incrementAndGet();
       }
   }

   public void unregisterUser(String userLogin) {
       AtomicInteger sessionCount = userSessions.get(userLogin);
       if (sessionCount != null) {
           sessionCount.decrementAndGet();
       }
   }

   public boolean isUserRegistered(String userLogin) {
       AtomicInteger sessionCount = userSessions.get(userLogin);
       return sessionCount != null && sessionCount.intValue() > 0;
   }

Обратите внимание, это утечка ...

Попытка в версии без утечек:

   public final ConcurrentMap<String, Integer> userSessions =
       new ConcurrentHashMap<String, Integer>();

   public void registerUser(String userLogin) {
       for (;;) {
           Integer old = userSessions.get(userLogin);
           if (userSessions.replace(userLogin, old, old==null ? 1 : (old+1)) {
                break;
           }
       }
   }
   public void unregisterUser(String userLogin) {
       for (;;) {
           Integer old = userSessions.get(userLogin);
           if (old == null) {
               // Wasn't registered - nothing to do.
               break;
           } else if (old == 1) {
               // Last one - attempt removal.
               if (userSessions.remove(userLogin, old)) {
                   break;
               }
           } else {
               // Many - attempt decrement.
               if (userSessions.replace(userLogin, old, old-1) {
                   break;
               } 
           }
       }
   }
   public boolean isUserRegistered(String userLogin) {serLogin);
       return userSessions.containsKey(userLogin);
   }
5
задан joeforker 19 October 2009 в 16:34
поделиться

2 ответа

Я успешно использую разные декларативные основы в одной сессии. Это может быть полезно при использовании нескольких баз данных: каждая база создается с собственными метаданными, и все метаданные привязаны к отдельной базе данных. Некоторые из ваших декларативных баз могут определять дополнительные методы или использовать другой метакласс для установки расширений.

4
ответ дан 14 December 2019 в 08:55
поделиться

Отдельные базовые классы будут работать нормально.

Вы должны быть осторожны, когда они используют разные соединения с базой данных, в этом случае вы не можете использовать соединения в двух базах данных - каждый запрос должен поступать в одну базу данных.

3
ответ дан 14 December 2019 в 08:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: