Как использовать JNDI DataSource, предоставленный Tomcat в Spring?
В статье Spring DriverManagerDataSource
о классе DriverManagerDataSource
, что этот класс очень прост и рекомендуется
использовать JNDI DataSource, предоставленный контейнером. Такой DataSource
может быть представлен как bean-компонент DataSource
в Spring ApplicationContext через JndiObjectFactoryBean
Вопрос в том, как мне это сделать?
Например, если я хочу иметь компонент DataSource
для доступа к моей пользовательской базе данных MySQL, что мне тогда потребуется? Что я должен написать в контексте конфигурации и т.д.?
Ответы
Ответ 1
Если вы используете конфигурацию на основе 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, например:
<ResourceLink name="jdbc/DatabaseName"
global="jdbc/DatabaseName"
type="javax.sql.DataSource"/>
Справочная документация:
Изменить: этот ответ был обновлен для Tomcat 8 и Spring 4. Было внесено несколько изменений имени свойства для установки пула ресурсов источника данных Tomcat по умолчанию.
Ответ 2
С механизмом Spring JavaConfig вы можете сделать это так:
@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;
}
}
Ответ 3
Предполагая, что у вас есть определение источника данных 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"
Ответ 4
Документация: C.2.3.1 <jee:jndi-lookup/>
(простой)
Пример:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>
Вам просто нужно выяснить, какое имя JNDI для вашего сервера приложений привязывает к источнику данных. Это полностью зависит от сервера, обратитесь к документации на вашем сервере, чтобы узнать, как это сделать.
Не забудьте объявить пространство имен jee
в верхней части вашего beans файла, как описано в C.2.3 Схема jee.
Ответ 5
Другая особенность:
вместо 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>
Ответ 6
Согласно странице 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>
Это работает для меня
Ответ 7
В вашем классе spring вы можете вставить bean аннотированный как
@Autowired
@Qualifier("dbDataSource")
private DataSource dataSource;
и добавьте это в свой контекст .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"/>
back to context.xml de spring добавить это
<ResourceLink name="jdbc/MyLocalDB"
global="jdbc/TestDB"
auth="Container"
type="javax.sql.DataSource" />
если, как это, например, вы вводите соединение с базой данных, убедитесь, что MySQL jar присутствует в каталоге tomcat lib, иначе tomcat не сможет создать пул соединений с базой данных MySQL.
Ответ 8
Я нашел это решение очень полезным, чтобы полностью удалить конфигурацию 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 есть проблема с этим тогда, дайте мне знать. Это полное решение для записи конфигурации БД.