如何配置WebLogic中的JNDI数据源?
- 内容介绍
- 文章标签
- 相关推荐
本文共计1877个文字,预计阅读时间需要8分钟。
一、什么是JNDI数据源JNDI是Java命名与目录接口(Java Naming and Directory Interface)的简称,它是一种在Java应用中用于查找和访问命名资源的标准方式。在J2EE规范中,JNDI是一个重要规范,用于提供命名和目录服务。在开发web程序时,我们常常需要连接数据库,这时经常会编写一个连接池,JNDI数据源正是用于管理连接池的。我们可以将连接池配置在服务器中,然后在程序中通过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数据源
访问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内容:
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.java.sun.com/xml/ns/javaee" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="java.sun.com/xml/ns/javaee 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表,数据一致
说明我们配置的数据源连接成功了!
本文共计1877个文字,预计阅读时间需要8分钟。
一、什么是JNDI数据源JNDI是Java命名与目录接口(Java Naming and Directory Interface)的简称,它是一种在Java应用中用于查找和访问命名资源的标准方式。在J2EE规范中,JNDI是一个重要规范,用于提供命名和目录服务。在开发web程序时,我们常常需要连接数据库,这时经常会编写一个连接池,JNDI数据源正是用于管理连接池的。我们可以将连接池配置在服务器中,然后在程序中通过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数据源
访问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内容:
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.java.sun.com/xml/ns/javaee" xmlns:xsi="www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="java.sun.com/xml/ns/javaee 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表,数据一致
说明我们配置的数据源连接成功了!

