一、什么是jndi数据源
JNDI是Java命名与目录接口(Java Naming and Directory Interface),在J2EE规范中是重要的规范之一。
我们平时开发web程序的时候,在连接数据库的时候,往往会编写一个连接数据库的类,
例如连接Mysql的类:
可以看到,我们的数据库的驱动名,数据库名称,账号和密码都是通过“硬编码”写死在
程序里的。一旦我们的项目需要数据迁移,或者更换数据库的时候,我们就要停止应用,在代码中
修改数据库的连接信息,这样做非常繁琐和不安全。即使不更换数据库,我们在改变数据库的最大
连接数和最小连接数,以及数据库的其它配置等等,都需要在代码中进行修改,这十分不友好。
我们需要一种外部的数据源,来指定我们的应用程序来链接数据库,对此,我们的应用程序不必
关心数据库的配置,数据库的配置交由独立的模块管理和配置。
近年来,Web开发中涌现了许多框架,如hibernate/Mybatis/Spring,使用他们,可以通过
“数据库连接池”来管理数据库的链接和配置:
这样做就在应用层实现了数据库配置信息独立的机制。这样会使应用程序的数据库配置更加灵活。
而我们的WebLogic服务器,拥有绑定Jndi数据源的功能,也就是服务器来对应用程序的数据库配置
进行托管,应用程序只需要在其应用代码中制定使用jndi模式链接WebLogic的数据源信息即可。
当需要修改数据库信息的时候,根本不需要动应用程序的东西,只需要调整WebLogic的jndi数据源
中的数据库配置信息即可。
也即是说,WebLogic的jndi机制,在服务层实现了数据库配置信息独立的机制。
二、新建Mysql的JNDI数据源
访问http://localhost:7001/console/,登录进入WebLogic控制台主页。
点击左侧“域结构”下的“服务”下的“数据源”选项:
选择新建,一般数据源。
填写数据源的名称,JNDI名称以及选择数据库类型:
选择数据库驱动版本:
其它配置按照默认即可:
填写数据库的连接信息:
接下来点击测试配置,看一下是否能连接成功:
出现“连接测试成功”即表示数据库配置没有问题。
点击下一步,勾选服务器。
点击完成之后,我们服务器端的JNDI数据源就配置完毕了。
三、应用程序引用WebLogic的jndi数据源
我们在MyEclipse中创建一个WebProject测试工程:
编写该连接类:
然后,我们创建一个Servlet,测试数据库是否连接成功并取到数据:
如果编译器没有给你自动在Web.xml中配置Servlet,别忘记自己配置:
接下来,将我们的测试程序部署在WebLogic服务器中:
打开数据库的teacher表,数据一致
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>
这样做就在应用层实现了数据库配置信息独立的机制。这样会使应用程序的数据库配置更加灵活。
而我们的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内容:
-
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,别忘记自己配置:
-
"1.0" encoding="UTF-8" xml version=
-
<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服务器中:
启动服务器,访问应用路径,可以看到:
扫描二维码关注公众号,回复:
2201072 查看本文章
打开数据库的teacher表,数据一致
说明我们配置的数据源连接成功了!
转载请注明出处:http://blog.csdn.net/acmman/article/details/70146603