zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    主动一点
    白鱼泡湿地公园
    Google管理制度(东北分公司)
    碎嘴子
    升级的时代
    SD2.0大型网站架构讨论沙龙
    旅途摘抄《12条职场秘笈》
    fscache 调研
    lxccheckpoint 一些 比较老的资料
    folly,facebook刚刚开源的底层c++函数
  • 原文地址:https://www.cnblogs.com/lj820403/p/7793650.html
Copyright © 2011-2022 走看看