session object in Java web services

User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

session object in Java web services

Post by Sabina »

Начитавшись по делу и не по делу про session и persistent objecs в J2EE applications, хочу понять такую вещь на практическом примере:

Я добавила в Main menu action, который вызывает report из базы данных, при этом слепо скопировав кусок кода для вызова ReportUtils из соседнего action. Когда стала тестировать оказалось, что report не обновляется в соответствии с database changes до тех пор, пока клиент не logout->login again.

Стала разбираться оказалось, что когда в action после вызова соответствующего веб сервиса(через ReportUtils), создается report table (заполняется ArrayList), то она при последующем вызове не обновляется, так как перед этим вызовом стоит проверка if (equipmentLst ==null), вот так примерно:

Code: Select all

  
.....
ArrayList equipmentLst;

public void actionPerformed(ActionEvent e) {
    String msg = "";
    String xml = "";
    if (equipmentLst == null) {
         equipmentLst = ReportUtils.getEquipmentReportList();
         if (equipmentLst == null) {
           msg = "Equipment report is not available. ";
           JOptionPane.showMessageDialog(ClientUtils.getMainFrame(),
           msg,
           Globals.getResourceBundle().getString("message.information"),
           JOptionPane.INFORMATION_MESSAGE);
           return;
         }
       }
       Boot.start();
       .......


Устранение первого

Code: Select all

 if (equipmentLst == null) {
решило проблему. То есть похоже единожды созданная report table существует на протяжении всей сессии и потом уничтожается.

С другой стороны, вызывая каждый раз

Code: Select all

equipmentLst = ReportUtils.getEquipmentReportList();

я создаю новый session object для каждого вызова этого report.

Мой вопрос в том насколько рационален такой подход? Может можно как-то сделать так, чтобы не нужно было создавать нового session object каждый раз. Ведь там может быть всего одни аттрибут изменен, а мы каждый раз всю таблицу заново пересоздаем.

Спасибо,
Сабина
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: session object in Java web services

Post by Sabina »

del
Last edited by Sabina on 05 Mar 2004 09:23, edited 1 time in total.
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

Из такого маленького куска кода непонятно о чем идет речь.
Что вы имеете в виду под веб-сервисами? Где это все происходит, почему создается session object?
В общем, нужно поточнее сформулировать вопрос, в правильно сформулированом вопросе половина ответа :mrgreen:
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

del
Last edited by Sabina on 05 Mar 2004 09:23, edited 1 time in total.
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Post by testuser »

Sabina wrote:сервисы на сервере, java beans ( обычные с get и set) в commons и клиент в виде Swing-овского ГУЯ ( не веб-based). Для создания WSDL файлов используется JavaToWSDL, то они они все сами автоматически создатся на основании написанных классов.Из библиотек Glue4, log4ji, JUnit,...

Мне всегда казалось, что веб сервисы - это J2EE application, а J2EE приложение должно иметь соответствующую архитектуру с разделением бизнес логики от презентации и проч.
То есть получается в нашей модели это как бы есть - вся логика в веб сервисах, презентация в ГУЕ. Но скажем те же SQL queries у нас сидят в services/resources/db.properies, а не в каких не в session beans. То есть вообще с EJB не работаем.

Я хочу понять можно ли такое приложение назвать J2EE или нет?

Что касается приведенного выше кода, я просто заметила, что созданный объект получается существует на протяжении всей сессии. Я так думаю, я искала признаки session bean, пока не откопала real life EJB код и не поняла как же я сильно ошибалась :mrgreen:

Сабина


Как-то все у вас в куче ...
J2EE это что-то вроде набора API и реккомендаций как с этими API работать. J2EE приложением можно называть приложение использующее API из J2EE.

Вот J2EE APIs:

JDBC API
Java Servlet Technology
JavaServer Pages Technology
Java Message Service
Java Naming and Directory Interface
Java Transaction API
JavaMail API
JavaBeans Activation Framework
Java API for XML Processing
Java API for XML Registries
Java API for XML-Based RPC
SOAP with Attachments API for Java
J2EE Connector Architecture
Java Authentication and Authorization Service
Simplified Systems Integration

Вы можете писать приложения, используя эти API. В J2EE есть несколько типов контейнеров - EJB container for EJB, Web Container for JSP and servlets. Это на серверной стороне.
Есть еще Application client container и Applet container на клиентской.

Клиентская сторона может общаться с серверной c использованием нескольких из вышеперечисленных API (JNDI, JMS, SOAP, ...)
Насчет разделения бизнес-логики от презентации, это реккомендации, можно не отделять если очень хочется, но я не советую :umnik1:
Вспомогательные библиотеки это вспомогательные библиотеки, к J2EE они не относятся.

Что обычно понимается под J2EE application.
Несколько вариантов:
1.Enterprise JavaBeans
2.JSP and servlets
3.applets and applcations
4.Web browsers
Web browsers общаются c JSP and servlets. Апплеты и приложения общаются с 1 и 2. Они могут пользоваться для этого JNDI, а могут и SOAP, в случае с веб-сервисами. Это два разных подхода.

Ну в общем где-то так. Вот, на сане можно прочитать туториал:
http://java.sun.com/j2ee/1.4/docs/tutor ... index.html , там в первых главах подробнее объясняется про J2EE.
Надеюсь что понятно объяснил :D
User avatar
Dedal
Уже с Приветом
Posts: 1545
Joined: 03 Feb 1999 10:01

Post by Dedal »

Sabina wrote:...
Я хочу понять можно ли такое приложение назвать J2EE или нет?

Одно из распространенных толкований веб-сервиса, это SOAP over HTTP. У вас такой? Раз HTTP, то на сервере либо сервлеты либо JSP. Такое приложение можно назвать J2EE-приложением.
Sabina wrote:Что касается приведенного выше кода, я просто заметила, что созданный объект получается существует на протяжении всей сессии. Я так думаю, я искала признаки session bean, пока не откопала real life EJB код и не поняла как же я сильно ошибалась :mrgreen:
Сабина

Я надеюсь, Вы не смешиваете session bean с HTTPSession object?
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Post by Sabina »

спасибо, я поняла, что надо мне самой долго и нудно разбираться :)

Сабина
User avatar
Dmitry67
Уже с Приветом
Posts: 28294
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Post by Dmitry67 »

Sabina, как Вас работа достала
Вы еще не спите или встали в такую рань ?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
Sergey_P
Уже с Приветом
Posts: 5280
Joined: 01 Nov 2000 10:01
Location: (RU->WA->NJ->?)

Re: session object in Java web services

Post by Sergey_P »

Sabina wrote:Мой вопрос в том насколько рационален такой подход? Может можно как-то сделать так, чтобы не нужно было создавать нового session object каждый раз. Ведь там может быть всего одни аттрибут изменен, а мы каждый раз всю таблицу заново пересоздаем.

Дык Sabina это Вам должно быть видней и/или писателю ReportUtils
если по "ActionEvent e" можно определить что именно нужно обновить (типа equipmentLst.set(4,newSomething) ) то может и стоит переписать.
Создание объектов само по себе в масштабах HTTP не страшно дорогое мероприятие (ну если только что особо большое/сложное не создавать типа ORB), а вот если для equipmentLst нужно много с базой общатся, а есть возможность этообщение свести к минимуму обновив только конкретный обект
тогда можно действительно сэкономить.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: session object in Java web services

Post by Sabina »

Sergey_P wrote:Дык Sabina это Вам должно быть видней и/или писателю ReportUtils
если по "ActionEvent e" можно определить что именно нужно обновить (типа equipmentLst.set(4,newSomething) ) то может и стоит переписать.
Создание объектов само по себе в масштабах HTTP не страшно дорогое мероприятие (ну если только что особо большое/сложное не создавать типа ORB), а вот если для equipmentLst нужно много с базой общатся, а есть возможность этообщение свести к минимуму обновив только конкретный обект
тогда можно действительно сэкономить.


ReportUtils просто вызывают конкретный метод конкретного веб сервиса, то есть весь этот массив equipmentLst заполняется исключительно после запроса из базы. И каждый раз когда в базе что-то поменяется, надо вызывать сервис, иначе не увидишь изменений.

Сервис в свою очередь делает селект из очень complicated view. Короче эти отчеты - это такая нагрузка на систему! И главное из-за того, что одна цифра поменялась происходит целый хасл-басл запроса во view и проч.

Сабина
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Re: session object in Java web services

Post by testuser »

Sabina wrote:ReportUtils просто вызывают конкретный метод конкретного веб сервиса, то есть весь этот массив equipmentLst заполняется исключительно после запроса из базы. И каждый раз когда в базе что-то поменяется, надо вызывать сервис, иначе не увидишь изменений.

Сервис в свою очередь делает селект из очень complicated view. Короче эти отчеты - это такая нагрузка на систему! И главное из-за того, что одна цифра поменялась происходит целый хасл-басл запроса во view и проч.

Сабина


Главное чтобы работало :) Как начнет не хватать скорости, можно будет оптимизировать узкие места. Ну вообще и вначале думать тоже не помешает, но в первую очередь нужна приемлимая функциональность! :umnik1:
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: session object in Java web services

