Из источника данных JNDI контейнера
Я хотел бы настроить DataSource с помощью JNDI в приложении Java SE. Каков наилучший способ сделать это?
До сих пор я сталкивался с двумя проектами:
- Именование Apache. На странице проекта есть конкретный пример для настройки источника данных, но похоже, что проект сверхновый и больше не активен.
- JBossNS. Похоже, что легко настроить JNDI только для локального использования, используя
LocalOnlyContextFactory
, но я не нашел никаких документов о том, как настроить источник данных.
Если возможно, я хотел бы также настроить источник данных с помощью диспетчера транзакций JTA (используя JOTM?).
Ответы
Ответ 1
Почему вы используете JNDI для этого? Это не плохое решение, если у вас есть провайдер, но есть альтернативы, такие как инъекция зависимостей (IoC: через Spring или Guice).
Доступ к данным JDBC Spring описан здесь. Самое замечательное, что вы можете использовать Spring для ввода DataSource
в свой код:
<bean class="com.my.Persister">
<property name="dataSource" ref="dataSource" />
</bean>
Источник данных можно определить с помощью JNDI-поиска:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource" />
В тестовой среде вы можете напрямую ввести источник данных:
<bean id="dataSource" class="apache.db.PoolingDataSource">
<!-- config goes here -->
</bean>
Ответ 2
Эти ссылки довольно старые, но могут помочь использовать jnpserver (поставщик услуг именования JBoss):
Ответ 3
Очень простое в использовании решение для автономного JNDI simple-jndi. Он работает как шарм, пока вам это нужно только в одном JVM, поскольку в нем нет сетевого сервера.
Ответ 4
Версия Simple-JNDI, на которую ссылается klenkes74, уже не находится в активной разработке. Поскольку я столкнулся с некоторыми проблемами, я разветкил его, исправил некоторые ошибки и реализовал некоторые новые функции. Я уже использовал старую версию не только для тестирования, но и для производства, потому что я предпочитаю шаблон Service Locator над Injection Dependency Injection, хотя в последнее время он более моден.
Вы можете легко использовать Simple-JNDI для определения DataSource или пула соединений декларативно и привязать его к контенту JNDI.
Определите файл jndi.properties в вашем пути к классам:
java.naming.factory.initial=org.osjava.sj.SimpleContextFactory
org.osjava.sj.root=[absolute_or_relative_path_to_a_property_file]
Файл свойства выглядит так:
type=javax.sql.DataSource
driver=org.gjt.mm.mysql.Driver
url=jdbc:mysql://localhost/testdb
user=testuser
password=testing
Теперь вы можете получить доступ к своему источнику данных изнутри своего кода следующим образом:
InitialContext ctxt = new InitialContext();
DataSource ds = (DataSource) ctxt.lookup("name_of_your_datasource");
Для получения дополнительной информации см. https://github.com/h-thurow/Simple-JNDI