Как убедиться, что методы, вызываемые из одного потока, используют один и тот же сеанс БД - PullRequest
2 голосов
/ 06 января 2010

В нашей системе у нас есть многопоточный процессор обработки. Во время обработки каждый поток вызывает методы для извлечения данных из базы данных. Мы определили, что производительность значительно улучшится, если методы, вызываемые из одного и того же потока, используют один и тот же сеанс БД (сеансы, конечно, приходят из пула).

Есть ли в Spring какой-нибудь стандартный способ обеспечить это, или мы должны придумать собственное решение?

ОБНОВЛЕНИЕ: забыл упомянуть, что одни и те же методы можно вызывать в другом контексте, где они должны использовать стандартный способ получения сеанса из пула

Ответы [ 4 ]

2 голосов
/ 06 января 2010

Spring имеет класс с именем TransactionSynchronizationManager. Он сохраняет текущий Session в ThreadLocal. TransactionSynchronizationManager не рекомендуется для использования разработчиком, но вы можете попробовать его использовать.

Session session = ((SessionHolder) 
   TransactionSynchronizationManager.getResource(sessionFactory)).getSession();

(если вы используете EntityManager, просто замените "Session" на "EntityManager").

Вы можете ввести sessionFactory в ваш бин - это для каждого приложения.

Взгляните на это обсуждение.

Другие опции, которые, на мой взгляд, предпочтительнее ручной обработки потоков:

2 голосов
/ 12 января 2010

Я нигде не видел Весну в вашем вопросе. Поэтому я предполагаю, что вам нужна простая утилита для этого.

class SessionUtil {
    private ThreadLocal currentSession;

    public Session getCurrentSession() {
        if(currentSession.get() == null) {
             Session s = //create new session
             currentSession.set(s);
        }
        return (Session)currentSession.get();
    }
}

Локальный поток гарантирует, что в одном и том же потоке это всегда один и тот же сеанс. Если вы используете Spring, то классы / утилиты, упомянутые выше (в других ответах), должны быть идеальными.

0 голосов
/ 12 января 2010

Spring координирует сеансы базы данных, соединения и потоки через Transaction Framework (фактически, используя TransactionSynchronizationManager - см. Описание здесь - но вы действительно не не хочу связываться с этим напрямую, это страшно). Если вам нужно координировать свои потоки, то это самый простой способ сделать это.

Однако, как вы решите использовать фреймворк, зависит от вас.

0 голосов
/ 06 января 2010

Spring 3.0 имеет концепцию bean-объекта в области потоков (однако, эта область не зарегистрирована по умолчанию, см. Документы): 3.5 Области действия bean , 3.5.5.2 Использование настраиваемой области

EDIT : Я говорю об этом:

Фасоль с нитью и нитью Начиная с Spring 3.0, объем потока доступен, но по умолчанию не зарегистрировано. Для большего информация, см. документацию для SimpleThreadScope . За инструкция о том, как это зарегистрировать или любой другой пользовательской области, см. Раздел 3.5.5.2, «Использование пользовательских сфера».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...