1. 程式人生 > >WebLogic配置JNDI數據源

WebLogic配置JNDI數據源

是否 j2e att teacher blog root oot c3p0 web.xml

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

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

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


可以看到,我們的數據庫的驅動名,數據庫名稱,賬號和密碼都是通過“硬編碼”寫死在
程序裏的。一旦我們的項目需要數據遷移,或者更換數據庫的時候,我們就要停止應用,在代碼中
修改數據庫的連接信息,這樣做非常繁瑣和不安全。即使不更換數據庫,我們在改變數據庫的最大
連接數和最小連接數,以及數據庫的其它配置等等,都需要在代碼中進行修改,這十分不友好。

我們需要一種外部的數據源,來指定我們的應用程序來鏈接數據庫,對此,我們的應用程序不必
關心數據庫的配置,數據庫的配置交由獨立的模塊管理和配置。

近年來,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. import java.sql.Connection;
  3. import java.sql.SQLException;
  4. import java.util.Properties;
  5. import javax.naming.Context;
  6. import javax.naming.InitialContext;
  7. import javax.sql.DataSource;
  8. public class DatabaseConnection {
  9. //初始化上下文需要用到的工廠類
  10. private final static String INITIAL_CONTEXT_FACTORY="weblogic.jndi.WLInitialContextFactory";
  11. //WebLogic服務器的訪問地址
  12. private final static String PROVIDER_URL="t3://127.0.0.1:7001";
  13. //WebLogic服務器中的JNDI數據源名稱
  14. private final static String MYSQL_JNDI_NAME="JNDI-MySqlDataSource";
  15. //存儲從JNDI容器中取出來的數據源
  16. private static DataSource dsOracle = null;
  17. private static DataSource dsMySQL = null;
  18. static {
  19. try {
  20. //初始化WebLogic Server的JNDI上下文信息
  21. Context context = getInitialContext();
  22. //獲取數據源對象
  23. dsMySQL = (DataSource) context.lookup(MYSQL_JNDI_NAME);
  24. } catch (Exception e) {
  25. e.printStackTrace();
  26. }
  27. }
  28. /**
  29. * MethodName: getInitialContext
  30. * Description: 獲得WebLogic ServerJNDI初始上下文信息
  31. * @return
  32. * @throws Exception
  33. */
  34. private static Context getInitialContext() throws Exception {
  35. Properties properties = new Properties();
  36. //指定工廠類
  37. properties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
  38. //指定服務器訪問地址
  39. properties.put(Context.PROVIDER_URL, PROVIDER_URL);
  40. return new InitialContext(properties);
  41. }
  42. /**
  43. * MethodName: getMySQLConnection
  44. * Description: 獲取MySQL數據庫連接
  45. * @return
  46. * @throws SQLException
  47. */
  48. public static Connection getMySQLConnection() throws SQLException {
  49. return dsMySQL.getConnection();
  50. }
  51. /**
  52. * MethodName: CloseConnection
  53. * Description: 關閉數據庫連接
  54. * @return
  55. * @throws SQLException
  56. */
  57. public static void Close()throws SQLException {
  58. if(dsMySQL!=null){
  59. dsMySQL.getConnection().close();
  60. }
  61. }
  62. }


然後,我們創建一個Servlet,測試數據庫是否連接成功並取到數據:

技術分享

技術分享


編寫Servlet內容:

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


如果編譯器沒有給你自動在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. <servlet-mapping>
  11. <servlet-name>JndiConnectionServlet</servlet-name>
  12. <url-pattern>/servlet/JndiConnectionServlet</url-pattern>
  13. </servlet-mapping>
  14. </web-app>


接下來,將我們的測試程序部署在WebLogic服務器中:

技術分享

技術分享

技術分享


啟動服務器,訪問應用路徑,可以看到:

技術分享
打開數據庫的teacher表,數據一致
技術分享

說明我們配置的數據源連接成功了!

轉載請註明出處:http://blog.csdn.net/acmman/article/details/70146603

WebLogic配置JNDI數據源