11_JDBC连接池_JNDI
- 格式:docx
- 大小:51.65 KB
- 文档页数:4
jndi原理一、什么是jndiJava命名和目录接口(Java Naming and Directory Interface,简称JNDI)是Java平台提供的一个用于访问命名和目录服务的API。
它允许Java应用程序通过统一的方式访问不同的命名和目录服务,如DNS、LDAP、NIS等。
JNDI提供了一种标准化的方式来管理和查找Java对象,使得开发者可以轻松地将不同类型的资源绑定到Java命名空间中,并通过命名的方式进行访问和管理。
二、JNDI的使用场景JNDI主要用于以下几个方面:1.连接数据库:通过JNDI可以将数据库连接池配置为一个资源,然后通过命名的方式在应用程序中访问数据库连接池,从而降低了应用程序与特定数据库连接池的耦合性,使得数据库的切换更加方便。
2.连接消息队列:JNDI可以将消息队列配置为一个资源,应用程序可以通过命名的方式访问消息队列,从而发送和接收消息。
3.访问企业级资源:在企业级开发中,往往需要访问多个不同的资源,如EJB、JMS、JDBC等。
通过将这些资源配置为JNDI资源,可以通过统一的方式在应用程序中访问这些资源。
4.配置中心:在分布式系统中,经常需要集中管理各个子系统的配置信息。
通过使用JNDI,可以将配置信息存储为JNDI资源,然后在各个子系统中通过命名的方式访问配置信息。
三、JNDI的工作原理JNDI的工作原理可以分为以下几个步骤:1.创建一个初始上下文(Initial Context):应用程序通过调用JNDI提供的API创建一个初始上下文,用于获取其他JNDI资源的入口。
初始上下文是整个JNDI操作的起点。
2.查找JNDI资源:通过初始上下文,应用程序可以通过命名的方式查找指定的JNDI资源。
JNDI提供了一套命名规范,用于标识不同类型的资源。
应用程序可以通过这些命名规范指定要查找的资源。
3.绑定和解绑JNDI资源:应用程序可以将一个Java对象绑定到JNDI上下文中,使得其他应用程序可以通过命名的方式访问该对象。
Oracle数据库连接的⼏种⽅式⼀、本地通过JDBC获得Oracle数据库连接通过JDBC获得Oracle数据库连接,有三种⽅式:OCI⽅式、thin⽅式和JdbcOdbc桥⽅式。
OCI⽅式依赖于本地的动态链接库,如果在本地安装了Oracle数据库客户端可以采⽤该⽅式;⽽thin⽅式为纯java的数据库连接⽅式;JdbcOdbc桥⽅式依赖于本地ODBC数据库源的配置,这种⽅式⼀般不太被采⽤。
1、OCI⽅式 先在本地安装Oracle客户端,安装完之后,在安装的路径中可以找到…/jdbc/lib/classes12.zip⽂件,我们在环境变量classpath中设置classes12.zip所在的路径。
然后通过以下的数据库连接类,在本地通过OCI⽅式获得Oracle数据库连接。
/*** 在本地获得数据库连接*/package com.j2ee.db;import java.util.*;import java.sql.*;import javax.sql.*;import java.io.*;import oracle.jdbc.driver.*;import javax.naming.*;/*** 通过OCI⽅式获得Oracle数据库连接*/public class DbConnection{ final static String sDBDriver = "oracle.jdbc.driver.OracleDriver"; final static String sConnStr = "jdbc:oracle:oci8:sr/sr@ora199"; /** * */ public DbConnection() { } /** * 获得Oracle数据库连接 */ public java.sql.Connection connectDbByOci() { java.sql.Connection conn=null; try { Class.forName(sDBDriver); conn = DriverManager.getConnection(sConnStr); } catch (Exception e) { System.out.println("ERROR:"+e.getMessage()); } return conn; }}/*** 在本地获得数据库连接*/package com.j2ee.db;import java.util.*;import java.sql.*;import javax.sql.*;import java.io.*;import oracle.jdbc.driver.*;import javax.naming.*;/*** 通过thin⽅式获得Oracle数据库连接*/public class DbConnection{ private String sConnStr = ""; /** * 缺省构造器 */ public DbConnection() { sConnStr = "jdbc:oracle:thin:@10.1.4.199:1521:ora199"; } /** * @param ip,serviceName */ public DbConnection(String ip,String serviceName) { sConnStr = "jdbc:oracle:thin:@"+ip+":1521:"+serviceName; } /** * 通过thin⽅式获得Oracle数据库的连接. */ public java.sql.Connection connectDbByThin() { java.sql.Connection conn=null; try { Class.forName(sDBDriver); conn = DriverManager.getConnection(sConnStr,"sr","sr"); } catch (Exception e) { System.out.println("ERROR:"+e.getMessage()); } return conn; } /** * 通过thin⽅式获得Oracle数据库的连接. * @param userId,password */ public java.sql.Connection connectByJdbc(String userId,String password) { java.sql.Connection conn=null; try { Class.forName(sDBDriver); conn = DriverManager.getConnection(sConnStr,userId,password); } catch (Exception e) { System.out.println("ERROR:"+e.getMessage()); } return conn; }} 这种⽅式运⽤起来⽐较灵活,简单,具有较强的移植性和适⽤性。
JNDI全面总结原理:在DataSource中事先建立多个数据库连接,保存在数据库连接池中。
当程序访问数据库时,只用从连接池中取空闲状态的数据库连接即可,访问结束,销毁资源,数据库连接重新回到连接池,这与每次去直接访问数据库相比,会节省大量时间和资源。
JNDI( Java Naming and Directory Interface ),是Java平台的一个标准扩展,提供了一组接口、类和关于命名空间的概念。
如同其它很多Java技术一样,JDNI是provider-based的技术,暴露了一个API和一个服务供应接口(SPI)。
这意味着任何基于名字的技术都能通过JNDI而提供服务,只要JNDI支持这项技术。
JNDI目前所支持的技术包括LDAP、CORBA Common Object Service(COS)名字服务、RMI、NDS、DNS、Windows注册表等等。
很多J2EE技术,包括EJB都依靠JNDI来组织和定位实体。
可以把它理解为一种将对象和名字捆绑的技术,对象工厂负责生产出对象,这些对象都和唯一的名字绑在一起,外部资源可以通过名字获得某对象的引用。
在javax.naming的包包中提供Context接口,提供了两个很好用的方法:<1> void bind( String name , Object object )将名称绑定到对象。
所有中间上下文和目标上下文(由该名称最终原子组件以外的其他所有组件指定)都必须已经存在。
<2>Object lookup( String name )检索指定的对象。
如果name为空,则返回此上下文的一个新实例(该实例表示与此上下文相同的命名上下文,但其环境可以独立地进行修改,而且可以并发访问)。
运行机制:1、首先程序代码获取初始化的JNDI 环境并且调用Context.lookup() 方法从JNDI 服务提供者那里获一个DataSource 对象2、中间层JNDI 服务提供者返回一个DataSource 对象给当前的Java 应用程序这个DataSource 对象代表了中间层服务上现存的缓冲数据源3、应用程序调用DataSource 对象的getConnection() 方法4、当DataSource 对象的getConnection() 方法被调用时,中间层服务器将查询数据库连接缓冲池中有没有PooledConnection 接口的实例对象。
jdbc连接池默认值JDBC(Java Database Connectivity)连接池是用于管理数据库连接的一种技术。
它允许应用程序从连接池中获取数据库连接,使用完毕后将连接返回给连接池,以便其他应用程序可以继续使用。
在使用JDBC连接池时,了解默认配置值对于进行合理的配置至关重要。
一、JDBC连接池概述JDBC连接池是运行在服务器上的一个数据库连接池,它维护着多个数据库连接。
应用程序可以通过请求从连接池中获取一个可用的连接,并在使用完毕后将连接返回给连接池。
连接池可以有效地管理数据库连接,减少因频繁创建和关闭连接所带来的性能损耗。
二、默认连接池配置参数在JDBC连接池的配置中,有一些默认的参数值。
下面是一些常见的默认连接池配置参数:1. 最小空闲连接数(Min Idle Connections):默认值为0。
指定连接池中最小空闲连接的数量。
即使没有正在使用的连接,连接池也会保持该数量的空闲连接。
2. 最大活动连接数(Max Active Connections):默认值为8。
指定连接池中最大的活动连接数。
当请求连接时,如果连接池中所有连接都在使用中,连接池将等待,直到有连接返回。
3. 最大等待时间(Max Wait Time):默认值为-1。
指定从连接池中获取连接的最大等待时间。
当连接池中所有连接都在使用中且达到最大活动连接数时,如果超过最大等待时间仍无法获取连接,将抛出异常。
4. 连接有效性验证查询(Validation Query):默认值为null。
指定用于验证连接是否有效的SQL查询语句。
连接池会定期执行该查询语句,如果查询失败或返回的结果不符合要求,连接将被标记为无效并从连接池中移除。
5. 连接超时时间(Connection Timeout):默认值为-1。
指定从连接池获取连接的最大等待时间。
当连接池中无可用连接且达到最大等待时间时,将抛出异常。
三、自定义连接池配置尽管有默认的连接池配置参数,但根据实际需求,我们可以自定义连接池的配置。
JDBC连接MySQL经典方案最近在学习数据库开发的一些实例,这里浅谈一下用JDBC连接数据库MySQL(当然也可以连接SQL Sever或Oracle了,只是我更喜欢开源软件,同时也更简单)。
首先正确安装好MySQL,建立好数据库studentinfomysql>create database studentinfo;然后编写java代码,ConnectToMySQL.javaimport java.sql.*;public class ConnectToMySQL {public static Connection getConnection() throws SQLException ,ng.ClassNotFoundException{String url = "jdbc:mysql://localhost:3306/studentinfo";Class.forName("com.mysql.jdbc.Driver");String userName = "root";String password = "";Connection con = DriverManager.getConnection(url,userName,password); return con;}public static void main(String[] args) {try{Connection con = getConnection();Statement sql = con.createStatement();sql.execute("drop table if exists student");sql.execute("create table student(id int not null auto_increment,name varchar(20) not null default 'name',math int not null default 60,primary key(id));");sql.execute("insert student values(1,'AAA','99')");sql.execute("insert student values(2,'BBB','77')");sql.execute("insert student values(3,'CCC','65')");String query = "select * from student";ResultSet result = sql.executeQuery(query);System.out.println("Student表数据如下:");System.out.println("---------------------------------");System.out.println("学号"+" "+"姓名"+" "+"数学成绩");System.out.println("---------------------------------");int number;String name;String math;while(result.next()){number = result.getInt("id");name = result.getString("name");math = result.getString("math");System.out.println(number + " " + name + " " + math);}sql.close();con.close();}catch(ng.ClassNotFoundException e){System.err.println("ClassNotFoundException:" + e.getMessage()); }catch(SQLException ex){System.err.println("SQLException:" + ex.getMessage());}}}要注意的是使用MySQL数据库,需要用到对应的JDBC驱动程序mysql-connector-java-5.0.3import java.sql.Connection;import java.sql.DriverManager;import java.sql.SQLException;import java.sql.ResultSet;import java.sql.Statement;import java.sql.*;public class BaseConnection {private Connection con = null;protected Connection getCon(){ResultSet rs=null;Statement stmt = null;try {Class.forName("org.gjt.mm.mysql.Driver");String url="jdbc:mysql://192.168.0.10/数据库名?user=USR&password=PWD";conn = DriverManager.getConnection(url);stmt = conn.createStatem ent();} catch (ClassNotFoundException e) {e.printStackTrace();} catch (SQLException e) {e.printStackTrace();}return con;}}1.把 mysql-connector-java-5.0.3-bin.jar放到%JAVA_HOME%\jre\lib\ext下2.访问类:package mysqldb;import java.sql.*;public class MysqlCon {private static String DriverName = "org.gjt.mm.mysql.Driver";private String dbURL = "jdbc:mysql://localhost/test";private String dbuser = "root";private String dbpassword = "";private Connection conn;private Statement stmt;private ResultSet rs;public MysqlCon(){try {Class.forName(DriverName).newInstance();conn = DriverManager.getConnection(dbURL,dbuser,dbpassword);stmt = conn.createStatement();String sql = "select * from worker";rs = stmt.executeQuery(sql);while(rs.next()){System.out.println(rs.getString(1));}} catch (InstantiationException e) {// TODO 自动生成catch 块e.printStackTrace();} catch (IllegalAccessException e) {// TODO 自动生成catch 块e.printStackTrace();} catch (ClassNotFoundException e) {// TODO 自动生成catch 块e.printStackTrace();} catch (SQLException e) {// TODO 自动生成catch 块e.printStackTrace();}}}package interphase;import java.sql.ResultSet;import java.sql.SQLException;import java.util.Vector;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTable;import javax.swing.table.AbstractTableModel;import mysqldb.MysqlCon;public class ShowRS {private AbstractTableModel atm;private JTable jtable;private Vector vector;private JScrollPane jsp;private String title[]={"职工号","职工名","性别","出生日期","工资"}; private MysqlCon mysqlcon;private JFrame frame;public ShowRS(){vector = new Vector();atm = new AbstractTableModel(){public int getColumnCount() {return title.length;}public int getRowCount() {return vector.size();}public Object getValueAt(int rowIndex, int columnIndex) {if(!vector.isEmpty())return ((Vector)vector.elementAt(rowIndex)).elementAt(columnIndex); elsereturn null;}//取得单元格中的属性值public String getColumnName(int columnIndex){return title[columnIndex];}//数据模型不可编辑,该方法设置为空public void setValueAt(){}//取得列所属对象类public Class getCoumnClass(int c){return getValueAt(0,c).getClass();}//设置单元格不可编辑,为缺省实现public boolean isCellEditable(int row,int column){return false;}};jtable = new JTable(atm);jtable.setToolTipText("显示全部查询结果");jtable.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);jtable.setCellSelectionEnabled(false);jtable.setShowVerticalLines(true);jtable.setShowHorizontalLines(true);jsp = new JScrollPane(jtable);mysqlcon = new MysqlCon();vector.removeAllElements();atm.fireTableDataChanged();try {ResultSet rs = mysqlcon.getResultSet();while(rs.next()){Vector rec_vector = new Vector();rec_vector.addElement(rs.getString(1));rec_vector.addElement(rs.getString(2));rec_vector.addElement(rs.getString(3));rec_vector.addElement(rs.getDate(4));rec_vector.addElement(new Float(rs.getFloat(5)));vector.addElement(rec_vector);}} catch (SQLException e) {// TODO 自动生成catch 块e.printStackTrace();}atm.fireTableDataChanged();frame = new JFrame();frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.add(jsp);frame.setSize(400,300);frame.setVisible(true);}}教程由JAVA中文网整理校对发布()JDBC连接MySQL加载及注册JDBC驱动程序Class.forName("com.mysql.jdbc.Driver");Class.forName("com.mysql.jdbc.Driver").newInstance();JDBC URL 定义驱动程序与数据源之间的连接标准语法:<protocol(主要通讯协议)>:<subprotocol(次要通讯协议,即驱动程序名称)>:<data source identifier(数据源)>MySQL的JDBC URL格式:jdbc:mysql//[hostname][:port]/[dbname][?param1=value1][¶m2=value2 ]….示例:jdbc:mysql://localhost:3306/sample_db?user=root&password=your_passwor d常见参数:user 用户名password 密码autoReconnect 联机失败,是否重新联机(true/false)maxReconnect 尝试重新联机次数initialTimeout 尝试重新联机间隔maxRows 传回最大行数useUnicode 是否使用Unicode字体编码(true/false)characterEncoding 何种编码(GB2312/UTF-8/…)relaxAutocommit 是否自动提交(true/false)capitalizeTypeNames 数据定义的名称以大写表示建立连接对象Stringurl="jdbc:mysql://localhost:3306/sample_db?user=root&password=your_pa ssword";Connection con = DriverManager.getConnection(url);建立SQL陈述式对象(Statement Object)Statement stmt = con.createStatement();执行SQL语句executeQuery()String query = "select * from test";ResultSet rs=stmt.executeQuery(query);结果集ResultSetwhile(rs.next()){rs.getString(1);rs.getInt(2);}executeUpdate()String upd="insert into test (id,name) values(1001,xuzhaori)";int con=stmt.executeUpdate(upd);execute()示例:try{}catch(SQLException sqle){}finally{}Java类型和SQL类型技术手册P421PreparedStatement(预编语句)PreparedStatement stmt = conn.prepareStatement("insert into test(id,name)values(?,?)");stmt.setInt(1,id);stmt.setString(2,name);注:一旦设定语句的参数值后,就可以多次执行改语句,直到调用clearParameters()方法将他清除为止CallableStatement(预储程序)技术手册P430JDBC2.0使用ResultSet对象中的光标上下自由移动Statement stmt = con.createStatement (ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_READ_ONLY);ResultSet rs=stmt.executeQuery("select * from test");public Statement createStatement(int resultSetType,int resultSetConcuttency) throws SQLExceptionresultSetTypeTYPE_FORWARD_ONLY 只能使用next()方法。
javaDatasource,数据库连接池⽬前有多重⽅式创建数据库连接池:JNDI,DBCP,C3P0等为什么需要连接池:使⽤java API DriverManager.getConnection()创建数据库连接,耗费内存和时间,实时性低;这种⽅式获取的connection需要⼿动关闭,不然会耗费⼤量的内存资源;对于频繁数据库操作,这种⽅式会造成性能低,尤其web应⽤数据库连接池的功能:负责创建、管理和分配数据库连接。
初始化数据库连接池时,会创建⼀定数量的数据库连接对象,并存放于数据库连接池中。
当请求连接数据库时,连接池会分配处于空闲状态的连接;数据库连接不被使⽤时,会被连接池回收,并设置为空闲状态;当连接空闲时间⼤于在初始化连接池设定的连接空闲时间,连接池释放该连接。
数据库连接池介绍:1、 JNDI2、 C3p03、 Apache的Jakarta DBCP4、 BoneCP其中,sping框架依赖的第三⽅使⽤了c3p0和dbcp两种⽅式;⽽bonecp号称是速度最快的数据库连接池。
JNDI⽅式创建实现的datasource 是真正实现了javax.sql.datasource;其他的三种⽅式都不是。
下⾯的列表,列出了⼏种⽅式的区别和不同:序号连接池名称依赖的jar包实现的datasource类备注1JNDI该数据源是由相应的web服务器(例如:tomcat,weblogic,websphere)负责初始化,创建,管理。
程序中不需要引⼊特别的jar包。
Javax.sql.datasource2C3P0c3p0-0.9.xxx.jar boPooledDataSource3DBCP commons-dbcp.jar,commons-pool.jarmons.dbcp.BasicDataSource4BoneCP bonecp-0.6.5.jar· google-collections-1.0.jar· slf4j-api-1.5.11.jar· slf4j-log4j12-1.5.11.jar·log4j-1.2.15.jarBoneCPDataSource备注:以上⼏种⽅式的数据库连接池的配置参数⼤同⼩异,略有差别;其参数的配置,既可以通过配置⽂件的⽅式配置,也可以通过硬编码的⽅式配置。
JAVA使用JDBC连接数据库的几种方式JDBC(Java Database Connectivity)是Java编程语言用于连接数据库的一种标准API。
它提供了一种访问和操作不同类型数据库的方法。
在JDBC中,有几种不同的方式可以连接数据库。
下面是常见的几种方式以及它们的详细介绍。
1.使用JDBC驱动程序连接数据库2. DriverManager类连接数据库DriverManager是一个Java类,用于管理JDBC驱动程序。
它提供了一种简单的方法来注册和获取特定驱动程序的连接。
使用DriverManager 连接数据库时,首先需要加载驱动程序,并使用驱动程序的URL、用户名和密码创建连接。
然后可以使用这个连接执行SQL查询和更新操作。
3. DataSource接口连接数据库DataSource是一个接口,用于从数据库连接池获取连接。
连接池是一组预先创建的数据库连接,可以重复使用,从而提高应用程序的性能。
通过使用DataSource接口,可以通过配置连接池的方式来连接和管理数据库连接。
这种方式通常适用于大型应用程序或需要高并发连接的场景。
4. 使用JNDI(Java Naming and Directory Interface)连接数据库JNDI是Java提供的一种用于在Java应用程序中查找和访问命名服务的API。
通过使用JNDI,可以在应用程序中配置数据库连接信息,并使用统一的方式访问数据库。
这种方式通常适用于企业级应用程序,其中数据库连接信息可以统一管理。
5.使用第三方库连接数据库除了使用JDBC标准API连接数据库,还可以使用一些第三方库来简化数据库访问。
例如,Hibernate是一个流行的Java持久化框架,它提供了一种简单的方式来与数据库进行交互。
使用Hibernate,可以通过简单的配置来连接和管理数据库。
总结:上述是几种使用JDBC连接数据库的方式。
每种方式都有自己的优势和适用场景。
jdbc连接池默认值JDBC连接池是一种数据库连接管理技术,它可以在应用程序和数据库之间建立连接,并且可以对连接进行有效的管理和优化。
在使用JDBC连接池时,有一些默认值需要了解和注意。
本文将介绍JDBC连接池的默认值。
1. 连接池大小JDBC连接池的默认值中,最重要的一个参数是连接池的大小。
连接池的大小决定了同时可以有多少个数据库连接可用于应用程序。
在JDBC规范中,默认的连接池大小通常是8或者10。
这个值可以通过配置参数进行修改,以满足应用程序的需求。
2. 最小空闲连接数最小空闲连接数是指连接池中保持空闲状态的最小连接数。
当应用程序不再需要连接时,连接池会将连接放回连接池中,以备后续使用。
最小空闲连接数的默认值通常是0或者1,这意味着连接池没有连接空闲时会关闭连接。
3. 最大连接数最大连接数是指连接池最多可以创建的连接数。
如果达到了最大连接数,并且所有连接都在使用中,新的连接请求将会被阻塞,直到有连接可用。
默认情况下,最大连接数的默认值通常是100。
4. 连接超时时间连接超时时间是指从连接池获取连接开始,到连接建立完成的时间限制。
如果连接超过了指定的超时时间仍然未成功建立,将会抛出连接超时的异常。
默认情况下,连接超时时间的默认值通常是30秒。
5. 连接最大空闲时间连接最大空闲时间是指连接在连接池中最长可保持空闲的时间。
如果一个连接在指定的时间内没有被使用,将会被连接池关闭。
默认情况下,连接最大空闲时间的默认值通常是1800秒。
6. 连接最大生存时间连接最大生存时间是指连接在创建后最长可存活的时间。
如果一个连接的生存时间超过指定的时间,将会被连接池关闭。
默认情况下,连接最大生存时间的默认值通常是-1,即连接可以无限期存活。
总结:JDBC连接池的默认值在大多数情况下可以满足一般应用程序的需求。
但是,不同的应用场景可能需要根据实际情况进行调整。
通过对JDBC连接池的默认值进行了解和设置,可以提高应用程序的性能和可靠性,同时避免资源的浪费和泄漏。
JDBC 连接池
连接池的作用:对JDBC性能的优化, 主要对Connection进行管理
连接池设计思路
面试的时候不要死在这里了
以后工作时根据不同的系统和项目需求根据理论来设计即可JDBC连接池设计思路
还应考虑线程同步问题, 连接池的容量, 数据库的最大连接数等. 第三方连接池
Apache Commons DBCP
C3P0
PoolMan
…
Tomcat配置数据库连接池参数说明
●JNDI Name:注册到JNDI树上的名称
●Data Source URL:连接数据库的URL
●JDBC Driver Class:jdbc数据库驱动的名称
●User Name:访问数据库的名称
●Password:访问数据库的密码
●Max. Active Connections:最大活跃连接数,指同时可以有多少个连接,设置为0则没
有限制
●Max. Idle Connections:最大空闲连接数,表示没有数据库连接时,连接池也必须保持
最大空闲连接数,设置为0则没有限制
●Max. Wait fo Connections:建立连接等待时间,单位:毫秒,设置为-1则无限制
●Validation Query:此参数是用来查询池中的空闲连接(可以不用配置)
使用连接池
java:comp/env/jdbc/shop
注意:(Tomcat 6.x)
●在Tomcatconf目录下面context.xml配置是针对所有项目都有效的
●那么在WebApp下面的META-INFO里面的context.xml配置只对本项目有效
●如果两个同时有,都有效,相同的配置以Tomcat的配置为准
JNDI
百度名片
JNDI(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API。
命名服务将名称和对象联系起来,使得我们可以用名称访问对象。
目录服务是一种命名服务,在这种服务里,对象不但有名称,还有属性。
●理解JNDI的用途
●在命名服务中创建一个SubContext, 绑定, 重新绑定, 接触绑定和查找对象●使用管理控制平台查看JNDI树
Java命名和目录接口
●命名和目录服务把标识符和资源关联起来
JNDI是用于访问不同的命名和目录服务的统一接口
何时使用JNDI
●JNDI是一种查找服务, 用于查找:
⏹Web应用环境变量
⏹EJBs和它们的环境变量
⏹通过DataSources的数据库连接池
⏹JMS目标和连接工厂
⏹其他服务
●不要将JNDI当作数据库使用
⏹JNDI对象存储在内存中
⏹访问JNDI对象与网络性能有关
一些JNDI环境属性
jndi.properties
jndi.properties文件为所有的Initial Contexts设置默认的属性
jndi.properties文件的搜索顺序
●CLASSPATH
●JAVA_HOME/lib/
示例jndi.properties (weblogic)
java.naming.factory.initial=webloogic.jindi.WLInitialContextFactory
java.naming.provider.url=t3://localhost:7001
java.naming.securiry.principal=system
java.naming.security.credentials=password
使用这些默认值
Context ctx = new InitialContext();
从JNDI查找
●lookup()从JNDI树获得对象
●通过lookup()返回的对象必须映射到他们合适的类型
远程绑定对象
●绑定到远程命名服务的对象必须是可序列化的
●访问命名服务时, 对象是采用复制机制
JNDI 绑定示例
public static Context getInitialContext() throws NamingExcption { Environment env = new Environment();
env.setProviderUrl(“t3://localhost:7001”);
env.setSecurityPrincipal(“system”);
env.setSecurityCredendtials(“password”);
Context context = env.getInitialContext();
return context;
}
//获得initial context
Context ctx = getInitialContext();
//创建一个对象
UserManager usermgr = new UserManager();
ctx.rebind(“usermgr”,usermgr );
ctx.close();
解除绑定
ctc.unbind(“usermgr”);
可能的异常, 当于JNDI交互时可能发生的异常
●AuthenticationException
●CommunicationException
●InvalidNameException
●NameNotFoundException
●NoInitialContextException
JNDI小结
●了解JNDI的用途
●在JNDI中绑定, 重新绑定和解除绑定对象
●通过JNDI API查找绑定对象。