据说在关于DriverManagerDataSource
类的Spring javadoc文章中,这个类非常简单并且推荐使用
使用容器提供的JNDI DataSource。这样的
在Spring ApplicationContext中作为DataSource
可以通过DataSource
JndiObjectFactoryBean
bean公开
问题是:我该如何做到这一点?
例如,如果我希望DataSource
bean访问我的自定义MySQL数据库,那么我需要什么呢?我应该在上下文配置等中写什么?
答案 0 :(得分:295)
如果使用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和Spring 4更新了此答案。对Tomcat的默认数据源资源池设置进行了一些属性名称更改。
答案 1 :(得分:48)
使用Spring Java Config机制,您可以这样做:
@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 :(得分:20)
假设您的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"
答案 3 :(得分:15)
文档:C.2.3.1 <jee:jndi-lookup/>
(simple)
示例:
<jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>
您只需要找出您的appserver绑定数据源的JNDI名称。这完全是服务器特定的,请查阅服务器上的文档以了解具体方法。
请记住在bean文件的顶部声明jee
命名空间,如C.2.3 The jee schema中所述。
答案 4 :(得分:8)
另一个特点: 而不是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>
答案 5 :(得分: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>
这对我有用
答案 6 :(得分:2)
在你的spring类中,你可以注入一个注释为
的bean@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>
您可以使用
在tomcat的server.xml中声明JNDI资源<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" />
如果像这样的例子注入数据库连接,请确保tomcat lib目录中存在MySQL jar,否则tomcat将无法创建MySQL数据库连接池。
答案 7 :(得分:2)
我发现这个解决方案非常有用,可以完全删除xml配置。
请使用JNDI和spring框架检查此db配置。 http://www.unotions.com/design/how-to-create-oracleothersql-db-configuration-using-spring-and-maven/
通过本文,它解释了基于数据库jndi(db / test)配置创建数据库配置是多么容易。完成配置后,使用此jndi加载所有db存储库。我觉得很有用。如果@Pierre对此有疑问,请告诉我。它是编写数据库配置的完整解决方案。