创建
原文: 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 contextDirContext ctx = new InitialDirContext(env);// Get a copy of the same contextContext ctx2 = (Context)ctx.lookup("");// Get a child contextContext 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 contextDirContext ctx2 = (DirContext)ctx.lookup("");// Change authentication properties in ctx2ctx2.addToEnvironment(Context.SECURITY_PRINCIPAL,"cn=C. User, ou=NewHires, o=JNDITutorial");ctx2.addToEnvironment(Context.SECURITY_CREDENTIALS, "mysecret");// Method on ctx2 will use new connectionSystem.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 contextHashtable 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 secondsenv.put("com.sun.jndi.ldap.connect.timeout", "5000");// Create initial contextDirContext ctx = new InitialDirContext(env);// do something useful with ctx
在此示例中,如果无法在 5 秒内创建连接,则将引发异常。
如果Context.PROVIDER_URL属性包含多个 URL,则供应器将使用每个 URL 的超时。例如,如果有 3 个 URL 并且超时已指定为 5 秒,则供应器将总共等待最多 15 秒。
有关此属性如何影响连接池的信息,请参见连接池部分。
