WebLogic配置JNDI数据源

一、什么是jndi数据源
JNDI是Java命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一。

我们平时开发web程序的时候,在连接数据库的时候,往往会编写一个连接数据库的类,
例如连接Mysql的类:

  1. package cn.edu.hpu.util;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.DriverManager;  
  5. import java.sql.ResultSet;  
  6. import java.sql.SQLException;  
  7. import java.sql.Statement;  
  8.   
  9. public class DB {  
  10.     // 定义MySQL的数据库驱动程序  
  11.     public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;  
  12.     //定义mysql的数据库连接地址:  
  13.     public static final String DBDURL = "jdbc:mysql://localhost:3306/iqweb" ;  
  14.     //mysql数据库的连接用户名  
  15.     public static final String DBUSER = "root" ;  
  16.     //mysql数据库的连接密码  
  17.     public static final String DBPASS = "1234" ;  
  18.       
  19.     static{   
  20.         try {  
  21.             Class.forName(DBDRIVER);  
  22.         } catch (ClassNotFoundException e) {  
  23.             // TODO Auto-generated catch block  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27.       
  28.     public static Connection getConnection(){  
  29.         Connection conn=null;  
  30.         try {  
  31.             conn=DriverManager.getConnection(DBDURL,DBUSER,DBPASS);  
  32.         } catch (SQLException e) {  
  33.             // TODO Auto-generated catch block  
  34.             e.printStackTrace();  
  35.         }  
  36.         return conn;  
  37.     }  
  38.       
  39.     public static void close(ResultSet rs,Statement st,Connection conn){  
  40.           
  41.         try {  
  42.                   
  43.                 if(rs!=null){  
  44.                 rs.close();  
  45.                 }  
  46.                 if(st!=null){  
  47.                     st.close();  
  48.                 }  
  49.                 if(conn!=null){  
  50.                     conn.close();  
  51.                 }  
  52.         } catch (SQLException e) {  
  53.             // TODO Auto-generated catch block  
  54.             e.printStackTrace();  
  55.         }  
  56.           
  57.     }   
  58.       
  59.     public static void close(Statement st,Connection conn){  
  60.         close(null,st,conn);  
  61.     }  
  62. }  


可以看到,我们的数据库的驱动名,数据库名称,账号和密码都是通过“硬编码”写死在
程序里的。一旦我们的项目需要数据迁移,或者更换数据库的时候,我们就要停止应用,在代码中
修改数据库的连接信息,这样做非常繁琐和不安全。即使不更换数据库,我们在改变数据库的最大
连接数和最小连接数,以及数据库的其它配置等等,都需要在代码中进行修改,这十分不友好。

我们需要一种外部的数据源,来指定我们的应用程序来链接数据库,对此,我们的应用程序不必
关心数据库的配置,数据库的配置交由独立的模块管理和配置。

近年来,Web开发中涌现了许多框架,如hibernate/Mybatis/Spring,使用他们,可以通过
“数据库连接池”来管理数据库的链接和配置:

  1. <!-- 配置c3p0数据源 -->  
  2. <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">  
  3.     <property name="jdbcUrl" value="${jdbcUrl}"></property>  
  4.     <property name="driverClass" value="${driverClass}"></property>  
  5.     <property name="user" value="${user}"></property>  
  6.     <property name="password" value="${password}"></property>  
  7.     <!--初始化时获取三个连接,取值应在minPoolSize与maxPoolSize之间。Default: 3 -->  
  8.     <property name="initialPoolSize" value="${initialPoolSize}"></property>  
  9.     <!--连接池中保留的最小连接数。Default: 3 -->  
  10.     <property name="minPoolSize" value="3"></property>  
  11.     <!--连接池中保留的最大连接数。Default: 15 -->  
  12.     <property name="maxPoolSize" value="${maxPoolSize}"></property>  
  13.     <!--当连接池中的连接耗尽的时候c3p0一次同时获取的连接数。Default: 3 -->  
  14.     <property name="acquireIncrement" value="3"></property>  
  15.     <!--最大空闲时间,1800秒内未使用则连接被丢弃,若为0则永不丢弃。Default: 0 -->  
  16.     <property name="maxIdleTime" value="1800"></property>  
  17. </bean>  

并且把数据库配置单独放置在porperties配置文件中:

这样做就在应用层实现了数据库配置信息独立的机制。这样会使应用程序的数据库配置更加灵活。

而我们的WebLogic服务器,拥有绑定Jndi数据源的功能,也就是服务器来对应用程序的数据库配置
进行托管,应用程序只需要在其应用代码中制定使用jndi模式链接WebLogic的数据源信息即可。
当需要修改数据库信息的时候,根本不需要动应用程序的东西,只需要调整WebLogic的jndi数据源
中的数据库配置信息即可。

也即是说,WebLogic的jndi机制,在服务层实现了数据库配置信息独立的机制。


二、新建Mysql的JNDI数据源
访问http://localhost:7001/console/,登录进入WebLogic控制台主页。
点击左侧“域结构”下的“服务”下的“数据源”选项:

选择新建,一般数据源。

填写数据源的名称,JNDI名称以及选择数据库类型:


选择数据库驱动版本:


其它配置按照默认即可:



填写数据库的连接信息:



接下来点击测试配置,看一下是否能连接成功:



出现“连接测试成功”即表示数据库配置没有问题。
点击下一步,勾选服务器。



点击完成之后,我们服务器端的JNDI数据源就配置完毕了。




三、应用程序引用WebLogic的jndi数据源
我们在MyEclipse中创建一个WebProject测试工程:



我们在src中创建一个数据库连接类:


编写该连接类:

  1. package com.cn.opensource.dbConn;  
  2.   
  3. import java.sql.Connection;  
  4. import java.sql.SQLException;  
  5. import java.util.Properties;  
  6.   
  7. import javax.naming.Context;  
  8. import javax.naming.InitialContext;  
  9. import javax.sql.DataSource;  
  10.   
  11. public class DatabaseConnection {  
  12.     //初始化上下文需要用到的工厂类  
  13.     private final static String INITIAL_CONTEXT_FACTORY="weblogic.jndi.WLInitialContextFactory";  
  14.     //WebLogic服务器的访问地址  
  15.     private final static String PROVIDER_URL="t3://127.0.0.1:7001";  
  16.     //WebLogic服务器中的JNDI数据源名称  
  17.     private final static String MYSQL_JNDI_NAME="JNDI-MySqlDataSource";  
  18.       
  19.             
  20.     //存储从JNDI容器中取出来的数据源  
  21.     private static DataSource dsOracle = null;  
  22.     private static DataSource dsMySQL = null;  
  23.            
  24.     static {  
  25.         try {  
  26.             //初始化WebLogic Server的JNDI上下文信息  
  27.             Context context = getInitialContext();  
  28.             //获取数据源对象  
  29.             dsMySQL = (DataSource) context.lookup(MYSQL_JNDI_NAME);  
  30.         } catch (Exception e) {  
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34.       
  35.     /** 
  36.     * MethodName: getInitialContext 
  37.     * Description: 获得WebLogic ServerJNDI初始上下文信息        
  38.     * @return 
  39.     * @throws Exception 
  40.     */  
  41.     private static Context getInitialContext() throws Exception {  
  42.         Properties properties = new Properties();  
  43.         //指定工厂类  
  44.         properties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);  
  45.         //指定服务器访问地址  
  46.         properties.put(Context.PROVIDER_URL, PROVIDER_URL);  
  47.         return new InitialContext(properties);  
  48.     }  
  49.       
  50.       
  51.     /** 
  52.      * MethodName: getMySQLConnection 
  53.      * Description: 获取MySQL数据库连接    
  54.      * @return 
  55.      * @throws SQLException 
  56.      */  
  57.     public static Connection getMySQLConnection() throws SQLException {  
  58.         return dsMySQL.getConnection();  
  59.     }  
  60.       
  61.       
  62.     /** 
  63.      * MethodName: CloseConnection 
  64.      * Description: 关闭数据库连接        
  65.      * @return 
  66.      * @throws SQLException 
  67.      */  
  68.     public static void Close()throws SQLException {  
  69.         if(dsMySQL!=null){  
  70.             dsMySQL.getConnection().close();  
  71.         }  
  72.     }  
  73. }  


然后,我们创建一个Servlet,测试数据库是否连接成功并取到数据:



编写Servlet内容:

  1. package com.cn.opensource.dbConn;  
  2.   
  3. import java.io.IOException;  
  4. import java.io.PrintWriter;  
  5. import java.sql.Connection;  
  6. import java.sql.ResultSet;  
  7. import java.sql.SQLException;  
  8. import java.sql.Statement;  
  9.   
  10. import javax.servlet.ServletException;  
  11. import javax.servlet.http.HttpServlet;  
  12. import javax.servlet.http.HttpServletRequest;  
  13. import javax.servlet.http.HttpServletResponse;  
  14.   
  15. public class JndiConnectionServlet extends HttpServlet {  
  16.   
  17.     public void doGet(HttpServletRequest request, HttpServletResponse response)  
  18.             throws ServletException, IOException {  
  19.   
  20.         request.setCharacterEncoding("UTF-8");  
  21.         response.setCharacterEncoding("UTF-8");  
  22.         response.setContentType("text/html");  
  23.         PrintWriter out = response.getWriter();  
  24.         out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");  
  25.         out.println("<HTML>");  
  26.         out.println("  <HEAD><TITLE>A Servlet</TITLE></HEAD>");  
  27.         out.println("  <BODY>");  
  28.         out.print("<h1>测试JNDI数据源连接</h1>");  
  29.           
  30.         Connection conn = null;  
  31.         Statement st = null;  
  32.         ResultSet rs = null;  
  33.         try {  
  34.             conn = DatabaseConnection.getMySQLConnection();  
  35.             String sql = "select * from teacher";  
  36.             st = conn.createStatement();  
  37.             rs = st.executeQuery(sql);  
  38.             int i=0;  
  39.             while (rs.next()) {  
  40.                 i++;  
  41.                 out.println("第"+i+"个教师信息");  
  42.                 out.println("编号:"+rs.getInt("number"));  
  43.                 out.println("姓名:"+rs.getString("name"));  
  44.                 out.println("性别:"+rs.getString("sex"));  
  45.                 out.println("所属班级:"+rs.getString("classname"));  
  46.                 out.println("住址:"+rs.getString("address"));  
  47.                 out.println("<br/>");  
  48.             }  
  49.         } catch (Exception ex) {  
  50.             ex.printStackTrace();  
  51.   
  52.   
  53.         } finally {  
  54.             try {  
  55.                 DatabaseConnection.Close();  
  56.             } catch (SQLException e) {  
  57.                 e.printStackTrace();  
  58.             }  
  59.         }  
  60.           
  61.         out.println("  </BODY>");  
  62.         out.println("</HTML>");  
  63.         out.flush();  
  64.         out.close();  
  65.     }  
  66.   
  67.     public void doPost(HttpServletRequest request, HttpServletResponse response)  
  68.             throws ServletException, IOException {  
  69.         doGet(request,response);  
  70.     }  
  71.   
  72. }  


如果编译器没有给你自动在Web.xml中配置Servlet,别忘记自己配置:

  1. <?xml version="1.0" encoding="UTF-8"?>  
  2. <web-app version="3.0"  
  3.     xmlns="http://java.sun.com/xml/ns/javaee"  
  4.     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  
  5.     xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">  
  6.   <servlet>  
  7.     <servlet-name>JndiConnectionServlet</servlet-name>  
  8.     <servlet-class>com.cn.opensource.dbConn.JndiConnectionServlet</servlet-class>  
  9.   </servlet>  
  10.   
  11.   
  12.   <servlet-mapping>  
  13.     <servlet-name>JndiConnectionServlet</servlet-name>  
  14.     <url-pattern>/servlet/JndiConnectionServlet</url-pattern>  
  15.   </servlet-mapping>  
  16.   
  17.   
  18. </web-app>  


接下来,将我们的测试程序部署在WebLogic服务器中:




启动服务器,访问应用路径,可以看到:


打开数据库的teacher表,数据一致

说明我们配置的数据源连接成功了!

转载请注明出处:http://blog.csdn.net/acmman/article/details/70146603

posted on 2017-11-06 16:07  LOS_LIANG菜园  阅读(1687)  评论(0编辑  收藏  举报

导航