Как использовать JNDI DataSource от Tomcat весной?

159

В статье Spring Javadoc о DriverManagerDataSourceклассе говорится , что этот класс очень прост и рекомендуется

использовать JNDI DataSource, предоставленный контейнером. Такое DataSourceможет быть представлено как DataSourcebean-компонент в Spring ApplicationContext черезJndiObjectFactoryBean

Вопрос в том, как мне это сделать?

Например, если я хочу иметь DataSourceбин для доступа к моей пользовательской базе данных MySQL, что мне тогда потребуется? Что я должен написать в контексте конфигурации и т. Д.?

Сьюзан Чок
источник

Ответы:

302

Если используется конфигурация Spring на основе XML-схемы, выполните настройку в контексте Spring следующим образом:

<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:jee="http://www.springframework.org/schema/jee" xsi:schemaLocation="
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee.xsd">
...
<jee:jndi-lookup id="dbDataSource"
   jndi-name="jdbc/DatabaseName"
   expected-type="javax.sql.DataSource" />

В качестве альтернативы, настройте, используя простую конфигурацию bean:

<bean id="DatabaseName" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/DatabaseName"/>
</bean>

Вы можете объявить ресурс JNDI в файле tomcat server.xml, используя что-то вроде этого:

<GlobalNamingResources>
    <Resource name="jdbc/DatabaseName"
              auth="Container"
              type="javax.sql.DataSource"
              username="dbUser"
              password="dbPassword"
              url="jdbc:postgresql://localhost/dbname"
              driverClassName="org.postgresql.Driver"
              initialSize="20"
              maxWaitMillis="15000"
              maxTotal="75"
              maxIdle="20"
              maxAge="7200000"
              testOnBorrow="true"
              validationQuery="select 1"
              />
</GlobalNamingResources>

И ссылаться на ресурс JNDI из веб-сайта Tomcat context.xml следующим образом:

  <ResourceLink name="jdbc/DatabaseName"
   global="jdbc/DatabaseName"
   type="javax.sql.DataSource"/>

Справочная документация:

Изменить: Этот ответ был обновлен для Tomcat 8 и Spring 4. Было несколько изменений имени свойства для настройки пула ресурсов данных Tomcat по умолчанию .

kaliatech
источник
@skaffman Да, но вы предоставляете ссылку на справочную документацию Spring.
Этьен Мирет
какой файл вы имеете в виду под "Tomcat's web context.xml"?
Павел Недоба
1
@PavelNiedoba Tomcat использует «контекст» для настройки конкретного веб-приложения tomcat. Файл контекста и / или конфигурацию контекста можно разместить в разных местах, поэтому я не могу дать вам однозначного ответа. Распространенным местоположением является "/META-INF/context.xml". См. Раздел «Определение контекста» здесь: tomcat.apache.org/tomcat-8.0-doc/config/…
kaliatech
Ммм ... кажется, не работает для моего оракула DB, какие-либо различия с postgresql?
Фейт
1
@Phate Нет принципиальных отличий от Oracle против PostgreSQL на уровне JDBC / JNDI / Tomcat. Тем не менее, Oracle сильно отличается от PostgreSQL, когда речь заходит о деталях настройки клиент / сервер Oracle. Вне рамок оригинального вопроса / ответа. Предложите опубликовать новый вопрос с подробной информацией о том, что вы пробовали, конкретными версиями и сообщениями об ошибках. Пример: stackoverflow.com/questions/10388137/…
kaliatech
52

С механизмом SpringConfig Java вы можете сделать это так:

@Configuration
public class MainConfig {

    ...

    @Bean
    DataSource dataSource() {
        DataSource dataSource = null;
        JndiTemplate jndi = new JndiTemplate();
        try {
            dataSource = jndi.lookup("java:comp/env/jdbc/yourname", DataSource.class);
        } catch (NamingException e) {
            logger.error("NamingException for java:comp/env/jdbc/yourname", e);
        }
        return dataSource;
    }

}
Abdull
источник
2
Или используйте более специализированный JndiDataSourceLookup
Аренд v. Рейнерсдорф
21

