2012-02-07 2 views
143

Сказано в Spring JavaDoc статьи о DriverManagerDataSource класса, что этот класс очень прост, и что рекомендуетсяКак использовать источник данных JNDI, предоставленный Tomcat весной?

использовать JNDI DataSource предоставленный контейнер. Такой DataSource может быть выставлен как DataSource фасоли в Спринг ApplicationContext через JndiObjectFactoryBean

Вопрос: как это сделать?

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

ответ

279

При использовании конфигурации 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 ресурс в server.xml TOMCAT, используя что-то вроде этого:

<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 ресурс с веб-context.xml Tomcat как это:

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

Ссылка документация:

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

+12

+1 Это лучший ответ, чем мой ... – skaffman

+0

@ skaffman Да, но вы предоставляете ссылку на справочную документацию Spring. –

+3

Вот как все должны ответить - просто и точно. :) –

15

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

Пример:

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

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

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

19

Предполагая, что у вас есть определение источника данных 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" 
43

С механизмом 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; 
    } 

} 
+1

Или используйте более специализированный [JndiDataSourceLookup] (http://docs.spring.io/spring/docs/4.3.5.RELEASE/javadoc-api/org/springframework/jdbc/datasource/lookup/JndiDataSourceLookup.html) –

5

Согласно Apache Tomcat 7 JNDI Datasource HOW-TO page должна быть конфигурация ресурсов в 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> 

Это работает для меня

8

Другая особенность: inste объявление о из server.xml, вы можете добавить "Ресурс" тег в
your_application/META-INF/context.xml (согласно tomcat docs) так:

<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> 
2

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

@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 в server.xml TOMCAT, используя

<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 де весной добавить

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

если, как этот exmple вы инъекционное подключение к базе данных, убедитесь, что MySQL jar присутствует в каталоге tomcat lib, иначе tomcat не сможет создать пул соединений с базой данных MySQL.

1

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

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

+0

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

+0

Интересный дополнительный комментарий! Я действительно думаю, что вы должны ПЕРЕЕЗДАТЬ его в свой фактический ответ, который там, где это принадлежит! Удачи! –