работа с картой фабрик сессий Hibernate в весенней системе транзакций - PullRequest
0 голосов
/ 24 октября 2011

Я делаю обновление до существующей системы, в которой работает postgres.

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

теперь для проблемы. Я удалил безумную логику соединения с базой данных, которую они использовали (похоже, они пытались создать менеджер транзакций с нуля) и заменил ее на Spring Transactions. так что теперь я вынужден иметь дело с такими циклами:

for(archive a : yearsArchived){
  session s = sessionfactorymap.get(a).getcurrentsession();
  (find data and copy to temporary table for report)
}

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

org.hibernate.HibernateException: No CurrentSessionContext configured!
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:685)
    at parity.model.ReportThread.generate(ReportThread.java:47)
    at parity.model.ReportThread.run(ReportThread.java:31)

(да, я знаю, это многопоточное веб-приложение, предыдущие разработчики были новичками)

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

Ответы [ 2 ]

0 голосов
/ 25 октября 2011

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

спасибо

0 голосов
/ 24 октября 2011

Spring's HibernateTransactionManager не поддерживает ваш случай из коробки, потому что он может управлять только одним SessionFactory.

Таким образом, у вас могут быть разные менеджеры транзакций для разных фабрик сеансов, но тогда они не могут участвовать в одной транзакции.Если все в порядке, см. 10.5.6.2 Менеджеры множественных транзакций с @ Transactional .

В противном случае, возможно, самый простой способ заставить ваше SessionFactories участвовать в одной транзакции - использовать JTATransactionManagerс некоторой автономной реализацией JTA ( Atomikos , Bitronix , JOTM ).

Также обратите внимание на концепцию 1PC Optimization .Я думаю, что реализация JTA должна иметь возможность применить ее в вашем случае, чтобы уменьшить накладные расходы, представленные JTA.

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