Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Историки об Елизавете Петровне: Елизавета попала между двумя встречными культурными течениями, воспитывалась среди новых европейских веяний и преданий...
Топ:
Характеристика АТП и сварочно-жестяницкого участка: Транспорт в настоящее время является одной из важнейших отраслей народного...
История развития методов оптимизации: теорема Куна-Таккера, метод Лагранжа, роль выпуклости в оптимизации...
Выпускная квалификационная работа: Основная часть ВКР, как правило, состоит из двух-трех глав, каждая из которых, в свою очередь...
Интересное:
Инженерная защита территорий, зданий и сооружений от опасных геологических процессов: Изучение оползневых явлений, оценка устойчивости склонов и проектирование противооползневых сооружений — актуальнейшие задачи, стоящие перед отечественными...
Подходы к решению темы фильма: Существует три основных типа исторического фильма, имеющих между собой много общего...
Отражение на счетах бухгалтерского учета процесса приобретения: Процесс заготовления представляет систему экономических событий, включающих приобретение организацией у поставщиков сырья...
Дисциплины:
2022-10-10 | 48 |
5.00
из
|
Заказать работу |
|
|
Ответ: Там не всё. Там не хватает некоторых объектов, которые есть более подробно на 16 слайде.
1. Созданиеконтекста: Hashtableenv = newHashtable(); env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put(Context.PROVIDER_URL, "file:" + directoryName); Contextcontext = newInitialContext(env); 2. Создание DataSource: SQLServerDataSource ds = new SQLServerDataSource(); ds.setUser(user); ds.setPassword(password); ds.setDatabaseName(databaseName); ds.setServerName(serverName); ds.setPortNumber(portNumber); 3. Регистрация context.bind("sql1", ds); |
Нам нужен первый пункт, который называется «Создание контекста». Потому что нам нужно, чтобы наш объект (DataSourse), кто-то сохранил. Кто? Оснастка JDNI. Пункт 1 – это и есть использование того JNDIпростого ручного варианта реализации, который мы нашли, скопировали и всегда используем.
Итак! Что у нас получается?
Hashtableenv = newHashtable(); - у нас есть хэш-таблица. |
Затем, в эту таблицу мы кладем какие-то замечательные строки. Это достаточно интересный код, если вы раньше с таким не сталкивались. Это интересный прием. Представьте себе, что вы создаете сложный объект и у него порядка двадцати настроек. Но все двадцать настроек вам одновременно никогда не нужны. Вам нужно всего несколько. Как написать конструктор в классе, чтобы можно было создать объект, у которого 20 настроек, но, чтобы могла быть совершенно любая комбинация этих настроек? Вы скажете: «Ну давайте сейчас возьмем число сочетаний из 20…». Сразу неправильно! Пишется один конструктор, который перед вами. Вот он! Пишется один конструктор и у него в качестве параметра хэш-таблица. А у хэш-таблицы помещается имя параметра и значение. И всё. Вам нужно 5 параметров? Невопрос. Имя-Значение; Имя-Значение; и т.д. А конструктор берет хэш-таблицу, читает ключи, в ключах лежат значения. Он их сверяет со стандартными, видит их и использует значения. И получается один конструктор, и абсолютно произвольное создание. Идея понятна? А иначе вам придется написать 20 конструкторов, потом вы будете их постоянно модифицировать.
|
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.fscontext.RefFSContextFactory"); env.put(Context.PROVIDER_URL, "file:" + directoryName); Contextcontext = newInitialContext(env); |
Первое, что мы должны сделать, это нажать на библиотеке правой кнопкой, добавить файл jar, и выбрать оставшиеся 2, которые были у нас в этой папочке library.
Всё. Теперь подключены все необходимые библиотеки для работы с этим командным вариантом JNDI. А вот теперь после того как вы подключили библиотеки вы можете нажимать на лампочку.
Нажимаете на лампочку. Она спрашивает: «Добавить оператор HashTable?». Конечно!
Далее у нас идет Context. Вот тут будьте очень аккуратны, потому что Context’ов этих очень много. Мы выбираем первый вариант: javax.naming.Context.
Еще у нас подсвечен InitialContext. Находим javax.naming.InitialContext
Теперь давайте внимательно смотреть, что за значение мы кладем в эту хэш-таблицу? «com.sun.jndi.fscontext.RefFSContextFactory». Что это? Это кто будет обслуживать данную JNDI. Вот этот класс. А второй параметр – обязательный. Куда он будет сохранять? И здесь в качестве directoryNameя обычно пишу «C://». В корень пусть кладет свою регистрацию, которую он для вас делает. Всё.
Вопрос: Этот объект Context кто будет регистрировать - Contextcontext = newInitialContext(env)?
Ответ: «context.bind("sql1", ds);». Вот под таким именем вся регистрация и сохранится – «sql1».
И осталось только теперь аккуратно вместо вот этих вот имен подставить те значения, которые мы собираемся сохранить. Ну и сам объект DataSourceнужно тоже подключить. Вот он, видите? «SQLServerDataSource». Левой кнопочкой добавить оператор импорта для SQLServerDataSource.
И дальше поехали. userменяем на «sa», пароль меняем на «1234»? название базы данных у нас «AdventureWorks»,
Вариант преподавателя – у него была MSSQL |
SQLServerDataSource ds = new SQLServerDataSource(); ds.setUser("sa"); ds.setPassword("1234"); ds.setDatabaseName("AdventureWorks"); ds.setServerName("10.10.110.21"); ds.setPortNumber(1433); |
Мой вариант – у меня MySQL |
Видите? Вся информация в этом объекте. А потом я вызываю context.bind("sql1", ds); и информация сохранена. И это делается один раз. Или делается ответственным человеком на сервере в контейнере-приложений.
|
Итого:
Запускаю F6. А теперь давайте посмотрим в корень диска C://. Внизу появился файлик со странным именем.
Его можно открыть, т.к. это обычный текстовый файл.
Вот наша регистрация. Видите sql1?
Кстати, если еще раз попытаться запустить программу, то она говорит: «дружок, sql1-то у меня уже есть». Т.е. случайно никто регистрацию не сотрет. Изменить – да, а стереть – нет.
Считайте так, что на конкретном сервере приложений данная регистрация выполняется, все это выполняется, информация хранится, и ее никто пальцем не трогает. И ее меняют только ответственные люди.
Понятно, как оно происходит? DataSource–заполнили – и под каким-то замечательным именем сохранили.
А теперь код, относящийся к DataSourceзакомментируем.
Вопрос: Зачем я этот код закомментировал?
Ответ: Последней строчкой после которой мы можем пойти на честно заработанный чай – мы должны сделать клиентскую сторону сделать, которая работает через Context. Вы должны понимать, что это «рукопашная» реализация. Этот объект Contextотсутствует, а он является частью серверной оснастки, т.е. на сервере контейнере-приложений он существует. Поэтому его не надо было создавать ни в первом случае, ни во втором. Но у нас здесь его нет. Так что Contextнам нужен, т.к. без него никуда. В рукопашную мы его создали. А дальше мы из этого объекта Contextставим точку и говорим «lookup». Мы говорим: «Поищи нам, пожалуйста, «sql1»!»
DataSource ds = (DataSource)context.lookup("sql1"); ds.getConnection(); |
Что вернет lookup()? Какой у него тип возвращаемого значения? Object. Какой слабый тип возвращаемого значения! Все дело в том, что тот, который мы объявляем DataSource–это интерфейс. Может быть его не было, когда делали первую версию.
Ответ из зала: Ну там же не только DataSourceможет быть, а много чего еще можно положить.
Ответ препода: Понял. Если имеется ввиду, что там будет регистрация не только БД, а чего угодно, то тогда согласен. На сервере-приложений в контексте лежит регистрация других классов, чтобы я не писал newи имя_класса. Тогда совершенно верно. Это общая идеология.
|
DataSourceмного! Поэтому если вы ошибетесь и выберете из списка не, то имя, то у вас ничего хорошего не выйдет.Нам нужен javax.sql.DataSource.
Нажимаю F6 и я нормально подключаюсь к БД. У препода все работает, однако у меня нет.
Поиск в интернете дал следующий результат: надо настроить права пользователя (GRANTPRIVILEDGES)
Это позволяет писать достаточно гибкий и легко модифицированный администратором код. Так подключаются все объекты на сервере. Любой сторонний объект, который вам нужен для работы он подключается через JNDI.
Проект закрываем. Идем дальше.
А вот эту схему мы должны изучить. И пойдем мы снизу-вверх. DriverManager у нас есть – он выдается вместе с библиотекой. И у нас первый объект, который мы должны изучать по этому слайду – это объект Connection. Я сказал «объект», хотя вы помните, что я говорил «интерфейс». Все, что в рамочки на этой схеме обведено – это интерфейсы. Почему? Это правильно. Я вообще не хочу знать, как какая-то фирма назовет свой объект, который отвечает за связь или еще за что-нибудь. Для этого существует стандарт. Делай как хочешь. Только ты реализуй интерфейс с его 50 методами. Все. Я получаю ссылку на твой объект и вызываю те методы, которые задокументированы.
Давайте мы откроем библиотеку. Она нам тоже пригодится.
Помните мы говорили про современный стиль написания освобождения ресурса? tryс ресурсами. Видите, какой интерфейс autoclosableреализован у этого объекта Connection. Его можно вставить в tryс ресурсом и сам компилятор вам сгенерирует блок finally, в котором вызовет метод close() из этого интерфейса и все ресурсы, которые этот объект занимал, будут освобождены. В нашем случае Connectionбудет разорван, но в случае наличия пула - объект вернется в пул.
|
|
Автоматическое растормаживание колес: Тормозные устройства колес предназначены для уменьшения длины пробега и улучшения маневрирования ВС при...
Индивидуальные и групповые автопоилки: для животных. Схемы и конструкции...
Адаптации растений и животных к жизни в горах: Большое значение для жизни организмов в горах имеют степень расчленения, крутизна и экспозиционные различия склонов...
История создания датчика движения: Первый прибор для обнаружения движения был изобретен немецким физиком Генрихом Герцем...
© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!