Из источника данных 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>

Ответ 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