问题
据说在Spring javadoc文章中关于DriverManagerDataSource
class,这个类非常简单,建议
使用容器提供的JNDI DataSource。这样的DataSource可以通过JndiObjectFactoryBean在Spring ApplicationContext中作为DataSource bean公开
问题是:如何实现这一目标?
例如,如果我希望DataSource bean访问我的custo mysql数据库,那么我需要什么呢?在上下文配置等中写什么?
#1 热门回答(284 赞)
如果使用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>
你可以使用以下内容在tomcat的server.xml中声明JNDI资源:
<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>
并从Tomcat的web context.xml引用JNDI资源,如下所示:
<ResourceLink name="jdbc/DatabaseName"
global="jdbc/DatabaseName"
type="javax.sql.DataSource"/>
参考文件:
- Tomcat 8 JNDI Datasource HOW-TO
- Tomcat 8上下文资源链接参考
- Spring 4 JEE JNDI Lookup XML Schema Reference
- Spring 4 JndiObjectFactoryBean Javadoc
编辑:已针对Tomcat 8和Spring 4更新了此答案。已对Tomcat的默认资源池资源池设置进行了一些属性名称更改。
#2 热门回答(44 赞)
使用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 热门回答(20 赞)
假设你的tomcat配置中有"sampleDS"数据源定义,你可以将以下行添加到yourapplicationContext.xml
以使用JNDI访问数据源。
<jee:jndi-lookup expected-type="javax.sql.DataSource" id="springBeanIdForSampleDS" jndi-name="sampleDS"/>
你必须使用以下内容定义jee
prefix的命名空间和架构位置:
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"