Предполагая, что у вас есть определение источника данных "sampleDS" внутри вашей конфигурации tomcat, вы можете добавить следующие строки в свой, applicationContext.xmlчтобы получить доступ к источнику данных с помощью JNDI.

<jee:jndi-lookup expected-type="javax.sql.DataSource" id="springBeanIdForSampleDS" jndi-name="sampleDS"/>

Вы должны определить пространство имен и расположение схемы для jeeпрефикса, используя:

xmlns:jee="http://www.springframework.org/schema/jee"
xsi:schemaLocation="http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-3.0.xsd"
melihcelik
источник
15

Документация: C.2.3.1 <jee:jndi-lookup/>(простой)

Пример:

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>

Вам просто нужно узнать, с каким именем JNDI ваш appserver связывает источник данных. Это полностью зависит от сервера, обратитесь к документации на вашем сервере, чтобы узнать, как это сделать.

Не забудьте объявить jeeпространство имен в верхней части вашего bean-файла, как описано в C.2.3. Схема jee .

skaffman
источник
8

Еще одна особенность: вместо server.xml вы можете добавить тег «Ресурс» в
your_application / META-INF / Context.xml (в соответствии с документами tomcat ) следующим образом:

<Context>
<Resource name="jdbc/DatabaseName" auth="Container" type="javax.sql.DataSource"
  username="dbUsername" password="dbPasswd"
  url="jdbc:postgresql://localhost/dbname"
  driverClassName="org.postgresql.Driver"
  initialSize="5" maxWait="5000"
  maxActive="120" maxIdle="5"
  validationQuery="select 1"
  poolPreparedStatements="true"/>
</Context>
Evgen
источник
4

В вашем весеннем классе вы можете добавить боб, аннотированный как

@Autowired
@Qualifier("dbDataSource")
private DataSource dataSource;

и вы добавляете это в ваш context.xml

<beans:bean id="dbDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
    <beans:property name="jndiName" value="java:comp/env/jdbc/MyLocalDB"/>
</beans:bean>

Вы можете объявить ресурс JNDI в файле tomcat server.xml, используя

<Resource name="jdbc/TestDB" 
  global="jdbc/TestDB" 
  auth="Container" 
  type="javax.sql.DataSource" 
  driverClassName="com.mysql.jdbc.Driver" 
  url="jdbc:mysql://localhost:3306/TestDB" 
  username="pankaj" 
  password="pankaj123" 

  maxActive="100" 
  maxIdle="20" 
  minIdle="5" 
  maxWait="10000"/>

вернуться к context.xml de spring добавить это

<ResourceLink name="jdbc/MyLocalDB"
                global="jdbc/TestDB"
                auth="Container"
                type="javax.sql.DataSource" />

если, как этот пример, вы вводите соединение с базой данных, убедитесь, что jSQL-файл MySQL присутствует в каталоге lib tomcat, иначе tomcat не сможет создать пул соединений с базой данных MySQL.

Туй
источник
1

Я нашел это решение очень полезным, чтобы полностью удалить конфигурацию xml.

Пожалуйста, проверьте эту конфигурацию базы данных, используя JNDI и Spring Framework. http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

В этой статье объясняется, как легко создать конфигурацию базы данных на основе конфигурации базы данных jndi (db / test). как только вы закончите настройку, все репозитории db будут загружены с использованием этого jndi. Я нашел полезным. Если у @Pierre есть проблема с этим тогда, дайте мне знать. Это полное решение для записи конфигурации БД.

user3892286
источник
В этой статье объясняется, как легко создать конфигурацию БД на основе конфигурации базы данных jndi (db / test). как только вы закончите настройку, все репозитории db будут загружены с использованием этого jndi. Я нашел полезным. Если у @Pierre есть проблема с этим тогда, дайте мне знать. Это полное решение для записи конфигурации БД.
user3892286
В этой статье объясняется, как легко создать конфигурацию БД на основе конфигурации базы данных jndi (db / test). как только вы закончите настройку, все репозитории db будут загружены с использованием этого jndi. Я нашел полезным. Если у @Pierre есть проблема с этим тогда, дайте мне знать. Это полное решение для записи конфигурации БД.
Серхио А.