Як використовувати JNDI DataSource, наданий Tomcat навесні?


159

Кажуть, що у весняній статті про javadoc про DriverManagerDataSourceклас, що цей клас дуже простий і що його рекомендують

використовувати джерело даних JNDI, наданий контейнером. Таку банку DataSourceможна виставити як DataSourceбоб у Spring ApplicationContext черезJndiObjectFactoryBean

Питання: як я це досягну?

Наприклад, якщо я хочу мати DataSourcebean для доступу до моєї користувальницької бази даних MySQL, що б мені тоді було потрібно? Що потрібно написати в конфігурації контексту тощо?

Відповіді:


302

Якщо ви використовуєте конфігурацію на основі схеми XML Spring, встановіть у контексті 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 id="DatabaseName" class="org.springframework.jndi.JndiObjectFactoryBean">
    <property name="jndiName" value="java:comp/env/jdbc/DatabaseName"/>
</bean>

Ви можете оголосити ресурс JNDI на сервері tomcat.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.xml так:

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

Довідкова документація:

Редагувати: Цю відповідь було оновлено для Tomcat 8 та Spring 4. Проведено кілька змін імен властивостей для налаштування пулу ресурсів ресурсів даних Tomcat за замовчуванням .


@skaffman Так, але ви надаєте посилання на весняну довідкову документацію.
Етьєн Мірет

який саме файл ви маєте на увазі під веб-контекстом Tomcat.xml?
Павло Нієдоба

1
@PavelNiedoba Tomcat використовує "контекст" для конкретної конфігурації веб-додатків tomcat. Файл контексту та / або конфігурація контексту можна розмістити в різних місцях, тому я не можу дати вам остаточної відповіді. Загальне місце розташування - "/META-INF/context.xml". Дивіться розділ "Визначення контексту" тут: tomcat.apache.org/tomcat-8.0-doc/config/…
kaliatech

Ммм ... не здається, що працює для мого Oracle db, будь-які відмінності з postgresql?
Пафат

1
@Phate Немає принципових відмінностей з Oracle vs PostgreSQL на рівні JDBC / JNDI / Tomcat. Однак, Oracle дуже відрізняється від PostgreSQL, коли мова йде про деталі налаштування клієнта / сервера Oracle. Поза межами оригінального питання / відповіді. Запропонуйте розмістити нове запитання із деталями того, що ви спробували, конкретних версій та будь-яких повідомлень про помилки. Приклад: stackoverflow.com/questions/10388137 / ...
kaliatech

52

З механізмом JavaConfig Spring можна зробити це так:

@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;
    }

}

2
Або скористайтеся більш спеціалізованим JndiDataSourceLookup
Arend v. Reinersdorff

21

Припускаючи, що у вашій налаштування tomcat є визначення джерела даних "sampleDS", ви можете додати наступні рядки до свого 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"

15

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

Приклад:

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

Вам просто потрібно з'ясувати, до якого імені JNDI приєднався ваш додаток. Це повністю для сервера, проконсультуйтеся з документами на вашому сервері, щоб дізнатися, як це зробити.

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


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>

5

Згідно сторінки Apache Tomcat 7 JNDI Datasource HOW-TO, в web.xml має бути конфігурація ресурсу:

<resource-ref>
  <description>DB Connection</description>
  <res-ref-name>jdbc/TestDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>Container</res-auth>

Це працює для мене


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.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" />

якщо, наприклад, у цьому прикладі ви встановлюєте з'єднання з базою даних, переконайтеся, що jar MySQL присутній у каталозі lic tomcat, інакше tomcat не зможе створити пул підключення до бази даних MySQL.


1

Я вважаю це рішення дуже корисним для чистого видалення конфігурації XML повністю.

Перевірте цю конфігурацію db за допомогою JNDI та spring Framework. http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

Ця стаття пояснює, як легко створити конфігурацію db на основі конфігурації бази даних jndi (db / test). як тільки ви закінчите з конфігурацією, тоді всі db сховища завантажуються за допомогою цього jndi. Я знайшов корисним. Якщо у @Pierre виникли проблеми з цим, то дайте мені знати. Це повне рішення написати конфігурацію db.


Ця стаття пояснює, як легко створити конфігурацію db на основі конфігурації бази даних jndi (db / test). як тільки ви закінчите з конфігурацією, тоді всі db сховища завантажуються за допомогою цього jndi. Я знайшов корисним. Якщо у @Pierre виникли проблеми з цим, то дайте мені знати. Це повне рішення написати конфігурацію db.
користувач3892286

Ця стаття пояснює, як легко створити конфігурацію db на основі конфігурації бази даних jndi (db / test). як тільки ви закінчите з конфігурацією, тоді всі db сховища завантажуються за допомогою цього jndi. Я знайшов корисним. Якщо у @Pierre виникли проблеми з цим, то дайте мені знати. Це повне рішення написати конфігурацію db.
Серхіо А.
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.