在J2EE WEB容器中,设置数据源连接有多种方式。今天先来记录下JNDI获取连接的方式。

1.在WEB容器中定义JNDI数据源有多个地方,因为我是本地学习,使用的是TOMCAT,所以,就选择最合理的一种,即在

WEB项目中的META-INF下新建一个context.xm作为定义JNDI数据源的地方。

<?xml version="1.0" encoding="UTF-8"?>
<context>
<Resource name="jndi/oracle" 
 auth = "Container"
 type = "javax.sql.DataSource"
 driverClassName="oracle.jdbc.driver.OracleDriver"
 url="jdbc:oracle:thin:@localhost:1521:orcl"
 username="***"
 password="***"
 maxActive="20"
 maxIdle="10"
 maxWait="10000">
 </Resource>
</context>


在Spring中为了方便使用JNDI获取数据源连接,还给我们提供了org.springframework.jndi.JndiObjectFactoryBean类。

我们只需要在spring配置文件中定义那个bean,并指定jndi资源名即可。同时,我想要验证是否连接数据库成功,所以,

这里用到了JDBCTemplate,下面是配置文件。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:context="http://www.springframework.org/schema/context"
  xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-3.0.xsd"
    >
  <context:component-scan base-package="com.springinaction.springidol" />
  <bean id="datasource" class="org.springframework.jndi.JndiObjectFactoryBean">
  <property name="jndiName" value="java:comp/env/jndi/oracle"></property>
  </bean>
  <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="datasource" />
    </bean>
</beans>

但是JNDI是在WEB容器中才能生效的,如果不启用tomcat容器好像会报环境变量的错误。所以,我干脆把项目变成spring mvc项目,其实也就是在web.xml中添加

tomcat启动就加载spring的监听。

<context-param>
  <param-name>contextConfigLocation</param-name>
  <param-value>classpath:/springconfig.xml</param-value>
  </context-param>
  <listener>
  <listener-class>
  org.springframework.web.context.ContextLoaderListener
  </listener-class>
  </listener>


在项目中使用JDBCTemplate就很方便了,直接autowired注入即可。下面是我注入的代码


package com.springinaction.springidol;


import java.sql.Connection;
import java.sql.SQLException;


import org.springframework.beans.factory.InitializingBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jndi.JndiObjectFactoryBean;
import org.springframework.stereotype.Component;
@Component
public class GetJNDIDatasource implements InitializingBean{
@Autowired
private JdbcTemplate jdbcTemplate;


@Override
public void afterPropertiesSet() throws Exception {
System.out.println(jdbcTemplate.queryForInt("SELECT count(*) FROM table"));

}


}


这里我使用了,spring的initialzingBean特性,其实就是相当于init-method在Spring初始化bean前,调用初始化结果。

下面是我使用的jar包截图。


记录下,加深下影响。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