EJB Interview Questions
EJB Interview Questions
Session beans are used to manage the interactions of entity and other session
beans,access resources, and generally perform tasks on behalf of the client.
There are two basic kinds of session bean: stateless and stateful.
Stateless session beans are made up of business methods that behave like
procedures; they operate only on the arguments passed to them when they are
invoked. Stateless beans are called stateless because they are transient; they do
not maintain business state between method invocations.Each invocation of a
stateless business method is independent from previous invocations. Because
stateless session beans are stateless, they are easier for the EJB container to
manage, so they tend to process requests faster and use less resources.
Stateful session beans encapsulate business logic and state specific to a client.
Stateful beans are called "stateful" because they do maintain business state
between method invocations, held in memory and not persistent. Unlike stateless
session beans, clients do not share stateful beans. When a client creates a stateful
bean, that bean instance is dedicated to service only that client. This makes it
possible to maintain conversational state, which is business state that can be
shared by methods in the same stateful bean.
There are two basic kinds of entity beans: container-managed ersistence (CMP)
andbean-managed persistence (BMP).
Container-managed persistence beans are the simplest for the bean developer to
create and the most difficult for the EJB server to support. This is because all the
logic for synchronizing the bean's state with the database is handled automatically
by the container. This means that the bean developer doesn't need to write any
data access logic, while the EJB server is
supposed to take care of all the persistence needs automatically. With CMP, the
container manages the persistence of the entity bean. Vendor tools are used to
map the entity fields to the database and absolutely no database access code is
written in the bean class.
1. create methods: To create a new instance of a CMP entity bean, and therefore
insert data into the database, the create() method on the bean's home interface
must be invoked. They look like this: EntityBeanClass ejbCreateXXX(parameters),
where EntityBeanClass is an Entity Bean you are trying to instantiate,
ejbCreateXXX(parameters) methods are used for creating Entity Bean instances
according to the parameters specified and to some programmer-defined
conditions.
A bean's home interface may declare zero or more create() methods, each of
which must have corresponding ejbCreate() and ejbPostCreate() methods in the
bean class. These creation methods are linked at run time, so that when a create()
method is invoked on the home interface, the container delegates the invocation
to the corresponding ejbCreate() and ejbPostCreate() methods on the bean class.
2. finder methods: The methods in the home interface that begin with "find" are
called the find methods. These are used to query the EJB server for specific entity
beans, based on the name of the method and arguments passed. Unfortunately,
there is no standard query language defined for find methods, so each vendor will
implement the find method differently. In CMP entity beans, the find methods are
not implemented with matching methods in the bean class; containers implement
them when the bean is deployed in a vendor specific manner. The deployer will use
vendor specific tools to tell the container how a particular find method should
behave. Some vendors will use object-relational mapping tools to define the
behavior of a find method while others will simply require the deployer to enter
the appropriate SQL command.
There are two basic kinds of find methods: single-entity and multi-entity. Single-
entity find methods return a remote reference to the one specific entity bean that
matches the find request. If no entity beans are found, the method throws an
ObjectNotFoundException . Every entity bean must define the single-entity find
method with the method name findByPrimaryKey(), which takes the bean's
primary key type as an argument.
The unsetEntityContext() method is used at the end of the bean's life cycle
before the instance is evicted from memory to dereference the EntityContext and
perform any last-minute clean-up.
The ejbLoad() and ejbStore() methods in CMP entities are invoked when the
entity bean's state is being synchronized with the database. The ejbLoad() is
invoked just after the container has refreshed the bean container-managed fields
with its state from the database. The ejbStore() method is invoked just before the
container is about to write the bean container-managed fields to the database.
These methods are used to modify data as it's being synchronized. This is common
when the data stored in the database is different than the data used in the bean
fields.
The ejbPassivate() and ejbActivate() methods are invoked on the bean by the
container just before the bean is passivated and just after the bean is activated,
respectively. Passivation in entity beans means that the bean instance is
disassociated with its remote reference so that the container can evict it from
memory or reuse it. It's a resource conservation measure the container employs
to reduce the number of instances in memory. A bean might be passivated if it
hasn't been used for a while or as a normal operation performed by the container
to maximize reuse of resources. Some containers will evict beans from memory,
while others will reuse instances for other more active remote references. The
ejbPassivate() and ejbActivate() methods provide the bean with a notification as to
when it's about to be passivated (disassociated with the remote reference) or
activated (associated with a remote reference).
Q: What is software architecture of EJB?
A: Session and Entity EJBs consist of 4 and 5 parts respetively:
2. A home interface (used for creating objects and for declaring business
methods),
3. A bean object (an object, which actually performs business logic and EJB-
specific operations).
4. A deployment descriptor (an XML file containing all information required for
maintaining the EJB) or a set of deployment descriptors (if you are using some
container-specific features).
Q: The EJB container implements the EJBHome and EJBObject classes. For
every request from a unique client, does the container create a separate
instance of the generated EJBHome and EJBObject classes?
A: The EJB container maintains an instance pool. The container uses these instances
for the EJB Home reference irrespective of the client request. while refering the
EJB Object classes the container creates a separate instance for each client
request. The instance pool maintainence is up to the implementation of the
container. If the container provides one, it is available otherwise it is not
mandatory for the provider to implement it. Having said that, yes most of the
container providers implement the pooling functionality to increase the
performance of the application server. The way it is implemented is again up to the
implementer.
Q: Can the primary key in the entity bean be a Java primitive type such as
int?
A: The primary key can't be a primitive type--use the primitive wrapper classes,
instead. For example, you can use java.lang.Integer as the primary key class, but
not int (it has to be a class, not a primitive)
Some EJB containers, such as BEA WebLogic, provide the ability to tune the
container to minimize passivation calls.
Taken from the WebLogic 6.0 DTD -"The passivation-strategy can be either
"default" or "transaction". With the default setting the container will attempt to
keep a working set of beans in the cache. With the "transaction" setting, the
container will passivate the bean after every transaction (or method call for a non-
transactional invocation).
Q: What is the advantage of using Entity bean for database operations, over
directly using JDBC API to do database operations? When would I use one
over the other?
A: Entity Beans actually represents the data in a database. It is not that Entity Beans
replaces JDBC API. There are two types of Entity Beans Container Managed and
Bean Mananged. In Container Managed Entity Bean - Whenever the instance of
the bean is created the container automatically retrieves the data from the
DB/Persistance storage and assigns to the object variables in bean for user to
manipulate or use them. For this the developer needs to map the fields in the
database to the variables in deployment descriptor files (which varies for each
vendor).
In the Bean Managed Entity Bean - The developer has to specifically make
connection, retrive values, assign them to the objects in the ejbLoad() which will
be called by the container when it instatiates a bean object. Similarly in the
ejbStore() the container saves the object values back the the persistance storage.
ejbLoad and ejbStore are callback methods and can be only invoked by the
container. Apart from this, when you use Entity beans you dont need to worry
about database transaction handling, database connection pooling etc. which are
taken care by the ejb container. But in case of JDBC you have to explicitly do the
above features. what suresh told is exactly perfect. ofcourse, this comes under the
database transations, but i want to add this. the great thing about the entity
beans of container managed, whenever the connection is failed during the
transaction processing, the database consistancy is mantained automatically. the
container writes the data stored at persistant storage of the entity beans to the
database again to provide the database consistancy. where as in jdbc api, we,
developers has to do manually.
Many developers are using EJBs locally -- that is, some or all of their EJB calls are
between beans in a single container.
With this feedback in mind, the EJB 2.0 expert group has created a local interface
mechanism. The local interface may be defined for a bean during development, to
allow streamlined calls to the bean if a caller is in the same container. This does
not involve the overhead involved with RMI like marshalling etc. This facility will
thus improve the performance of applications in which co-location is planned.
Q: What are the special design care that must be taken when you work with
local interfaces?
A: EIt is important to understand that the calling semantics of local interfaces are
different from those of remote interfaces. For example, remote interfaces pass
parameters using call-by-value semantics, while local interfaces use call-by-
reference.
This means that in order to use local interfaces safely, application developers need
to carefully consider potential deployment scenarios up front, then decide which
interfaces can be local and which remote, and finally, develop the application code
with these choices in mind.
While EJB 2.0 local interfaces are extremely useful in some situations, the long-
term costs of these choices, especially when changing requirements and
component reuse are taken into account, need to be factored into the design
decision.
In case of stateful session bean, the bean may be kept in cache till either the
session times out, in which case the bean is removed or when there is a
requirement for memory in which case the data is cached and the bean is sent to
free pool.
Note: Only the container directly interacts with a message-driven bean by creating
bean instances and passing JMS messages to those instances as necessary.
Q: The EJB container implements the EJBHome and EJBObject classes. For
every request from a unique client, does the container create a separate
instance of the generated EJBHome and EJBObject classes?
A: The EJB container maintains an instance pool. The container uses these instances
for the EJB Home reference irrespective of the client request. While refering the
EJB Object classes the container creates a separate instance for each client
request. The instance pool maintainence is up to the implementation of the
container. If the container provides one, it is available otherwise it is not
mandatory for the provider to implement it. Having said that, yes most of the
container providers implement the pooling functionality to increase the
performance of the application server. The way it is implemented is again up to the
implementer.