Hi guys,
Just new to this list and JBoss.
My question centers around efficient loading of
EJBs into JBoss's EJB cache.
Normally if you have a finder method,
findByXXXYYYZZZ etc, which returns an Enumeration
of the EJBs in question, you have a corresponding
ejbFindByXXXYYYZZZ method that returns
an Enumeration of primary key objects for that
particular EJB.
My understanding is that the implementation of
the findByXXXYYYZZZ method by the container will generally call
findByPrimaryKey with the Primary key objects
that are returned by ejbFindByXXXYYYZZ one by one to load each EJB if it's not
already in the cache. This typically involves
an individual select statement from the database etc for each EJB to be loaded.
If the cache is empty on startup, and you have a
finder method returning say 5000 objects, then that will generate 5000
individual selects to the database, not very efficient. I have seen a third
party trading system done using BMP
on WebLogic whereby initially they have to load
up a portfolio of 100,000 trades to run a Risk report on them. Takes about 30
minutes plus to start it up. Not nice.
Really what you want is one select statement to
get all the relevant information. How do you fit that into the EJB container
architecture though?
I know O/R tools like TopLink can integrate with
say WebLogic so that WebLogic uses TopLink as it's cache. TopLink does support
I believe instantion of lots of objects with one query. So you can in effect
quickly load the cache. Therefore the container will find all the objects for
the primary key are already in the cache and won't call findByPrimaryKey, at
least that is my understanding of it, please correct me if I'm wrong
here.
Now in relation to JBoss, and leaving aside JAWS
for a moment because supposing I want to use BMP, how would I do this with
JBoss if I didn't want to use a third party O/R tool. You don't want to break the container contract obviously but I
can't see how you would avoid doing what the container would do.
Here's the sequence of events I would see
happening in this hypothetical ejbFindByXXX method
Method findByXXX called.
Delegated to ejbFindByXXX
Select query to database.
Iterate through results set.
Get the primary key from each row
Check if it's in the cache.
If it is not, create a new EJB and populate it
from the result set and insert it into the cache
Regardless, add the EJB primary key to the
enumeration
Return the enumeration
Now the container generated method would do
pretty much the same thing, but will always find the EJB in the cache
because we've put it there, and hence will
never call findByPrimaryKey and generate loads of
select statements.
However we would be messing with the containers
cache which is completely outside the contract
and we would be duplicating what the container
does ourselves, so it's not a satisfactory way of doing
things.
Is there a legit way of doing this, or is it
simply not possible to avoid all those calls to findByPrimaryKey
and the associated select
statements.
Would JAWS CMP do it efficiently?
Regs,
Paul