Как найти источник данных JNDI из-за пределов веб-контейнера?
У меня установлена следующая среда:
- Java 1.5
- Сервер приложений Sun 8.2
- Oracle 10 XE
- Struts 2
- Hibernate
Мне интересно узнать, как я могу написать код для Java-клиента (т.е. вне веб-приложения), который может ссылаться на источник данных JNDI, предоставляемый сервером приложений.
Порты для Sun Application Server все по умолчанию. В конфигурации сервера есть источник данных JNDI с именем jdbc/xxxx, но я заметил, что в конфигурации Hibernate для веб-приложения вместо этого используется имя java: comp/env/jdbc/xxxx.
Большинство примеров, которые я видел до сих пор, включают в себя код типа
Context ctx = new InitialContext();
ctx.lookup("jdbc/xxxx");
Но похоже, что я использую неправильное имя JNDI, или мне нужно настроить jndi.properties или другой файл конфигурации, чтобы правильно указать на прослушиватель? У меня есть appserv-rt.jar с Sun Application Server, в котором есть jndi.properties внутри него, но он, похоже, не помогает.
Здесь есть аналогичный вопрос, но он не дает никакого кода/означает, что iBatis автоматически получает источник данных JNDI: Доступ к источнику данных из внешнего веб-контейнера (через JNDI)
Ответы
Ответ 1
Я застрял в этой же проблеме. Я написал небольшой учебник. В основном вам необходимо создать собственную реализацию объектов DataSource и добавить их в свой собственный исходный контекст. Здесь приведены примеры источников:
Запуск Beans Локально, используя источники данных Application Server
Ответ 2
Если вы говорите, что какое-то общее генерирующее Java-приложение работает за пределами контейнера, вам не повезло. Эффективно вам нужно будет настроить собственную реализацию JNDI, используя собственный пул соединений и т.д.
Однако вы можете писать Java EE "автономные" приложения. Это приложения, которые запускаются в клиентском приложении Java EE. В основном это приложение, которое развертывается и упаковывается, но затем выполняется с помощью запуска, предоставленного вашим контейнером Java EE.
При работе в среде клиентского приложения все ресурсы сервера приложений (пулы подключений, EJB, очереди и т.д.) доступны для вашего приложения так же, как если бы они были развернуты на сервере приложений.
Здесь приведена небольшая учебная документация для Sun App Server 8.2, которая представляет собой контейнер J2EE 1.4.
Если бы это было возможно, я бы настоятельно предложил перейти на Glassfish v2.1, просто более современный, лучше всего вокруг сервера, который должен развернуть ваши приложения как можно точнее, так как это потомок 8.2.
Ответ 3
Попробуйте простой 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.
Ответ 4
Вы хотите Application Client
В качестве альтернативы вы можете установить обычное JDBC-соединение от своего автономного клиента, который может быть проще создать, но вам нужно будет сконфигурировать данные о соединении в клиенте и не сможете повторно использовать настройки с вашего сервера приложений.
Ответ 5
Это может быть немного поздно для вас, но я использовал Simple-JNDI library в течение многих лет с конкретной целью, которую вы упомянули. Я не уверен, что у него есть все параметры, которые могут вам понадобиться, но это было достаточно для моих утилит командной строки.