Post by Sabina »

Продолжаю донимать присутствующих своих незнанием (скьюз-ми :roll: )

Вот чего мне написал коллега теоретик:
> The other questions I have, how SQL statements are being separated
> from JSP pages in a real life J2EE JSP/Servlet application?

There are at least two methods. While these methods are not mutually
exclusive, they are not often used together.

Method (1):
Place SQL statements in stored procedures (PL/SQL in Oracle
environments and Transact SQL in Microsoft SQL Server/Sybase ASE
environments). You give the developer a set of stored procedures to
invoke. The distributed invocation is performed by the
CallableStatement object. This is what I have been doing in the
assignments.

Method (2):
Entity Beans. RDBMS Relations (tables, as pointed out by Dr. Wilmot) and objects are very different animals. Mapping the two together is very strange. I have
coded some Entity Beans, but I still don't know what is going on. The
word on the street is that Java Data Objects (JDO) will kill Entity
Beans.


Вопрос у меня по этому поводу только одни.
Этот как это "Place SQL statements in stored procedures"? Что бывает, что прям все queries суют в сторэд присиджэс?

Ну хорошо а где тогда хранят пары:

Code: Select all

query name           EXEC up_......
?

Сабина
User avatar
Dedal
Уже с Приветом
Posts: 1545
Joined: 03 Feb 1999 10:01

