WebLogic配置JNDI數據源
一、什麽是jndi數據源
JNDI是Java命名與目錄接口(Java Naming and Directory Interface),在J2EE規範中是重要的規範之一。
我們平時開發web程序的時候,在連接數據庫的時候,往往會編寫一個連接數據庫的類,
例如連接Mysql的類:
- package cn.edu.hpu.util;
- import java.sql.Connection;
- import java.sql.DriverManager;
- import java.sql.ResultSet;
- import java.sql.SQLException;
- import java.sql.Statement;
- public class DB {
- // 定義MySQL的數據庫驅動程序
- public static final String DBDRIVER = "org.gjt.mm.mysql.Driver" ;
- //定義mysql的數據庫連接地址:
- public static final String DBDURL = "jdbc:mysql://localhost:3306/iqweb" ;
- //mysql數據庫的連接用戶名
- public static final String DBUSER = "root" ;
- //mysql數據庫的連接密碼
- public static final String DBPASS = "1234" ;
- static{
- try {
- Class.forName(DBDRIVER);
- } catch (ClassNotFoundException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static Connection getConnection(){
- Connection conn=null;
- try {
- conn=DriverManager.getConnection(DBDURL,DBUSER,DBPASS);
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- return conn;
- }
- public static void close(ResultSet rs,Statement st,Connection conn){
- try {
- if(rs!=null){
- rs.close();
- }
- if(st!=null){
- st.close();
- }
- if(conn!=null){
- conn.close();
- }
- } catch (SQLException e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- public static void close(Statement st,Connection conn){
- close(null,st,conn);
- }
- }
可以看到,我們的數據庫的驅動名,數據庫名稱,賬號和密碼都是通過“硬編碼”寫死在
程序裏的。一旦我們的項目需要數據遷移,或者更換數據庫的時候,我們就要停止應用,在代碼中
修改數據庫的連接信息,這樣做非常繁瑣和不安全。即使不更換數據庫,我們在改變數據庫的最大
連接數和最小連接數,以及數據庫的其它配置等等,都需要在代碼中進行修改,這十分不友好。
我們需要一種外部的數據源,來指定我們的應用程序來鏈接數據庫,對此,我們的應用程序不必
關心數據庫的配置,數據庫的配置交由獨立的模塊管理和配置。
近年來,Web開發中湧現了許多框架,如hibernate/Mybatis/Spring,使用他們,可以通過
“數據庫連接池”來管理數據庫的鏈接和配置:
- <!-- 配置c3p0數據源 -->
- <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
- <property name="jdbcUrl" value="${jdbcUrl}"></property>
- <property name="driverClass" value="${driverClass}"></property>
- <property name="user" value="${user}"></property>
- <property name="password" value="${password}"></property>
- <!--初始化時獲取三個連接,取值應在minPoolSize與maxPoolSize之間。Default: 3 -->
- <property name="initialPoolSize" value="${initialPoolSize}"></property>
- <!--連接池中保留的最小連接數。Default: 3 -->
- <property name="minPoolSize" value="3"></property>
- <!--連接池中保留的最大連接數。Default: 15 -->
- <property name="maxPoolSize" value="${maxPoolSize}"></property>
- <!--當連接池中的連接耗盡的時候c3p0一次同時獲取的連接數。Default: 3 -->
- <property name="acquireIncrement" value="3"></property>
- <!--最大空閑時間,1800秒內未使用則連接被丟棄,若為0則永不丟棄。Default: 0 -->
- <property name="maxIdleTime" value="1800"></property>
- </bean>
並且把數據庫配置單獨放置在porperties配置文件中:
這樣做就在應用層實現了數據庫配置信息獨立的機制。這樣會使應用程序的數據庫配置更加靈活。
而我們的WebLogic服務器,擁有綁定Jndi數據源的功能,也就是服務器來對應用程序的數據庫配置
進行托管,應用程序只需要在其應用代碼中制定使用jndi模式鏈接WebLogic的數據源信息即可。
當需要修改數據庫信息的時候,根本不需要動應用程序的東西,只需要調整WebLogic的jndi數據源
中的數據庫配置信息即可。
也即是說,WebLogic的jndi機制,在服務層實現了數據庫配置信息獨立的機制。
二、新建Mysql的JNDI數據源
訪問http://localhost:7001/console/,登錄進入WebLogic控制臺主頁。
點擊左側“域結構”下的“服務”下的“數據源”選項:
選擇新建,一般數據源。
填寫數據源的名稱,JNDI名稱以及選擇數據庫類型:
選擇數據庫驅動版本:
其它配置按照默認即可:
填寫數據庫的連接信息:
接下來點擊測試配置,看一下是否能連接成功:
出現“連接測試成功”即表示數據庫配置沒有問題。
點擊下一步,勾選服務器。
點擊完成之後,我們服務器端的JNDI數據源就配置完畢了。
三、應用程序引用WebLogic的jndi數據源
我們在MyEclipse中創建一個WebProject測試工程:
我們在src中創建一個數據庫連接類:
編寫該連接類:
- package com.cn.opensource.dbConn;
- import java.sql.Connection;
- import java.sql.SQLException;
- import java.util.Properties;
- import javax.naming.Context;
- import javax.naming.InitialContext;
- import javax.sql.DataSource;
- public class DatabaseConnection {
- //初始化上下文需要用到的工廠類
- private final static String INITIAL_CONTEXT_FACTORY="weblogic.jndi.WLInitialContextFactory";
- //WebLogic服務器的訪問地址
- private final static String PROVIDER_URL="t3://127.0.0.1:7001";
- //WebLogic服務器中的JNDI數據源名稱
- private final static String MYSQL_JNDI_NAME="JNDI-MySqlDataSource";
- //存儲從JNDI容器中取出來的數據源
- private static DataSource dsOracle = null;
- private static DataSource dsMySQL = null;
- static {
- try {
- //初始化WebLogic Server的JNDI上下文信息
- Context context = getInitialContext();
- //獲取數據源對象
- dsMySQL = (DataSource) context.lookup(MYSQL_JNDI_NAME);
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
- /**
- * MethodName: getInitialContext
- * Description: 獲得WebLogic ServerJNDI初始上下文信息
- * @return
- * @throws Exception
- */
- private static Context getInitialContext() throws Exception {
- Properties properties = new Properties();
- //指定工廠類
- properties.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT_FACTORY);
- //指定服務器訪問地址
- properties.put(Context.PROVIDER_URL, PROVIDER_URL);
- return new InitialContext(properties);
- }
- /**
- * MethodName: getMySQLConnection
- * Description: 獲取MySQL數據庫連接
- * @return
- * @throws SQLException
- */
- public static Connection getMySQLConnection() throws SQLException {
- return dsMySQL.getConnection();
- }
- /**
- * MethodName: CloseConnection
- * Description: 關閉數據庫連接
- * @return
- * @throws SQLException
- */
- public static void Close()throws SQLException {
- if(dsMySQL!=null){
- dsMySQL.getConnection().close();
- }
- }
- }
然後,我們創建一個Servlet,測試數據庫是否連接成功並取到數據:
編寫Servlet內容:
[java] view plain copy- package com.cn.opensource.dbConn;
- 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.servlet.ServletException;
- import javax.servlet.http.HttpServlet;
- import javax.servlet.http.HttpServletRequest;
- import javax.servlet.http.HttpServletResponse;
- public class JndiConnectionServlet extends HttpServlet {
- public void doGet(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- request.setCharacterEncoding("UTF-8");
- response.setCharacterEncoding("UTF-8");
- response.setContentType("text/html");
- PrintWriter out = response.getWriter();
- out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");
- out.println("<HTML>");
- out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");
- out.println(" <BODY>");
- out.print("<h1>測試JNDI數據源連接</h1>");
- Connection conn = null;
- Statement st = null;
- ResultSet rs = null;
- try {
- conn = DatabaseConnection.getMySQLConnection();
- String sql = "select * from teacher";
- st = conn.createStatement();
- rs = st.executeQuery(sql);
- int i=0;
- while (rs.next()) {
- i++;
- out.println("第"+i+"個教師信息");
- out.println("編號:"+rs.getInt("number"));
- out.println("姓名:"+rs.getString("name"));
- out.println("性別:"+rs.getString("sex"));
- out.println("所屬班級:"+rs.getString("classname"));
- out.println("住址:"+rs.getString("address"));
- out.println("<br/>");
- }
- } catch (Exception ex) {
- ex.printStackTrace();
- } finally {
- try {
- DatabaseConnection.Close();
- } catch (SQLException e) {
- e.printStackTrace();
- }
- }
- out.println(" </BODY>");
- out.println("</HTML>");
- out.flush();
- out.close();
- }
- public void doPost(HttpServletRequest request, HttpServletResponse response)
- throws ServletException, IOException {
- doGet(request,response);
- }
- }
如果編譯器沒有給你自動在Web.xml中配置Servlet,別忘記自己配置:
- <?xml version="1.0" encoding="UTF-8"?>
- <web-app version="3.0"
- xmlns="http://java.sun.com/xml/ns/javaee"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
- <servlet>
- <servlet-name>JndiConnectionServlet</servlet-name>
- <servlet-class>com.cn.opensource.dbConn.JndiConnectionServlet</servlet-class>
- </servlet>
- <servlet-mapping>
- <servlet-name>JndiConnectionServlet</servlet-name>
- <url-pattern>/servlet/JndiConnectionServlet</url-pattern>
- </servlet-mapping>
- </web-app>
接下來,將我們的測試程序部署在WebLogic服務器中:
啟動服務器,訪問應用路徑,可以看到:
打開數據庫的teacher表,數據一致
說明我們配置的數據源連接成功了!
轉載請註明出處:http://blog.csdn.net/acmman/article/details/70146603
WebLogic配置JNDI數據源