2009-10-23 4 views
15

Я хотел бы настроить DataSource с помощью JNDI в приложении Java SE. Каков наилучший способ сделать это?Из контейнера Источник данных JNDI

До сих пор я сталкивался 2 проекта:

  1. Apache Naming. На странице проекта есть конкретный пример для настройки источника данных, но похоже, что проект сверхновый и больше не активен.
  2. JBossNS. Похоже, что просто настроить JNDI только для локального использования, используя LocalOnlyContextFactory, но я не нашел никаких документов о том, как настроить источник данных.

Если возможно, я хотел бы также настроить источник данных с помощью диспетчера транзакций JTA (используя JOTM?).

ответ

10

Почему вы используете JNDI для этого? Дело не в том, что это плохое решение, если у вас есть провайдер, но есть альтернативы, такие как инъекция зависимостей (IoC: через Spring или Guice).

Доступ к данным о данных JDBC весны описан here. Самое замечательное в том, что вы можете использовать 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> 
+0

Я должен был упомянуть об этом в сообщении. Я пишу компонент, который будет работать в веб-приложении, но я хотел бы также иметь возможность вызывать его из простых приложений командной строки Java SE и тестов JUnit. Моя первоначальная идея состояла в том, что я должен был бы настроить необходимую среду (JNDI, DBCP, JTA), чтобы код компонента всегда мог полагаться на них. Я не хочу вводить в приложение совершенно новую структуру, такую ​​как Spring, но это может быть вариант. Существуют ли конкретные страницы документации по весне, связанные с этим, которые вы бы рекомендовали? – nikita

+0

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

+0

Благодарим вас за подробности. У меня недостаточно баллов, чтобы отметить ответ как полезный: | – nikita

3

Очень простой в использовании решение для автономного JNDI является simple-jndi. Он работает как шарм, пока вам это нужно только в одной JVM, так как это не сетевой сервер.

1

Версия Simple-JNDI, на которую ссылается klenkes74, уже не находится в активной разработке. Поскольку я столкнулся с некоторыми проблемами, я разветвил его, исправил некоторые ошибки и реализовал некоторые новые функции. Я уже использовал старую версию не только для тестирования, но и для производства, потому что я предпочитаю шаблон Service Locator над Injection Dependency Injection, хотя в последнее время он более моден.

Вы можете легко использовать Simple-JNDI для определения DataSource или пула соединений декларативно и связать его с JNDI Context.

Определить jndi.свойства файла в вашем пути к классам:

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 

Теперь вы можете получить доступ к DataSource внутри вашего кода таким образом:

InitialContext ctxt = new InitialContext(); 
    DataSource ds = (DataSource) ctxt.lookup("name_of_your_datasource"); 

Для получения дополнительной информации см https://github.com/h-thurow/Simple-JNDI