创建
原文: https://docs.oracle.com/javase/tutorial/jndi/ldap/create.html
有几种方法可以创建连接。最常见的方式是创建初始上下文。使用 LDAP 创建 InitialContext
, InitialDirContext
或 InitialLdapContext
服务供应器,立即使用 Context.PROVIDER_URL
属性中指定的目标 LDAP 服务器建立连接。每次创建初始上下文时,都会创建一个新的 LDAP 连接。有关如何更改此行为的信息,请参阅 Pooling 部分。
如果属性值包含多个 URL,则依次尝试每个 URL,直到使用一个 URL 来创建成功的连接。然后将属性值更新为成功的 URL。有关如何使用 URL 列表创建初始上下文的示例,请参阅 JNDI 教程。
还有其他三种直接创建连接的方式。
- 通过将 URL 作为 name 参数传递给初始上下文。将 LDAP 或 LDAPS URL 作为名称参数传递给初始上下文时,无论初始上下文实例本身是否与 LDAP 服务器建立连接,URL 中的信息都将用于创建与 LDAP 服务器的新连接。实际上,初始上下文可能未连接到任何服务器。有关如何将 URL 用作名称的详细信息,请参阅 JNDI 教程。
- 创建连接的另一种方法是使用
Reference
。当包含 LDAP 或 LDAPS URL 的参考
传递给NamingManager.getObjectInstance()
或DirectoryManager 时。 getObjectInstance()
,使用 URL 中指定的信息创建新连接。 - 最后,当手动或自动跟踪引荐时,引用中的信息用于创建新连接。有关推荐的信息,请参阅 JNDI 教程。
共享连接
派生自
上下文实例的上下文
实例和 NamingEnumeration
s 共享相同的连接,直到更改为上下文之一
实例使得共享不再可能。例如,如果你调用 Context.lookup()
, Context.listBindings()
或 DirContext。搜索()
从初始上下文中获取其他Context
实例,然后所有这些Context
实例将共享相同的连接。
这是 an example
。
// Create initial context
DirContext ctx = new InitialDirContext(env);
// Get a copy of the same context
Context ctx2 = (Context)ctx.lookup("");
// Get a child context
Context ctx3 = (Context) ctx.lookup("ou=NewHires");
在该示例中, ctx
, ctx2
和ctx3
将共享相同的连接。
无论Context
实例如何存在,共享都会完成。例如,通过跟随推荐获得的上下文
实例将与推荐共享相同的连接。
当您更改Context
实例的与连接相关的环境属性(例如用户的主体名称或凭据)时,您进行这些更改的Context
实例将获得其自己的连接(如果共享连接)。 将来从此
Context实例派生的 Context
实例将共享此新连接。 先前共享旧连接的上下文
实例不受影响(即,它们继续使用旧连接)。
这是使用两个连接的 an example
。
// Create initial context (first connection)
DirContext ctx = new InitialDirContext(env);
// Get a copy of the same context
DirContext ctx2 = (DirContext)ctx.lookup("");
// Change authentication properties in ctx2
ctx2.addToEnvironment(Context.SECURITY_PRINCIPAL,
"cn=C. User, ou=NewHires, o=JNDITutorial");
ctx2.addToEnvironment(Context.SECURITY_CREDENTIALS, "mysecret");
// Method on ctx2 will use new connection
System.out.println(ctx2.getAttributes("ou=NewHires"));
ctx2
最初与ctx
共享相同的连接。但是当它的主要和密码属性改变时,它就不能再使用ctx
的连接了。 LDAP 供应器将自动为ctx2
创建新连接。
同样,如果你使用 LdapContext.reconnect()
更改Context
实例的连接控件, Context
实例将获得自己的连接如果连接正在共享。
如果Context
实例的连接没有被共享(即,没有从它派生Context
),那么对其环境或连接控件的更改将不会导致新连接创建。相反,任何与连接相关的更改都将应用于现有连接。
并非所有连接创建都是成功的。如果 LDAP 供应器无法在某个超时期限内建立连接,则会中止连接尝试。默认情况下,此超时时间是网络(TCP)超时值,大约为几分钟。要更改超时时间,请使用“com.sun.jndi.ldap.connect.timeout”
环境属性。此属性的值是表示连接超时的整数的字符串表示形式(以毫秒为单位)。
这是 an example
。
// Set up environment for creating initial context
Hashtable env = new Hashtable(11);
env.put(Context.INITIAL_CONTEXT_FACTORY,
"com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "ldap://localhost:389/o=JNDITutorial");
// Specify timeout to be 5 seconds
env.put("com.sun.jndi.ldap.connect.timeout", "5000");
// Create initial context
DirContext ctx = new InitialDirContext(env);
// do something useful with ctx
在此示例中,如果无法在 5 秒内创建连接,则将引发异常。
如果Context.PROVIDER_URL
属性包含多个 URL,则供应器将使用每个 URL 的超时。例如,如果有 3 个 URL 并且超时已指定为 5 秒,则供应器将总共等待最多 15 秒。
有关此属性如何影响连接池的信息,请参见连接池部分。