У нас есть приложение, которому необходим доступ к базе данных, принадлежащей другой команде.Эта база данных имеет безопасность внутри базы данных (триггеры, разрешения таблиц и т. Д.), Поэтому нам необходимо установить соединение с базой данных, используя то же имя пользователя / пароль, что и для нашего EJB.
Мы работаем на JBoss5.1.Стандартные решения Java EE предпочтительнее, но ответы подойдут только для JBoss.
На данный момент наше решение
- Создать источник данных в JBoss без пароля для идентификатора пользователя
- Требуетсяклиент для передачи своего имени пользователя / пароля в EJB (EJB является сессионным компонентом с состоянием (SFSB) и запоминает имя пользователя / пароль)
- Сессионный компонент создает новое соединение, используя
DataSource.getConnection(String, String)
- Соединение «создается» из источника данных в начале каждого запроса (реализация источника данных может повторно использовать существующее соединение)
Основная проблема, которую мы имеем, это соединениепулы.Пул соединений JBoss не управляет отдельными пулами для каждого имени пользователя - все они выбрасываются в 1 большой пул, и имя пользователя проверяется после извлечения объекта из пула (внутри InternalManagedConnectionPool
).Если имена пользователей не совпадают, то соединение удаляется из пула и уничтожается.Это означает, что, как только у нас будет 2 пользователя, есть 50% -ная вероятность, что любое соединение, помещенное в пул, будет разрушено при следующем доступе.И по мере того, как мы увеличиваем количество пользователей, эти шансы становятся намного хуже.
Мы не можем просто создать 1 соединение в SFSB и сохранить его, потому что JBoss слишком умен для нас, и он обнаруживает, что мы 'Мы оставили соединение открытым и автоматически возвращаем его в пул для нас, поэтому следующий запрос к SFSB завершится неудачно с «не связанным» соединением.
Было бы также неплохо, если бы мы могли просто заставить JBossсоздайте соединение как «текущий пользователь, вошедший в систему», но решение, которое у нас есть, терпимо.
Мой поисковый запрос не смог найти никаких рекомендуемых шаблонов для такого рода действий.Кажется, все предполагают, что вы хотите, чтобы ваш источник данных использовал одного пользователя для всех соединений (что хорошо, когда это возможно, но я не могу сделать это в этом случае)
Единственные решения, с которыми я могу придумать
- Не использовать предоставленный контейнером источник данных.Поместите URL-адрес JDBC в значение конфигурации и создайте соединения самостоятельно (возможно, с помощью Spring)
- Привязка другой реализации источника данных (возможно, пользовательской) к JNDI
Кто-нибудь есть лучшие решения?Или указатели на рекомендуемые практики в этой области?
(база данных - Sybase ASE 15, но я сомневаюсь, что это имеет какое-либо значение для решения)