tomcat jdbc数据源的jndi配置

2021-03-04  本文已影响0人  错对对

jndi是什么?

JNDI(Java Naming and Directory Interface,Java命名和目录接口)是SUN公司提供的一种标准的Java命名系统接口,JNDI提供统一的客户端API,通过不同的访问提供者接口JNDI服务供应接口(SPI)的实现,由管理者将JNDI API映射为特定的命名服务和目录系统,使得Java应用程序可以和这些命名服务和目录服务之间进行交互。目录服务是命名服务的一种自然扩展。两者之间的关键差别是目录服务中对象不但可以有名称还可以有属性(例如,用户有email地址),而命名服务中对象没有属性。

以上是引用百度百科的解释。JNDI(Java Naming and Directory Interface)是一个应用程序设计的API,为开发人员提供了查找和访问各种命名和目录服务的通用、统一的接口,类似JDBC都是构建在抽象层上。现在JNDI已经成为J2EE的标准之一,所有的J2EE容器都必须提供一个JNDI的服务。

那么怎么在一个简单的web服务中配置JNDI数据源呢?

1、在tomcat中context.xml文件中增加如下配置

<Context>
    <Resource name="jdbc/UserPlatformDB"
              type="javax.sql.DataSource"  auth="Container"
              description="Derby database for User Platform"
              maxActive="100" maxIdle="30" maxWait="10000"
              username="" password=""
              driverClassName="org.apache.derby.jdbc.EmbeddedDriver"
              url="jdbc:derby:/db/user-platform;create=true"/>
</Context>

或者通过外部文件覆盖tomcat中的配置文件 maven增加如下配置

     <configuration>
                    <mode>context</mode>
                    <contextFile>src/main/webapp/WEB-INF/context.xml</contextFile>
                    <contextReloadable>true</contextReloadable>
                    <backgroundProcessorDelay>5</backgroundProcessorDelay>
                    <path>/user-web</path>
                    <port>80</port>
     </configuration>

2、修改web.xml

   <resource-ref>
        <description>DB Connection</description>
        <res-ref-name>jdbc/UserPlatformDB</res-ref-name>
        <res-type>javax.sql.DataSource</res-type>
        <res-auth>Container</res-auth>
    </resource-ref>

3、通过代码获取JNDI数据源配置信息

@WebListener
public class DBConnectionInitializerListener implements ServletContextListener {
    /**
     * 当Servlet 容器启动Web 应用时调用该方法。在调用完该方法之后,容器再对Filter 初始化,
     * 并且对那些在Web 应用启动时就需要被初始化的Servlet 进行初始化。
     *
     * @param sce
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        try {
            //获取上下文中jndi数据源信息
            InitialContext context = new InitialContext();
            DataSource dataSource = (DataSource) context.lookup("java:comp/env/jdbc/UserPlatformDB");
            if (dataSource != null) {
                DBConnectionPoolManager.setDataSource(dataSource);
                DBConnectionPoolManager.setMaxSize(10);
            } else {
                String databaseURL = "create=true";
                EmbeddedDataSource embeddedDataSource = new EmbeddedDataSource();
                embeddedDataSource.setDatabaseName("/db/user-platform");
                embeddedDataSource.setConnectionAttributes(databaseURL);
                DBConnectionPoolManager.setDataSource(embeddedDataSource);
                DBConnectionPoolManager.setMaxSize(10);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println(sce);
    }

    /**
     * 当Servlet 容器终止Web 应用时调用该方法。在调用该方法之前,容器会先销毁所有的Servlet 和Filter 过滤器。
     *
     * @param sce
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        DBConnectionPoolManager.releaseAllConnection();
        System.out.println(sce);
    }
}

4、把ServletContextListener监听添加容器中,在web.xml增加如下配置

 <listener>
        <listener-class>com.cdd.user.web.web.listener.DBConnectionInitializerListener</listener-class>
 </listener>

5、项目启动时,DBConnectionInitializerListener会自动获取JNDI数据源的配置信息,放到数据库连接池管理器DBConnectionPoolManager

项目地址:https://github.com/cuoduidui/geekbanglessons

上一篇下一篇

猜你喜欢

热点阅读