Spec-Zone .ru
спецификации, руководства, описания, API
След: Именование Java и Интерфейс Каталога
Урок: Усовершенствованные Темы для Пользователей LDAP
Раздел: управление Соединением
Создание
Домашняя страница > Именование Java и Интерфейс Каталога > Усовершенствованные Темы для Пользователей LDAP

Создание

Есть несколько путей, которыми создается соединение. Наиболее распространенный способ от создания начального контекста. Когда Вы создаете InitialContext, InitialDirContext, или InitialLdapContext при использовании поставщика услуг LDAP, соединение сразу устанавливается с целевым сервером LDAP, названным в свойстве Context.PROVIDER_URL. Каждый раз, когда начальный контекст создается, новое соединение LDAP создается. См. раздел Объединения в пул для информации о том, как изменить это поведение.

Если значение свойства содержит больше чем один URL, то каждый URL пробуют поочередно, пока каждый не используется, чтобы создать успешное соединение. Значение свойства тогда обновляется, чтобы быть успешным URL. См. Учебное руководство JNDI для примера того, как создать начальный контекст, используя список URL.

Есть три других прямых пути, которыми создается соединение.

  1. Передавая URL как параметр имени начальному контексту. Когда LDAP или URL LDAPS передают как параметр имени к начальному контексту, информация в URL используется, чтобы создать новое соединение с сервером LDAP, независимо от того, есть ли у начального экземпляра контекста соединение с сервером LDAP. Фактически, начальный контекст не мог бы быть соединен ни с каким сервером. См. Учебное руководство JNDI для получения дополнительной информации о том, как URL используются в качестве имен.
  2. Иначе то, что соединение создается, при помощи Reference. Когда Reference, содержащий LDAP или URL LDAPS, передают к NamingManager.getObjectInstance() или DirectoryManager.getObjectInstance(), новое соединение создается, используя информацию, определенную в URL.
  3. Наконец, когда отсылка сопровождается вручную или автоматически, информация в отсылке используется, чтобы создать новое соединение. См. Учебное руководство JNDI для информации об отсылках.

Совместно используемые Соединения

Экземпляры Context и NamingEnumeration s, которые получаются из одного экземпляра Context, совместно используют то же самое соединение, пока изменения к одному из экземпляров 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");

В этом примере ctx, ctx2, и ctx3 совместно используют то же самое соединение.

Совместное использование делается независимо от того, как экземпляр Context появился. Например, экземпляр Context, полученный следующим отсылка, совместно использует то же самое соединение как отсылка.

Когда Вы изменяете 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 s не был получен из него), то изменения к его среде или средствам управления соединением не будут заставлять новое соединение создаваться. Вместо этого любые изменения, относящиеся к соединению, будут применены к существующему соединению.

Тайм-ауты создания

Не все создания соединения успешны. Если провайдер 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 секунд всего.

См., что Соединение Объединяет раздел в пул для информации о том, как это свойство влияет на объединение в пул соединения.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: управление Соединением
Следующая страница: Закрытие