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

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

  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,使用他们,可以通过
“数据库连接池”来管理数据库的链接和配置:

  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. 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内容:

  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,别忘记自己配置:

  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数据源的更多相关文章

  1. WebLogic使用总结(三)——WebLogic配置JNDI数据源

    一.在WebLogic新建针对Oracle数据库的JNDI数据源 进入weblogic管理控制台,此处是远程访问:http://192.168.1.144:7001/console 点击左侧[ 域结构 ...

  2. 【WebLogic使用】3.WebLogic配置jndi数据源

    参见博客:https://blog.csdn.net/acmman/article/details/70146603 参考视频教程: 一.什么是jndi数据源JNDI是Java命名与目录接口(Java ...

  3. weblogic配置jdbc数据源

    weblogic配置jdbc数据源的过程 方法/步骤   启动weblogic 管理服务器,使用管理用户登录weblogic管理控制台   打开管理控制台后,在左侧的树形域结构中,选择服务->数 ...

  4. weblogic配置oracle数据源

    在weblogic配置oracle数据源还是挺简单的,网上也有很多关于这方面的文章,写给自己也写给能够得到帮助的人吧.weblogic新建域那些的就不说了哈.点击startWebLogic文件,会弹出 ...

  5. JNDI学习总结(三)——Tomcat下使用Druid配置JNDI数据源

    com.alibaba.druid.pool.DruidDataSourceFactory实现了javax.naming.spi.ObjectFactory,可以作为JNDI数据源来配置. 一.下载D ...

  6. JNDI学习总结(二)——Tomcat下使用C3P0配置JNDI数据源

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar

  7. Tomcat配置JNDI数据源

    经过3个多小时的努力,配置JNDI数据源(主要是通过DBCP连接池)终于搞定-还是Tomcat官方的说明好,不过全是英文的,大概还看得懂.百度上那么花花绿绿的太多了,一个也没成功!...本例使用的数据 ...

  8. Tomcat下使用Druid配置JNDI数据源

    com.alibaba.druid.pool.DruidDataSourceFactory实现了javax.naming.spi.ObjectFactory,可以作为JNDI数据源来配置. 一.下载D ...

  9. Tomcat下使用C3P0配置JNDI数据源(在项目的META-INF目录下创建context.xml的文件)

    一.C3P0下载 C3P0下载地址:http://sourceforge.net/projects/c3p0/files/?source=navbar 下载完成之后得到一个压缩包

随机推荐

  1. tyvj 1027 木瓜地 简单模拟

    P1027 木瓜地 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 USACO OCT09 4TH 描述 Bessie不小心游荡出Farmer John的田地 ...

  2. raid1磁盘更换---测试

    安装centos6.71. CentOS安装过程配raid.参考:http://www.360doc.com/content/13/1209/21/14661619_335823338.shtml. ...

  3. byte字节数组的压缩

    写入内容到文件 public static void writeBytesToFile() throws IOException{ String s = "aaaaaaaaD等等" ...

  4. 实现Runnable和继承Thread的区别

    啥都先不说,运行两段程序看看结果再分析 实现Runnable接口的程序代码 public class ThreadTest1 implements Runnable { private int num ...

  5. QtCreator的中如何使用第三方依赖库

    > https://blog.csdn.net/e5Max/article/details/9840331 ```LIBS += -L/usr/local/lib -lmath  ``` ``` ...

  6. elasticsearch 集群的安装部署

    一 介绍 elasticsearch 是居于lucene的搜素引擎,可以横向集群扩展以及分片,开发者无需关注如何实现了索引的备份,集群同步,分片等,我们很容易通过简单的配置就可以启动elasticse ...

  7. Oracle 冷备份详解【实战案例】

    Oracle 冷备份详解 --准备工作 select * from v$database; select file_name from dba_data_files; create tablespac ...

  8. JAVA8新特性简单总结

    速度更快代码更少强大的StreamAPI便于并行最大化的减少空指针异常Lambda表达式<具体做什么事>和函数式接口Lambda表达式(也叫做闭包)它允许我们将一个函数当作方法的参数(传递 ...

  9. 第五天 Linux基本命令

    tty控制台终端  tty1~tty6? ctrl + alt + F2~F6  切换控制台 alt + F1 返回 但是使用 在图形化界面,使用init 3后,不能使用alt + F1返回,因为两者 ...

  10. Maven 环境搭建及相应的配置

    在一般的Java Web项目开发中,特别是基于Struts + hibernate + spring的框架的时候,会有很多的jar包,一般都会在项目文件中有一个lib文件夹,下面放所有相关的jar包. ...