Re: session object in Java web services

Post by Dedal »

Sabina wrote:Продолжаю донимать присутствующих своих незнанием (скьюз-ми :roll: )

> The other questions I have, how SQL statements are being separated
> from JSP pages in a real life J2EE JSP/Servlet application?

Что значит separated? JSP -- это всего лишь HTML-зованный сервлет, чтобы не писать кучу нудных и непрезентабельных writer.write(). JSP компилируется в сервлет на сервере и там же исполняется, поэтому ему база доступна хошь через Driver, хошь через JNDI. Если Вы спрашиваете, как _спрятать_ SQL-ный код от пользователя, то ему JSP-код не виден, а виден только сгенерированный из него HTML, так что SQL-запрос можно смело вставлять в JSP. Можно, конечно, понаписать кучу хранимых процедур и вызывать их из базы, или можно сделать дополнительный уровень из EJB или другого DB-to-object mapping engine, например, Hibernate. Только зачем все это, если запросы у Вас не динамические и страничек мало?

Теоретик Ваш, похоже, действительно теоретик :) Но течение в сторону упрощения EJB действительно есть, и Entity Beans в первых рядах на увольнение.
User avatar
Sabina
Уже с Приветом
Posts: 5669
Joined: 13 Oct 2000 09:01
Location: East Bay, CA

Re: session object in Java web services

Post by Sabina »

Dedal wrote:
Sabina wrote:> The other questions I have, how SQL statements are being separated
> from JSP pages in a real life J2EE JSP/Servlet application?

Что значит separated? JSP -- это всего лишь HTML-зованный сервлет, чтобы не писать кучу нудных и непрезентабельных writer.write(). JSP компилируется в сервлет на сервере и там же исполняется, поэтому ему база доступна хошь через Driver, хошь через JNDI.


JSP - Web tier,
Business logic (i.e. SQL queries) - Business tier (or EJB container)
соглаcно J2EE specs

Отсюда и слово separated.

Сабина
testuser
Уже с Приветом
Posts: 1071
Joined: 18 Nov 2003 22:53
Location: MA

Re: session object in Java web services

Post by testuser »

Sabina wrote:Вопрос у меня по этому поводу только одни.
Этот как это "Place SQL statements in stored procedures"? Что бывает, что прям все queries суют в сторэд присиджэс?

Ну хорошо а где тогда хранят пары:

Code: Select all

query name           EXEC up_......
?

Сабина


Да, представьте себе, такое бывает. И довольно часто. Таким образом легче контролировать привелегии (можно разрешить выполнять определенную процедуру, а произвольные запросы запретить. К тому-же это может быть гораздо эффективней, когда нужно по результатам одного запроса сделать другой - данные не гоняются туда-сюда.
Но с другой стороны так больше нагружается сервер, ведь большая часть логики выполняется на сервере. Часто в том случае, когда нужно сделать просто селект, его держат (в сервлете или аппликейшене). Это возможно не по правилам хорошего тона, но время может сэкономить :mrgreen:

Return to “Вопросы и новости IT”