Re: List loaded twice from DB

2006-05-31 Thread Mark




Hi Marcus,

Ok, I start to understand now.

Are you sure that under production settings (with cache turned on) it
will re-initialize the property when the page is put back in the pool,
and not when it is checked out of the pool?
I understand the thing about "putting a pristine instance of the page
back to the pool" so that no data of one user gets carried over to
another user, but if the list is loaded when it is returned to the pool
it may be outdated by the time the page is used the next time.

Thanks,

MARK


Schulte Marcus wrote:

  do you have caching disabled?
 I suspect the following?
  Tap inits your prop 
   1. whenever your page is built from the spec/template
   2. whenever it's put back into the pool after use.

With caching disabled 1. and 2. will occur in each request-cycle. 
With production settings, 1 *and* 2 will only occur in the first cycle,
subsequent cycles will only have 2.

btw: I don't disable caching anymore since I discoved the invaluable
reset-Service

  
  
-Original Message-
From: Mark [mailto:[EMAIL PROTECTED]]
Sent: Wednesday, May 31, 2006 7:28 AM
To: Tapestry users
Subject: Re: List loaded twice from DB


Hi Ron,

it sounds like this would work, but isn't this just a workaround for 
something that really should not happen this way in the first place?

Thanks,

MARK

Ron Piterman wrote:


  just an idea: try to implement the 'roomlist' property 
  

yourself, as I 


  described in my previous postings, instead of letting 
  

tapestry do it.


  may be this will help.
don't forget to implement a pageDetachListener which sets 
  

the property 


  to null.
I always had good experience when doing it like this.
Cheers,
Ron


Mark wrote:
  
  
Hi Ron,

I don't understand what you mean by "instead of doing it on 
finishLoad()". I did not do anything with finishLoad(), I 

  

don't know 


  
why it calls the getList.

Here is my .page file:


page-specification 


  

class="com.mark_arnold.sample.rbs1.web.tapestry.page.admin.Roo
mListPage" 


  
   inject property="administrationService" 
object="spring:rbsRoomAdminService" /
   inject property="pageService" object="engine-service:page"/

   inject property="messageResource" 
object="spring:applicationContext"/

   property 
name="roomList"ognl:administrationService.getAllRooms()/property
   property name="debug"true/property
   property name="room"/
   property name="editPageName" 
initial-value="literal:admin/RoomAdminPage"/
/page-specification

My Page class extends BasePage, but only overwrites pageAttached() 
(nothing related to the list in here).

MARK


Ron Piterman wrote:


  use lazy initialization for the list instead of doing it on 
finishLoad() :

public List getXXXList() {
  if (this.xxxList == null )
this.xxxList = readXXXList();
  return this.xxxList;
}

+

pageDetachListener - this.xxxList = null.

Cheers,
Ron


Mark wrote:
  
  
Hi,

I have a simple CRUD scenario with a "ListPage" and a 

  

  

"ModifyPage".


  

  
The ListPage gets all records from the DB by calling the method 
"getAllRooms()" of a "RoomAdminService" and lists them 

  

  

in a table.


  

  
For some reason the query "select * from rooms" is 

  

  

executed twice 


  

  
every time the page is accessed.

getAllRooms() is only referenced once in the .page file 

  

  

to plug a 


  

  
page property, the .html file then references that property

I compared the StackTraces of the two calls, they have identical 
tops and bottoms, but differ somwhere in the middle:

   at $RoomListPage_3.finishLoad($RoomListPage_3.java)
   at 


  

  

org.apache.tapestry.pageload.PageLoader.constructComponent(Pag
eLoader.java:439) 


  

  
   at 


  

  

org.apache.tapestry.pageload.PageLoader.loadPage(PageLoader.java:613)


  

  
   at 
$IPageLoader_10b79e6e7bf.loadPage($IPageLoader_10b79e6e7bf.java)
   at 
