Я думаю, что лучшим способом было бы создать SessionFactory
для каждого источника данных с возможно объединенными соединениями - это то, что eqbridges предложило в его ответе.
Теперь Hibernate имеет хук ConnectionProvider
, поэтому я полагаю, что вы могли бы написать реализацию, которая возвращала бы Connection
s в разные источники данных, в зависимости от текущего потока выполнения и некоторых дополнительных параметров. Теоретически, вы можете иметь один экземпляр SessionFactory
, который будет использовать разные соединения с разными базами данных, предоставленные вашей пользовательской реализацией ConnectionProvider
. Но один SessionFactory
содержит довольно много данных, и эти данные затем используются Hibernate для внутреннего использования при открытии Session
для единицы работы. Кроме того, с ним также связан кэш второго уровня.
К сожалению, как фабрика и Session
s, которые вы открываете из нее, будут вести себя перед лицом такого провайдера, никто не догадывается. Для меня это похоже на хак, и я сомневаюсь, что это когда-либо считалось жизнеспособным вариантом использования для SessionFactory
. Это может привести к всевозможным, возможно очень незначительным, ошибкам или повреждению данных.
С другой стороны, обязательно точно измерьте стоимость создания нескольких SessionFactories
- она может быть не такой высокой, как вы думаете. Обязательно сравните это со стоимостью простого открытия необходимых соединений JDBC. Я не знаю, какие результаты вы можете получить, но я думаю, что вы должны быть уверены в производительности, прежде чем прибегнуть к более хакерским решениям.