Tomcat数据源(Tomcat DataSource JNDI Example )

Tomcat提供了三种利用JNDI方式配置数据源的形式:

1、应用程序中的context.xml,这也是最简单的一种方式,我们只需要在你自己的应用程序下的META-INF文件夹里建立一个context.xml文件,我们需要定义Resource这个元素,这样容器会自动加载及配置它。这种方法很简单,但也有一些弊端:

  ·即使我们的配置有很小的变化,对于程序来说你都需要重复打包部署。

 ·datasource只能被自己那个应用程序使用,不能作为全局datasource被很多不同的应用来共同使用。

·如果有个全局的datasource (server.xml)被定义,那么应用程序中的datasource 将会被覆盖。

2、Server context.xml 如果你有多个应用程序 ,而你又想让他们共用DataSource,我们就可以在apache-tomcat/conf下的context.xml,他的作用域为全局应用程序的。所以如果你定义了连接池有100个连接的话,加入你有20个应用程序 ,那么如果这20个应用程序都走这个连接的话,就会创建出2000个连接,每个应用都会有100个连接。这样会明显影响数据库服务器资源及应用程序性能。

3、server.xml and context.xml我们可以定义一个全局的来代替在server.xml GlobalNamingResources element中定义的形式。如果我们用这种方式,就绪要在服务器的context.xml定义ResourceLink元素,或者是应用程序指定的地方。这是最好的一种解决多应用程序共享连接池的方式。

JNDI Configuration for DataSource – server.xml--server.xml内的关于用JNDI配置数据源

下面的代码是在tomcat的server.xml里配置的,并且需要被添加到GlobalNamingResources 元素内。所以首先要确保你的数据库驱动程序要在tomcat的lib文件夹下。之所以必须放到这里面,是因为类的加载机制所决定的。详细内容请了解一下类的加载机制来理解。下面是用mysql的形式连接。

< Resource name = "jdbc/MyDB" 
       global = "jdbc/MyDB" 
       auth = "Container" 
       type = "javax.sql.DataSource" 
       driverClassName = "com.mysql.jdbc.Driver" 
       url = "jdbc:mysql://localhost:3306/UserDB" 
       username = "pankaj" 
       password = "pankaj123" 
        
       maxActive = "100" 
       maxIdle = "20" 
       minIdle = "5" 
       maxWait = "10000" />

添加一下代码到tomcat的context.xml中

< ResourceLink name = "jdbc/MyLocalDB"
                 global = "jdbc/MyDB"
                 auth = "Container"
                 type = "javax.sql.DataSource" />

提示ResourceLink name和global的名字不同,我们将在程序中用ResourceLink name来取得数据源

 

JDBCDataSourceExample.java
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
package com.journaldev.jdbc.datasource;
  
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
  
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;
  
@WebServlet ( "/JDBCDataSourceExample" )
public class JDBCDataSourceExample extends HttpServlet {
     private static final long serialVersionUID = 1L;
         
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
         Context ctx = null ;
         Connection con = null ;
         Statement stmt = null ;
         ResultSet rs = null ;
         try {
             ctx = new InitialContext();
             DataSource ds = (DataSource) ctx.lookup( "java:/comp/env/jdbc/MyLocalDB" );
              
             con = ds.getConnection();
             stmt = con.createStatement();
              
             rs = stmt.executeQuery( "select empid, name from Employee" );
              
             PrintWriter out = response.getWriter();
             response.setContentType( "text/html" );
             out.print( "

Employee Details

"
);
             out.print( "");
             out.print( "
");
             out.print( "
");
              
             while (rs.next())
             {
                 out.print( "
");
                 out.print( "
");
                 out.print( "
");
                 out.print( "
");
             }
             out.print( "
Employee ID Employee Name
" + rs.getInt( "empid" ) + " " + rs.getString( "name" ) + "

"
);
              
             //lets print some DB information
             out.print( "

Database Details

"
);
             out.print( "Database Product: " +con.getMetaData().getDatabaseProductName()+ "
"
);
             out.print( "Database Driver: " +con.getMetaData().getDriverName());
             out.print( "" );
              
         } catch (NamingException e){
             e.printStackTrace();
         } catch (SQLException e) {
             e.printStackTrace();
         } finally {
             try {
                 rs.close();
                 stmt.close();
                 con.close();
                 ctx.close();
             } catch (SQLException e) {
                 System.out.println( "Exception in closing DB resources" );
             } catch (NamingException e) {
                 System.out.println( "Exception in closing Context" );
             }
              
         }
     }
  
}
 
以上是用的servlet3的新特性,此特性需要在tomcat7或者更高版本中,如果你的tomcat版本较低,可以修改下serlvet使其生效。
我们可以用
ctx = new InitialContext();
Context initCtx  = (Context) ctx.lookup( "java:comp/env" );
DataSource ds = (DataSource) initCtx.lookup( "jdbc/MyLocalDB" );
或者
ctx = new InitialContext();
DataSource ds = (DataSource) ctx.lookup( "java:comp/env/jdbc/MyLocalDB" );
这两种方式来获取
 
 
如果我们想换成oracle数据库我们只需要修改下配置就可以了
< Resource name = "jdbc/MyDB" 
       global = "jdbc/MyDB" 
       auth = "Container" 
       type = "javax.sql.DataSource" 
       driverClassName = "oracle.jdbc.driver.OracleDriver" 
       url = "jdbc:oracle:thin:@localhost:1521:orcl" 
       username = "hr" 
       password = "oracle" 
        
       maxActive = "100" 
       maxIdle = "20" 
       minIdle = "5" 
       maxWait = "10000" />
 

 

 

你可能感兴趣的:(Tomcat数据源(Tomcat DataSource JNDI Example ))