Jak korzystać z JNDI DataSource dostarczonego przez Tomcat wiosną?

W wiosennym artykule javadoc o klasie DriverManagerDataSource mówi się, że ta klasa jest bardzo prosta i że jest zalecana

Aby użyć źródła danych JNDI dostarczonego przez kontener. Taki {[1] } może być wystawiony jako DataSource fasola w aplikacji Wiosennejkontekst poprzez JndiObjectFactoryBean

Pytanie brzmi: Jak to osiągnąć?

Na przykład, jeśli chcę mieć DataSource bean, aby uzyskać dostęp do mojej niestandardowej bazy danych MySQL, czego bym wtedy potrzebował? Co? czy powinienem pisać w konfiguracji kontekstowej itp?

Author: Ishaan Javali, 2012-02-07

8 answers

Jeśli używasz konfiguracji opartej na schemacie XML Springa, ustaw w kontekście Spring w następujący sposób:

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

Alternatywnie, konfiguracja za pomocą prostej konfiguracji bean, jak to:

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

Możesz zadeklarować zasób JNDI na serwerze tomcat.xml używając czegoś takiego:

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

I odwołaj się do zasobu JNDI z kontekstu sieciowego Tomcat.xml jak ten:

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

Dokumentacja referencyjna:

Edit: ta odpowiedź została zaktualizowana dla Tomcat 8 i Spring 4. Dokonano kilku zmian nazw właściwości dla domyślnej konfiguracji puli zasobów Tomcat .

 302
Author: kaliatech,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-12-03 22:46:50

Z mechanizmem JavaConfig Springa możesz to zrobić tak:

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

}
 52
Author: Abdull,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-12-28 13:51:34

Zakładając, że masz definicję źródła danych "sampleDS" wewnątrz konfiguracji tomcat, możesz dodać następujące linie do applicationContext.xml, aby uzyskać dostęp do źródła danych za pomocą JNDI.

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

Musisz zdefiniować przestrzeń nazw i lokalizację schematu dla prefiksu jee używając:

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"
 21
Author: melihcelik,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-07 20:30:04

Dokumentacja: C. 2.3.1 <jee:jndi-lookup/> (proste)

Przykład:

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

Musisz tylko dowiedzieć się, jak JNDI nazywa Twój serwer aplikacji, z którym powiązane jest źródło danych. Jest to całkowicie specyficzne dla serwera, skonsultuj się z dokumentami na serwerze, aby dowiedzieć się, jak to zrobić.

Pamiętaj, aby zadeklarować przestrzeń nazw jee na górze pliku beans, jak opisano w C. 2. 3 Schemat jee .

 15
Author: skaffman,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-02-07 20:29:33

Kolejna funkcja: zamiast serwera.xml, możesz dodać tag "Resource" w
your_application / META-INF / Context.xml (zgodnie z Tomcat docs ) Tak:

<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>
 9
Author: Evgen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-11-05 16:22:05

Zgodnie z Apache Tomcat 7 JNDI DataSource strona HOW-To {[3] } w sieci musi znajdować się konfiguracja zasobów.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>

That works for me

 5
Author: Antonio,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-06-20 09:12:55

Na zajęciach wiosennych możesz wstrzyknąć fasolkę np. jako

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

I dodajesz to w swoim kontekście.xml

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

Możesz zadeklarować zasób JNDI na serwerze tomcat.XML using

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

Powrót do kontekstu.XML de spring add this

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

Jeśli, jak w tym exmple, wstrzykujesz połączenie do bazy danych, upewnij się, że MySQL jar jest obecny w katalogu Tomcat lib, w przeciwnym razie tomcat nie będzie w stanie utworzyć puli połączeń bazy danych MySQL.

 4
Author: Toumi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-03-31 09:16:02

Uznałem to rozwiązanie za bardzo pomocne w czysty sposób, aby całkowicie usunąć konfigurację xml.

Proszę sprawdzić tę konfigurację db używając JNDI i spring framework. http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/

W tym artykule wyjaśniono, jak łatwo utworzyć konfgurację db na podstawie konfiguracji bazy danych JNDI (db/test). po zakończeniu konfiguracji wszystkie repozytoria db są ładowane za pomocą tego jndi. Przydało mi się. Jeśli @Pierre ma z tym problem to daj mi znać. Jest to kompletne rozwiązanie do zapisu konfiguracji db.

 1
Author: user3892286,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-16 11:58:11