$IPageLoader_10b79e6e7c0.loadPage($IPageLoader_10b79e6e7c0.java)
   at 


  

  

o

Re: List loaded twice from DB

2006-05-31 Thread Mark

Hi Nick, thanks for this response.

The next question is probably to be decided by the Tapestry developers, 
but maybe somebody else has some insights on this or knows if this has 
been discussed before:


Would it not make more sense to be able to specify a attach-value and 
a detach-value instead of a initial-value?
This way I could explicitly specify two different values for the two 
points in time of the page's lifecycle. I could do:


property name=myList attach-value=ognl:service.loadListFromDb() 
detach-value=ognl:null/


The reason being that it doesn't seem to make much sense to perform 
resource-expensive operations like DB queries for cleanup AFTER the page 
is used. As far as I understand, this post-use initialization is mainly 
done to prevent data that belongs to one user from being accidentally 
carried over to the next user.
So setting the property to null when the page is returned to the pool 
should be enough for that purpose. Especially since by the time the next 
user gets the page from the pool, the cached value might long be outdated.


On the other hand, this idea sounds too simple for it to never have come 
up before, so maybe there is a good reason against it?!


Thanks,

MARK



Nick Westgate wrote:

Hi Mark.

The initial-value attribute is poorly named.

What it does is initialize your page property when the page
is being *returned* to the pool, so that a page pulled from
the pool has this initial property value.

Of course, to facilitate the above, when a page is first
constructed it must be initialized. That's why you're seeing
two invocations: on construction and on return to the pool.

I suggest you carefully read this entire section:
http://jakarta.apache.org/tapestry/UsersGuide/state.html#state.page-properties 



And the FAQ Where do I initialize values for a page?:
http://wiki.apache.org/tapestry/MoreFrequentlyAskedQuestions

I'm still using T3, not 4, and I use the PageRenderListener approach:

public void pageBeginRender(PageEvent event)
{
// initialize properties etc
if (!event.getRequestCycle().isRewinding())
{
if (getXXX() == null)
{
...
setXXX(...);
}
}
}

Cheers,
Nick.


Mark wrote:

Hi Ron,

it sounds like this would work, but isn't this just a workaround for 
something that really should not happen this way in the first place?


Thanks,

MARK

...
   property 
name=roomListognl:administrationService.getAllRooms()/property


-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]






-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: List loaded twice from DB

2006-05-30 Thread Mark

Hi Ron,

it sounds like this would work, but isn't this just a workaround for 
something that really should not happen this way in the first place?


Thanks,

MARK

Ron Piterman wrote:
just an idea: try to implement the 'roomlist' property yourself, as I 
described in my previous postings, instead of letting tapestry do it.

may be this will help.
don't forget to implement a pageDetachListener which sets the property 
to null.

I always had good experience when doing it like this.
Cheers,
Ron


Mark wrote:

Hi Ron,

I don't understand what you mean by instead of doing it on 
finishLoad(). I did not do anything with finishLoad(), I don't know 
why it calls the getList.


Here is my .page file:


page-specification 
class=com.mark_arnold.sample.rbs1.web.tapestry.page.admin.RoomListPage 

   inject property=administrationService 
object=spring:rbsRoomAdminService /

   inject property=pageService object=engine-service:page/

   inject property=messageResource 
object=spring:applicationContext/


   property 
name=roomListognl:administrationService.getAllRooms()/property

   property name=debugtrue/property
   property name=room/
   property name=editPageName 
initial-value=literal:admin/RoomAdminPage/

/page-specification

My Page class extends BasePage, but only overwrites pageAttached() 
(nothing related to the list in here).


MARK


Ron Piterman wrote:
use lazy initialization for the list instead of doing it on 
finishLoad() :


public List getXXXList() {
  if (this.xxxList == null )
this.xxxList = readXXXList();
  return this.xxxList;
}

+

pageDetachListener - this.xxxList = null.

Cheers,
Ron


Mark wrote:

Hi,

I have a simple CRUD scenario with a ListPage and a ModifyPage.
The ListPage gets all records from the DB by calling the method 
getAllRooms() of a RoomAdminService and lists them in a table.
For some reason the query select * from rooms is executed twice 
every time the page is accessed.


getAllRooms() is only referenced once in the .page file to plug a 
page property, the .html file then references that property


I compared the StackTraces of the two calls, they have identical 
tops and bottoms, but differ somwhere in the middle:


   at $RoomListPage_3.finishLoad($RoomListPage_3.java)
   at 
org.apache.tapestry.pageload.PageLoader.constructComponent(PageLoader.java:439) 

   at 
org.apache.tapestry.pageload.PageLoader.loadPage(PageLoader.java:613)
   at 
$IPageLoader_10b79e6e7bf.loadPage($IPageLoader_10b79e6e7bf.java)
   at 
$IPageLoader_10b79e6e7c0.loadPage($IPageLoader_10b79e6e7c0.java)
   at 
org.apache.tapestry.pageload.PageSource.getPage(PageSource.java:120)
   at 
$IPageSource_10b79e6e724.getPage($IPageSource_10b79e6e724.java)
   at 
org.apache.tapestry.engine.RequestCycle.loadPage(RequestCycle.java:268) 

   at 
org.apache.tapestry.engine.RequestCycle.getPage(RequestCycle.java:251)
   at 
org.apache.tapestry.engine.RequestCycle.activate(RequestCycle.java:609) 

   at 
org.apache.tapestry.engine.PageService.service(PageService.java:66)
   at 
$IEngineService_10b79e6e7af.service($IEngineService_10b79e6e7af.java)
   at 
org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:66) 




and

   at $RoomListPage_3.pageDetached($RoomListPage_3.java)
   at 
org.apache.tapestry.AbstractPage.firePageDetached(AbstractPage.java:452) 

   at 
org.apache.tapestry.AbstractPage.detach(AbstractPage.java:140)
   at 
org.apache.tapestry.pageload.PageSource.releasePage(PageSource.java:147) 

   at 
$IPageSource_10b79e6e724.releasePage($IPageSource_10b79e6e724.java)
   at 
org.apache.tapestry.engine.RequestCycle.cleanup(RequestCycle.java:192)



So it seems like the first call comes out of the finishLoad(), 
while the second call is caused by pageDetached() of my ListPage.



Does anybody know why it would access the getAllRooms() twice?

Thanks,

MARK



-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



Re: List loaded twice from DB

2006-05-29 Thread Ron Piterman

use lazy initialization for the list instead of doing it on finishLoad() :

public List getXXXList() {
  if (this.xxxList == null )
this.xxxList = readXXXList();
  return this.xxxList;
}

+

pageDetachListener - this.xxxList = null.

Cheers,
Ron


Mark wrote:

Hi,

I have a simple CRUD scenario with a ListPage and a ModifyPage.
The ListPage gets all records from the DB by calling the method 
getAllRooms() of a RoomAdminService and lists them in a table.
For some reason the query select * from rooms is executed twice every 
time the page is accessed.


getAllRooms() is only referenced once in the .page file to plug a page 
property, the .html file then references that property


I compared the StackTraces of the two calls, they have identical tops 
and bottoms, but differ somwhere in the middle:


   at $RoomListPage_3.finishLoad($RoomListPage_3.java)
   at 
org.apache.tapestry.pageload.PageLoader.constructComponent(PageLoader.java:439) 

   at 
org.apache.tapestry.pageload.PageLoader.loadPage(PageLoader.java:613)

   at $IPageLoader_10b79e6e7bf.loadPage($IPageLoader_10b79e6e7bf.java)
   at $IPageLoader_10b79e6e7c0.loadPage($IPageLoader_10b79e6e7c0.java)
   at 
org.apache.tapestry.pageload.PageSource.getPage(PageSource.java:120)

   at $IPageSource_10b79e6e724.getPage($IPageSource_10b79e6e724.java)
   at 
org.apache.tapestry.engine.RequestCycle.loadPage(RequestCycle.java:268)
   at 
org.apache.tapestry.engine.RequestCycle.getPage(RequestCycle.java:251)
   at 
org.apache.tapestry.engine.RequestCycle.activate(RequestCycle.java:609)
   at 
org.apache.tapestry.engine.PageService.service(PageService.java:66)
   at 
$IEngineService_10b79e6e7af.service($IEngineService_10b79e6e7af.java)
   at 
org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:66) 




and

   at $RoomListPage_3.pageDetached($RoomListPage_3.java)
   at 
org.apache.tapestry.AbstractPage.firePageDetached(AbstractPage.java:452)

   at org.apache.tapestry.AbstractPage.detach(AbstractPage.java:140)
   at 
org.apache.tapestry.pageload.PageSource.releasePage(PageSource.java:147)
   at 
$IPageSource_10b79e6e724.releasePage($IPageSource_10b79e6e724.java)
   at 
org.apache.tapestry.engine.RequestCycle.cleanup(RequestCycle.java:192)



So it seems like the first call comes out of the finishLoad(), while the 
second call is caused by pageDetached() of my ListPage.



Does anybody know why it would access the getAllRooms() twice?

Thanks,

MARK

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]





-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]



List loaded twice from DB

2006-05-28 Thread Mark

Hi,

I have a simple CRUD scenario with a ListPage and a ModifyPage.
The ListPage gets all records from the DB by calling the method 
getAllRooms() of a RoomAdminService and lists them in a table.
For some reason the query select * from rooms is executed twice every 
time the page is accessed.


getAllRooms() is only referenced once in the .page file to plug a page 
property, the .html file then references that property


I compared the StackTraces of the two calls, they have identical tops 
and bottoms, but differ somwhere in the middle:


   at $RoomListPage_3.finishLoad($RoomListPage_3.java)
   at 
org.apache.tapestry.pageload.PageLoader.constructComponent(PageLoader.java:439)
   at 
org.apache.tapestry.pageload.PageLoader.loadPage(PageLoader.java:613)

   at $IPageLoader_10b79e6e7bf.loadPage($IPageLoader_10b79e6e7bf.java)
   at $IPageLoader_10b79e6e7c0.loadPage($IPageLoader_10b79e6e7c0.java)
   at 
org.apache.tapestry.pageload.PageSource.getPage(PageSource.java:120)

   at $IPageSource_10b79e6e724.getPage($IPageSource_10b79e6e724.java)
   at 
org.apache.tapestry.engine.RequestCycle.loadPage(RequestCycle.java:268)
   at 
org.apache.tapestry.engine.RequestCycle.getPage(RequestCycle.java:251)
   at 
org.apache.tapestry.engine.RequestCycle.activate(RequestCycle.java:609)
   at 
org.apache.tapestry.engine.PageService.service(PageService.java:66)
   at 
$IEngineService_10b79e6e7af.service($IEngineService_10b79e6e7af.java)
   at 
org.apache.tapestry.services.impl.EngineServiceOuterProxy.service(EngineServiceOuterProxy.java:66)



and

   at $RoomListPage_3.pageDetached($RoomListPage_3.java)
   at 
org.apache.tapestry.AbstractPage.firePageDetached(AbstractPage.java:452)

   at org.apache.tapestry.AbstractPage.detach(AbstractPage.java:140)
   at 
org.apache.tapestry.pageload.PageSource.releasePage(PageSource.java:147)
   at 
$IPageSource_10b79e6e724.releasePage($IPageSource_10b79e6e724.java)
   at 
org.apache.tapestry.engine.RequestCycle.cleanup(RequestCycle.java:192)



So it seems like the first call comes out of the finishLoad(), while the 
second call is caused by pageDetached() of my ListPage.



Does anybody know why it would access the getAllRooms() twice?

Thanks,

MARK

-
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]