WebLogic配置JNDI數據源


一、什么是jndi數據源
JNDI是Java命名與目錄接口(Java Naming and Directory Interface),在J2EE規范中是重要的規范之一。

我們平時開發web程序的時候,在連接數據庫的時候,往往會編寫一個連接數據庫的類,
例如連接Mysql的類:

[java] view plain copy
  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,使用他們,可以通過
“數據庫連接池”來管理數據庫的鏈接和配置:

[html] view plain copy
  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中創建一個數據庫連接類:


編寫該連接類:

[java] view plain copy
  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內容:

[java] view plain copy
  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,別忘記自己配置:

[html] view plain copy
  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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM