Как мне найти источник данных JNDI вне веб-контейнера? - PullRequest
18 голосов
/ 26 марта 2010

У меня настроена следующая среда:

  • Java 1.5
  • Сервер приложений Sun 8.2
  • Oracle 10 XE
  • Распорки 2
  • Hibernate

Мне интересно узнать, как я могу написать код для клиента Java (т.е. вне веб-приложения), который может ссылаться на источник данных JNDI, предоставленный сервером приложений.

Все порты сервера приложений Sun по умолчанию. В конфигурации сервера есть источник данных JNDI с именем jdbc / xxxx, но я заметил, что в конфигурации Hibernate для веб-приложения вместо этого используется имя java: comp / env / jdbc / xxxx.

Большинство примеров, которые я видел до сих пор, включают код вроде

Context ctx = new InitialContext();
ctx.lookup("jdbc/xxxx");

Но, похоже, я использую неверное имя JNDI или мне нужно настроить jndi.properties или другой файл конфигурации, чтобы правильно указывать на слушателя? У меня есть appserv-rt.jar с сервера приложений Sun, внутри которого есть jndi.properties, но, похоже, это не помогает.

Здесь аналогичный вопрос, но он не дает никакого кода / относится к тому, чтобы iBatis автоматически получал источник данных JNDI: Доступ к источнику данных из внешнего веб-контейнера (через JNDI)

Ответы [ 5 ]

17 голосов
/ 09 июня 2011

Я застрял на той же самой проблеме. Я написал небольшой учебник. По сути, вам нужно создать собственную реализацию объектов DataSource и добавить их в свой собственный начальный контекст. Вот примеры источников:

Запуск локальных компонентов, использующих источники данных сервера приложений

2 голосов
/ 16 января 2017

Попробуйте Simple-JNDI. Это дает вам реализацию службы JNDI в оперативной памяти и позволяет заполнять среду JNDI объектами, определенными в файлах свойств. Также поддерживается загрузка источников данных или пулов соединений, настроенных в файле.

Чтобы получить пул соединений, вы должны создать файл, подобный этому:

type=javax.sql.DataSource
driver=com.sybase.jdbc3.jdbc.SybDriver
pool=myDataSource
url=jdbc:sybase:Tds:servername:5000
user=user
password=password

В вашем приложении вы можете получить доступ к пулу через

Context ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup("path/to/your/connectionPool");

Я использовал Simple-JNDI для этой цели уже много лет. Но он больше не находится в стадии активной разработки. Поскольку я обнаружил некоторые проблемы, касающиеся общих контекстов (особенно при использовании источников данных), я решил разветвить исходный проект и добавить некоторые новые функции. Сейчас есть 0.13.0. Вы можете найти больше об этом в https://github.com/h-thurow/Simple-JNDI.

1 голос
/ 26 марта 2010

Если вы говорите какое-то обычное Java-приложение, работающее вне контейнера, то вам не повезло. По сути, вам необходимо настроить собственную реализацию JNDI с собственным пулом настройки соединений и т. Д.

Однако вы можете писать "автономные" приложения Java EE. Это приложения, которые работают в клиентском приложении Java EE. По сути, это приложение, которое развертывается и упаковывается, но затем выполняется с помощью средства запуска, предоставляемого вашим контейнером Java EE.

При работе в среде клиента приложения все ресурсы сервера приложений (пулы соединений, EJB, очереди и т. Д.) Доступны для вашего приложения так же, как если бы код был развернут на сервере приложений.

Здесь является некоторой учебной документацией для Sun App Server 8.2, которая является контейнером J2EE 1.4.

Если это возможно, я бы настоятельно рекомендовал перейти на Glassfish v2.1, просто более современный, более совершенный сервер, который должен развертывать ваши приложения так, как он есть, поскольку он является потомком 8.2.

0 голосов
/ 04 апреля 2014

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

0 голосов
/ 26 марта 2010

То, что вы хотите, это клиент приложения

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

...