Creation

有几种创建连接的方式。最常见的方法是从创建初始上下文开始。使用 LDAP 服务提供者创建InitialContextInitialDirContextInitialLdapContext时,将立即与Context.PROVIDER_URL属性中命名的目标 LDAP 服务器构建连接。每次创建初始上下文时,都会创建一个新的 LDAP 连接。有关如何更改此行为的信息,请参见Pooling部分。

如果属性值包含多个 URL,则依次try每个 URL,直到使用一个 URL 创建成功的连接为止。然后将属性值更新为成功的 URL。有关如何使用 URL 列表创建初始上下文的示例,请参见JNDI Tutorial

创建连接的其他三种直接方式。

  • 通过将 URL 作为名称参数传递给初始上下文。当将 LDAP 或 LDAPS URL 作为名称参数传递给初始上下文时,URL 中的信息将用于创建与 LDAP 服务器的新连接,而不管初始上下文实例本身是否与 LDAP 服务器构建连接。实际上,初始上下文可能未连接到任何服务器。有关如何将 URL 用作名称的更多信息,请参见JNDI Tutorial

  • 创建连接的另一种方法是使用Reference。当包含 LDAP 或 LDAPS URL 的Reference传递到NamingManager.getObjectInstance()DirectoryManager.getObjectInstance()时,将使用 URL 中指定的信息来创建新连接。

  • 最后,当手动或自动遵循引荐时,引荐中的信息将用于创建新的连接。有关推荐的信息,请参见JNDI Tutorial

Shared Connections

从一个Context实例派生的Context实例和NamingEnumerations共享相同的连接,直到对Context实例之一进行更改使共享不再可能。例如,如果您从初始上下文中调用Context.lookup()Context.listBindings()DirContext.search()并获取其他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");

在此示例中,ctxctx2ctx3将共享相同的连接。

不管Context实例如何存在,共享都将完成。例如,通过引用获得的Context实例将与该引用共享相同的连接。

当您更改与连接相关的Context实例的环境属性(例如用户的主体名称或凭据)时,在其上进行这些更改的Context实例将获得其自己的连接(如果共享连接)。将来从此Context实例派生的Context实例将共享此新连接。以前共享旧连接的Context实例不受影响(也就是说,它们 continue 使用旧连接)。

这是使用两个连接的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),则对其环境的更改或连接控件将不会导致创建新的连接。而是,与该连接有关的任何更改都将应用于现有连接。

Creation Timeouts

并非所有连接创建都成功。如果 LDAP 提供程序无法在一定的超时时间内构建连接,它将中止连接try。默认情况下,此超时时间是网络(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 秒,则提供程序将总共 await 最多 15 秒。

有关此属性如何影响连接池的信息,请参见Connection Pooling部分。