Enterprise JavaBeans (EJB) FAQ From jGuru Generated Sep 13, 2005 1:25:42 PM Location: http://www.jguru.com/faq/EJB Ownership: http://www.jguru.com/misc/user-agree.jsp#ownership. When was EJB 1.1 defined? Location: http://www.jguru.com/faq/view.jsp?EID=317 Created: Nov 4, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) EJB 1.1 is currently in Public Release 2, a non-final preliminary draft. Final release of the specification is expect by the end of the 4th quarter. How is Version 1.1 better than Version 1.0? Location: http://www.jguru.com/faq/view.jsp?EID=318 Created: Nov 4, 1999 Modified: 2000-06-08 00:01:02.717 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) EJB 1.1 requires support for entity beans, which ensures a more consistent programming model across vendors. In addition, EJB 1.1 addresses many of the ambiguities and loopholes found in the previous specification. Specific differences between EJB 1.1 and EJB 1.0 are addressed in the FAQ entry What's different in Enterprise JavaBeans 1.1. What's different in Enterprise JavaBeans 1.1? Location: http://www.jguru.com/faq/view.jsp?EID=319 Created: Nov 4, 1999 Modified: 1999-11-29 15:08:06.607 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) The most significant changes are listed below: • •
• • • • •
Entity bean support, both container- and bean-managed persistence, is required. Java RMI-IIOP argument and reference types must be supported, but any protocol can still be used including IIOP, JRMP, HTTP, or a proprietary protocol. In other words, the client API must support the Java RMI-IIOP programming model for portability, but the underlying protocol can be anything. The javax.ejb.depoyment package has been dropped in favor of a XML based deployment descriptor Declarative security authorization (access control) has changed to be more role driven. Also the runAs declarations have been eliminated. Declarative isolation levels are no longer available. Isolation levels are now managed explicitly through JDBC (BMP), the database or other vendor specific mechanisms. The bean-container contract as been enhanced to include a default JNDI context for accessing properties, resources, (JDBC, JMS, etc), and other beans. The basic EJB roles have been expanded and redefined to better separate responsibilities involved in the development, deployment, and hosting of enterprise beans.
Available On-line: A comprehensive examination of the changes made in EJB 1.1 This material is from "Appendix D" of the book Enterprise JavaBeans (O'Reilly 1999) Does the new specification impact forward compatibility? Location: http://www.jguru.com/faq/view.jsp?EID=320 Created: Nov 4, 1999 Modified: 1999-11-29 15:12:04.977 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) The new specification requires minor changes to ejbCreate method in containermanaged entity beans as well as changes in how enterprise beans access JDBC connections, environment properties, and other beans. These changes impact forward compatibility requiring small changes to any bean that relies on deprecated EJB 1.0 conventions. Available On-line:An article in JavaWorld magazine titled "Create forward-compatible beans in EJB" addressees techniques for creating forward compatible beans. Available On-line: A comprehensive examination of the changes made in EJB 1.1 This material is from "Appendix D" of the book Enterprise JavaBeans (O'Reilly 1999) When was EJB 1.0 defined? Location: http://www.jguru.com/faq/view.jsp?EID=321 Created: Nov 4, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) EJB 1.0 was released as a final specification in March 1997 at JavaOne '97 in San Francisco. Is Enterprise JavaBeans 1.0 still viable? Location: http://www.jguru.com/faq/view.jsp?EID=322 Created: Nov 4, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Several servers will avoid supporting EJB 1.1 until the new specification is finalized. Those that do support EJB 1.1 are in beta or were just released. This make EJB 1.0 servers attractive, especially those that have been around a while. For this reason, EJB 1.0 remains a viable choice for some EJB projects, but make sure you have a transition plan to upgrade to EJB 1.1 servers when necessary. Forward compatibly (going from EJB 1.0 to EJB 1.1) is a problem with EJB 1.0 which is addressed in the FAQ entry Java:API:EJB:1.1: Does the new specification impact forward compatibility What is Enterprise JavaBeans? Location: http://www.jguru.com/faq/view.jsp?EID=340 Created: Nov 5, 1999 Modified: 1999-11-29 14:38:13.752 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) The official Sun Definition: The Enterprise JavaBeans architecture is a component architecture for the development and deployment of component-based distributed business applications.
Applications written using the Enterprise JavaBeans architecture are scalable, transactional, and multi-user secure. These applications may be written once, and then deployed on any server platform that supports the Enterprise JavaBeans specification. Sun Microsystems, Enterprise JavaBeans™Specification, v1.1, published 1999 In Plain English: Enterprise JavaBeans (EJB) is Sun Microsystems' specification for a distributed object system similar to CORBA and Microsoft Transaction Server, but based on the Java platform. EJB specifies how developers should build components that can be accessed remotely and how EJB vendors should support those components. EJB components, called enterprise beans, automatically handle transactions, persistence, and authorization security, so that the developer can focus on the business logic. What is an enterprise bean? Location: http://www.jguru.com/faq/view.jsp?EID=341 Created: Nov 5, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) An enterprise bean is a server-side component -- defined in the Java technology -which adheres to the Enterprise JavaBeans server-side component model. A serverside component is business object that can be accessed remotely. Many server-side component models exist: CORBA specifies CORBA objects; Microsoft Transaction Server (MTS) defines COM/DCOM; and EJB specifies enterprise beans. Enterprise beans can be developed to represent business concepts like Employee, Order, TravelAgent, etc. Enterprise beans can be assembled into applications that solve enterprise business problems. EJB has two basic types of enterprise beans: Session and Entity. Depending on the type of enterprise bean used, features like persistence, transactions, security, and multiple concurrent access can be managed automatically. Comments and alternative answers
Types of Enterprise JavaBeans Author: Jayasree Suryadevara (http://www.jguru.com/guru/viewbio.jsp?EID=713580), Jan 8, 2002 The new type of JavaBeans introduced in EJB 2.0 are Message Driven Beans (MDB) Message-driven beans (MDBs) are stateless, server-side, transaction-aware components for processing asynchronous JMS messages
What's so special about Enterprise JavaBeans? Location: http://www.jguru.com/faq/view.jsp?EID=342 Created: Nov 5, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Enterprise JavaBeans simplifies the task of developing distributed objects systems. It's easier for developers to create transactional distributed object applications with EJB than with any other Java based component architecture. With Enterprise JavaBeans, transactions, security, and persistence can be handled automatically allowing developer to focus on the business logic. Enterprise JavaBeans has been adopted by most distributed object vendors and is considered a standard for developing distributed object systems in Java. All EJB vendors must implement the same EJB specification which guarantees a consistent programming model across servers. In addition, because EJB is widely supported by many vendors, corporations do not have to worry about vendor lock-in; enterprise beans will run in any EJB compliant server. Comments and alternative answers
I must take exception to the comment made: 'In ad... Author: Jonathan Rasmusson (http://www.jguru.com/guru/viewbio.jsp?EID=1704), Dec 2, 1999 I must take exception to the comment made: 'In addition, because EJB is widely supported by many vendors, corporations do not have to worry about vendor lock-in; enterprise beans will run in any EJB compliant server.' This simple is not true (today). I have been performing EJB compatiblity tests between SynerJ (Suns application server purchased recently in the Forte merger) and WebLogic. Because of differences in deployment descriptor implementations, looseness and changes in the EJB spec, you simply can not move an EJB from one app server to another. Even the implementation of the EJB API itself may very from vendor to vendor (as was the case with SynerJ and WebLogic - they both have different method signatures for the ejbRemove() method of entity bean. As you probably know, Sun has taken steps to tighten up the spec, to ensure vendors implement more compatible EJB containers. Hopefully this time next year, after a few more iterations of the spec, we will be able to move EJBs from one app server to another. You probably already know all this already and I may have taken your FAQ out of context. I am just saying people should be aware that due to the imaturity of the spec, EJBs simply are not portable between the 40 odd vendors out there. Note: I am a big fan of this site and think you are all doing an excellent job. Keep up the great work. Yours truly, Jonathan Rasmusson I agree with Jonathan and I still see EJB in speci... Author: Subramaniam Kumar (http://www.jguru.com/guru/viewbio.jsp?EID=2599), Jan 22, 2000 I agree with Jonathan and I still see EJB in specification mode. For enterprises like mine it is mandatory that we use mature Products not an evolving (probably diverging specifications). If EJB is not ready yet what is the alternative the Java camp provides for Enterprise level distributed object computing. Feedback is appreciated.
Subramaniam Kumar Re: I agree with Jonathan and I still see EJB in speci... Author: Ravi Sinha (http://www.jguru.com/guru/viewbio.jsp?EID=507506), Oct 1, 2001 In my opinion considering Beans as immature is not a right thing. Though its not a robust as it ought to be, but careful design and programming can sure get you good results. Other thing that is not upto the mark, is, total flexibility and ease. But again the argument comes into picture that how much time you have given and feel necessary to think of some technology as mature. Obviously continuously working with some technology as well as eliminating undesired features will sure help in maturing the technology. I hope that will be taken care in future releases. What is a session bean? Location: http://www.jguru.com/faq/view.jsp?EID=730 Created: Nov 9, 1999 Modified: 1999-11-12 04:34:24.275 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) A session bean is a type of enterprise bean; a type of EJB server-side component. Session bean components implement the javax.ejb.SessionBean interface and can be stateless or stateful. Stateless session beans are components that perform transient services; stateful session beans are components that are dedicated to one client and act as a server-side extension of that client. Session beans can act as agents modeling workflow or provide access to special transient business services. As an agent, a stateful session bean might represent a customer's session at an online shopping site. As a transitive service, a stateless session bean might provide access to validate and process credit card orders. Session beans do not normally represent persistent business concepts like Employee or Order. This is the domain of a different component type called an entity bean. Comments and alternative answers
A session bean corresponds to a client server session.... Author: Ashish Mital (http://www.jguru.com/guru/viewbio.jsp?EID=31523), Apr 4, 2000 A session bean corresponds to a client server session. The session bean is created when a client requests some query on the database and exists as long as the client server session exists. Re: A session bean corresponds to a client server session.... Author: Sulam Reddy (http://www.jguru.com/guru/viewbio.jsp?EID=1133674), Dec 12, 2003 A session been corresponds to a client server session. The session bean is created(server may create new instance or it may pick from the pool)on the client request. request need not be related to database.
It is encouraged to use the session beans for business logic rather for database operation.
Session Beans are generally tied to the lifetime of... Author: vishal gupta (http://www.jguru.com/guru/viewbio.jsp?EID=1890), Aug 24, 2000 Session Beans are generally tied to the lifetime of a given client session. They are relatively short-lived; stateful Session objects are created in response to a single client's request,communicate exclusively with a single client, and die when the client no longer needs them. What is a stateful session bean? Location: http://www.jguru.com/faq/view.jsp?EID=917 Created: Nov 12, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) A stateful session bean is an enterprise bean (EJB component) that acts as a serverside extension of the client that uses it. The stateful session bean is created by a client and will work for only that client until the client connection is dropped or the bean is explicitly removed. The stateful session bean is EJB component that implements the javax.ejb.SessionBean interface and is deployed with the declarative attribute "stateful". Stateful session beans are called "stateful" because they maintain a conversational state with the client. In other words, they have state or instance fields that can be initialized and changed by the client with each method invocation. The bean can use the conversational state as it process business methods invoked by the client. Stateful session beans are usually developed to act as agents for the client, managing the interaction of other beans and performing work on behalf of the client application. An example is a shopping cart stateful session bean that tracks a client's product choices and can execute a sale when requested. Below is partial example of a stateful session bean that is used as a shopping cart.
public class ShoppingCartBean implements javax.ejb.SessionBean { // instance fields; The conversational state Vector products = new Vector( ); Customer customer; // initializes bean with reference to customer bean public void ejbCreate(Customer cust){ customer cust; } //add a product to shopping cart public void addItem(Product item) { products.addElement(item);
} //charge customer for products and create a shipping order public void executeSale(){ // get the customer's credit card object CreditCard card = customer.getCreditCard( ); // calculate a total price from products chosen double total; for(int i = 0; i products.size(); i++){ Product product = (Product)products.elementAt(i); total += product.getPrice( ); } // get reference to the CreditService bean and process the customers charge CreditService cardSwipper = ... get credit card service bean Charge charge = cardSwipper.charge(CreditCard, total); // get reference to the OrderHome and create a new shipping order bean (record) OrderHome orderHome = ... get the Order beans Home object Order order = orderHome.create(customer, products, charge); } ... } In the example above the ShoppingCartBean keeps track of the Customer and the items chosen by the client application. This is the bean's conversational state. Once the client application is ready to execute a sale, the ShoppingCartBean manages the interactions of the Customer, Product, CreditServer, and Order beans in a workflow that results in a charge against the customers credit card and the creation of a shipping order. The ShoppingCartBean behaves as an agent for the client managing the interaction of these other beans, tracking chosen items, and executing the sale. The below table identifies the beans types used in the ShoppingCartBean example above.
Bean Name ShoppingCartBean CreditService Customer Product Order
Bean Type Stateful Session Stateless Session Entity Entity Entity
From the clients perspective only the Customer and ShoppingCart beans are visible, because the client application works with the bean's remote interface while the bean
itself resides on the server. This means that the client need only be concerned with the business methods made public by the ShoppingCartBean. Below is an example of the client applications view of the ShoppingCartBean. (Note: The client interacts with the beans remote interface not the bean itself. The remote interface is called the ShoppingCart.) // somewhere in the client application (applet, servlet, etc.) // obtain the home objects (factories) for the Customer and ShoppingCart beans CustomerHome custHm = ... get CustomerHome ShoppingCartHome shpCrtHm = ... get ShoppingCartHome // locate the bean representing the customer named, Bob Johnsten Customer customer = custHome.findByName("Bob","Johnsten"); // create a new ShoppingCart initialized with the Bob Johnsten Customer bean ShoppingCart shoppingCart = shpCrtHm.create(customer); ... Product product = ... get reference to bean representing the product chosen // add product to customer's shopping cart shoppingCart.addItem(product); ... //charge customer for products and create a shipping order shoppingCart.executeSale( ); Session beans like the shoppingCartBean only live as long as the client maintains a connection. In other words, they represent some aspect of the client's current session with the system and die when the client ends that session. Session beans are generally not fault tolerant. A system failure or shut down will result in the death of session bean and a loss of any conversation state it maintained prior to the failure. (This is a conceptual lifecycle of a session bean. Some vendors can make them more fault tolerant and longer lasting). Comments and alternative answers
Is it possible to show the database design? It would... Author: Saryu Mehta (http://www.jguru.com/guru/viewbio.jsp?EID=264323), Dec 11, 2000 Is it possible to show the database design? It would be more helpful. When to use Stateful session beans if it is not fault tolarent? Author: Kumar Nagarajan (http://www.jguru.com/guru/viewbio.jsp?EID=201408), Feb 7, 2002 If it is not possible to restore the state of a SFSB in the case of a system crash, when to use it. How to get around this problem? What is a stateless session bean? Location: http://www.jguru.com/faq/view.jsp?EID=925
Created: Nov 12, 1999 Modified: 1999-11-12 11:36:23.253 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) A stateless session bean is an enterprise bean (EJB component) that provides a stateless service to the client. Conceptually, the business methods on a stateless session bean are similar to procedural applications or static methods; there is no instance state, so all the data needed to execute the method is provided by the method arguments. The stateless session bean is an EJB component that implements the javax.ejb.SessionBean interface and is deployed with the declarative attribute "stateless". Stateless session beans are called "stateless" because they do not maintain conversational state specific to a client session. In other words, the instance fields in a stateless session bean do not maintain data relative to a client session. This makes stateless session beans very lightweight and fast, but also limits their behavior. Stateless session beans are usually developed as a set of related and simple services. Think of a session bean as a functional API where each business method represents an isolated independent service. An example is a CreditService bean that provides methods for making charges against different types of credit cards (MC, Visa, Discovery, etc).
public class CreditService implements javax.ejb.SessionBean { public Charge charge (String accountToCredit, CreditCard card, double amount) throws ValidationException, RemoteException{ // attempt to obtain Merchant bean representing the retailer making the charge. try{ MerchantHome mrchntHome = ... get VendorHome reference Merchant merchant = mrchntHome.findByPrimaryKey(vendorToCredit); }catch(ObjectNotFoundException onfe){ throw new ValidationException("Invalid merchant account number"); } // attempt to create a Charge bean based on the vendor, amount, and credit card info try{ ChargeHome chgHome = ... get ChargeHome reference Charge charge = chgHome.create(merchant, card, amount); return charge; }catch(CreateException ce){ throw new ValidationException(ce.getMessage()); } }
... } In the above example the CreditService bean method charge( ) is completely independent of the bean state or any other methods. The charge( ) method is a stateless service and the CreditService bean is a stateless bean. The charge( ) method uses two other bean types to process the charge. Its normal for stateless beans to use other beans but they can also access the database directly or even other resources like proprietary connections. Below is a list the beans used in this example.
Bean Name CreditService Merchant Charge
Bean Type Stateless Session Entity Entity
An example of how the CreditService bean could be used by a client application or bean is shown in the FAQ entry Java:API:EJB:SessionBean:Stateful:What is a stateful session bean? Comments and alternative answers
What happens if remove( ) is never invoked on a session... Author: Shibu TN (http://www.jguru.com/guru/viewbio.jsp?EID=18320), Feb 26, 2000 What happens if remove( ) is never invoked on a session bean? Re: What happens if remove( ) is never invoked on a session... Author: Pradip Khisti (http://www.jguru.com/guru/viewbio.jsp?EID=81675), Mar 26, 2002 The remove method on the Statless Bean is just a hint to the container by the Client to remove it from the pool.It totally depends on the EJB Container how to handle Instance pooling of session Beans.Hence it is safe not to invoke the remove method What is an entity bean? Location: http://www.jguru.com/faq/view.jsp?EID=1075 Created: Nov 16, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) An entity bean is a type of enterprise bean; a type of EJB server-side component. Entity bean components implement the javax.ejb.EntityBean interface and can be container-managed (CMP) or bean-managed (BMP). Entity beans are designed to represent data in the database; they wrapper data with business object semantics and read and update data automatically.
Entity beans have identity, where each bean represents a unique set of data. An entity bean of type Customer, for example, would have thousands of identities -- one for each customer in the database. Entity beans can be safely shared by many clients, so that several applications can access the same bean identity at the concurrently. A bean developer might choose to create a Customer bean to represent customer data in the database. The bean developer decides what data from the database represents a customer and how customers are uniquely identified. The bean developer also decides what business methods the Customer bean expose and what data can be changed or read. Below is the server-side component definition of a Customer bean.
public class CustomerBean implements javax.ejb.EntityBean { // persistent fields public long customerNumber; public Date lastActive; public String lastName; public String firstName; // initialization method for creating a new customer public CustomerKey ejbCreate(long id, PersonName name){ customerNumber = id; setName(name); lastActive = new Date(); return new CustomerKey(id); } // business methods public PersonName getName( ){ return new PersonName(firstName, lastName); } public void setName(PersonName name){ lastName = name.getLastName(); fistName = name.getFirstName(); } public Date lastActive( ){ return lastActive; } ... } Note: Only a subset of the bean code normally implemented is shown here for brevity. Ordinarily the bean would also implement special EJB specific callback methods that are not important to this FAQ entry. The ejbCreate( ) method is used only once in the life type of a bean identity when its first created. In this case we initialize the bean with the customer's id number and name. The lastActive value is set within the method. The ejbCreate( ) creates and returns the customer bean's identity, which is called a primary key in EJB. A primary key is a object that represents a unique identifier for a bean. In the case of the Customer bean the primary key is the CustomerKey which is an object that wrappers the customer's id. Primary keys can be as simple as a String value or more
be more complicated like a key that wraps several values that together represent a unique index to the bean identity. Below is the definition of the CustomerKey object.
public class CustomerKey implements java.io.Serializable { public long id; public CustomerKey(long l)
{
}
id = l; } public int hashCode( ) { return (int)id; } public boolean equals(Object otherKey){ if(otherKey instanceof CustomerKey) return ((CustomerKey)otherKey).id == this.id; else return false; }
You will notice that the business methods do not exactly match the persistent fields. This illustrates that the persistent state of the bean need not map exactly to the business methods, which provides more flexibility in how components are designed. For example, instead of having an accessor for lastName and firstName, the Customer bean uses a serializable PersonName to pass this information to and from the bean's client. In addition, you will have noticed that the lastActive can only be read by a bean client. The bean itself is responsible for updating this value. In addition to the business methods and the ejbCreate( ) methods there are a number of notification methods that the bean container (EJB server) uses to alert that bean that some significant event in its lifecycle is about to, or just has, occurred. Of particular importance are the two notification methods (ejbLoad( ) and ejbStore( )) used to alert the bean when its being synchronized with the database. The behavior of these methods changes depending on whether the bean is designed for BMP or CMP. This is investigated in more detail under the FAQ entries Java:API:EJB:EntityBean:BMP and Java:API:EJB:EntityBean:CMP. Comments and alternative answers
Thx Richard; also thx for your EJB book. Something... Author: Mark Lorenz (http://www.jguru.com/guru/viewbio.jsp?EID=118221), Aug 3, 2000 Thx Richard; also thx for your EJB book. Something that has bothered me all along about Session and Entity beans is that Entity beans are referred to as representing data. Rather, Entity beans should represent concepts in my business domain (e.g. TradingCommunity or TradingHub), with the database merely providing persistence for the business domain objects' state.
I could see Session beans being useful in the case of fat clients, but since our project is all thin web clients I'm not even sure when I'd use a Session bean. E.g., in our model a TradingHub "holds" TradingCommunities and can use findByXxx() methods on the TradingCommunityHome as needed (e.g. if not already instantiated or not kept in memory due to large #s of instances). So, why would I pull business functionality out of these classes (e.g. TradingHub.addCommunity() ) and put them into a Session bean? What have I gained besides another class to maintain (and, which is bad, separation of behavior from the class that should be responsible for it)? TIA, Mark Lorenz Mark Lorenz... Author: Chetan Gadgil (http://www.jguru.com/guru/viewbio.jsp?EID=435319), Jun 7, 2001 This has annoyed me also. Entities should not be used as just "struct"s. Actually putting the business logic in the entities solve many of management issues. The new "EJBLocal" interface will also help avoiding fine grained objects on the client side. This can still be achieved with the older spec by simply NOT returning fine grained Entity beans to the client. The main business entity "knows" how to hide contained entities when needed, anyway. Re: Thx Richard; also thx for your EJB book. Something... Author: Ed Page (http://www.jguru.com/guru/viewbio.jsp?EID=786586), Mar 7, 2002 Mark: I just read your book-OO SWD, A PG; I am a novice in your world and am sincerely trying to learn. It is unusually and immensely readable! I wonder if you could please compare/contrast for me your method with RUP, XP and the "agile" methods? What is a CMP bean? Location: http://www.jguru.com/faq/view.jsp?EID=1087 Created: Nov 16, 1999 Modified: 2000-04-11 11:39:36.811 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16)
CMP: Container-Managed Persistence A CMP bean is an entity bean whose state is synchronized with the database automatically. In other words, the bean developer doesn't need to write any explicit database calls into the bean code; the container will automatically synchronize the persistent fields with the database as dictated by the deployer at deployment time. When a CMP bean is deployed, the deployer uses the EJB tools provided by the vendor to map the persistent fields in the bean to the database. The persistence
fields will be a subset of the instance fields, called container-managed fields, as identified by the bean developer in the deployment descriptor. In the case of a relational database, for example, each persistent field will be associated with a column in a table. A bean may map all its fields to one table or, in the case of more sophisticated EJB servers, to several tables. CMP are not limited to relational database. CMP beans can be mapped to object databases, files, and other data stores including legacy systems. With CMP, the bean developer doesn't need to write any database access logic into the bean, but bean is notified by the container when its state is synchronized with the database. The container notifies the bean using the ejbLoad( ) and ejbStore( ) methods. The ejbLoad( ) method alerts the bean that its container-managed fields have just been populated with data from the database. This gives the bean an opportunity to do any post processing before the data can be used by the business methods. The ejbStore( ) method alerts the bean that its data is about to be written to the database. This give the bean an opportunity to do any pre-processing to the fields before they are written to the database. The below bean code demonstrates how these method might be employed on a Customer CMP entity bean.
public class CustomerBean implements javax.ejb.EntityBean { // container-managed fields public long customerNumber; public String lastName; public String firstName; // not a container-managed field public PersonName name = null; // business methods public PersonName getName( ){ return name; } public void setName(PersonName name){ name = name; } // called just after container-managed fields are updated from
database
public void ejbLoad( ){ name = PersonName(firstName, lastName); } // called just before container-managed fields are written to database
... }
public void ejbStore( ){ lastName = name.getLastName( ); firstName = name.getFirstName( ); }
In the case of the Customer bean the ejbLoad( ) and ejbStore( ) are used to wrapper the name fields (lastName and firstName) in a PersonName object which is more user friendly for the bean client. The ejbLoad( ) method wrappers the fields so that the getName( ) method access an up-to-date copy of the name data. The ejbStore( ) method unwraps the name data and places them back into the container-managed fields so that the database is updated with the most recent changes. The ejbLoad( ) and ejbStore( ) methods are typically called just before a transaction begins and when a transaction is about to commit. This ensures that the container-managed fields are synchronized with the database when the bean is in use. Some EJB servers will optimize the container so that data is not written to the database unless its dirty; that container-managed fields have been changed. CMP is the most difficult EJB feature for vendors to support. It requires very sophisticated tools for mapping bean fields to a data source and generating the underlying stubs and skeletons to support this mapping. CMP, however, provide a unique opporutnity for organizations developing distributed object systems. With CMP, a shrink-wrapped bean ( a bean developed by a third party) can be deployed and mapped into an organization's existing database. Obviously, this is an idyllic scenario, but not unreasonable. CMP entity beans exemplify the spirit of component technology; the reuse of components across projects, organizations, and industries. Note: CMP beans use the ejbLoad( ) and ejbStore( ) callback methods differently than the BeanManaged Persistence (BMP) beans. See Java:API:EJB:EntityBean:BMP for details on how BMP beans use these methods. What is a BMP bean? Location: http://www.jguru.com/faq/view.jsp?EID=1090 Created: Nov 16, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16)
BMP: Bean-Managed Persistence A BMP bean is an entity bean that synchronizes its state with the database manually. In other words, the bean developer must code explicit database calls into the bean itself. BMP provides the bean developer with more flexibility in the how the bean reads and writes its data than a container-managed persistence (CMP) bean. CMP bean is limited to the mapping facilities provided by the EJB vendor, BMP beans are only limited by skill of the bean developer. The ability to code an entity bean's persistence logic explicitly is important when the EJB container's CMP features are insufficient to meet the needs of the entity bean. Entity beans that need to synchronize their state with several data sources are excellent candidates for BMP. So are beans that need to access to data sources (possibly legacy systems) that are not supported by CMP. In addition, BMP bean are often employed when a vendors CMP facilities are not sophisticated enough to handle complex Object-to-Relational mapping. The BMP bean manages its own persistence, but relies on the container to coordinate its reads and writes so that persistence is accomplished in a transactional safe
manner. Coordination with the container is accomplished through two mechanisms: The persistence callback methods (ejbLoad( ) and ejbStore( )); and the Environment Naming Context (EJB). The ejbLoad( ) and ejbStore( ) methods notify a bean that its time to read and write data to the database respectively. In a BMP entity bean the code for reading and writing data to the database is done within these methods. The ejbLoad( ) is called at the beginning of a transaction, just before any business methods are executed, and the ejbStore( ) is called at the end of a transaction just before its committed. This keeps the bean state in perfect synchronization with transactions being executed, without the bean developer having to explicitly manage the transactional operations. When JDBC is used to for persistence, the Environment Naming Context (ENC) is a JNDI namespace that provides the bean with access to database connections (among other things). The database connections obtained from the JNDI ENC are managed by the container, so that they are automatically enrolled in transactions and pooled. (The extent to which this is supported depends largely on the EJB vendor.) The container may also manage other data source APIs, but JDBC is standard. Below is an example of an entity bean, the Customer bean that is designed to use BMP to synchronize its own state with a CUSTOMER table in the database.
public class CustomerBean implements javax.ejb.EntityBean { // persistent bean-managed fields public long customerNumber; public String lastName; public String firstName; // non-persistent context fields public javax.naming.Context jndiContext; public javax.ejb.EntityContext ejbContext; // business methods public PersonName getName( ){ return new PersonName(firstName, lastName); } public void setName(PersonName name){ firstName = name.getFirstName( ); lastName = name.getLastName( ); } // called just before a business method can be invoked at the beginning of a transaction public void ejbLoad( ){ try{ javax.sql.DataSource ds = (DataSource)jndiContext.lookup("java:comp/env/jdbc/Database"); java.sql.Connection con = ds.getConneciton( ); PreparedStatement ps = con.prepareStatement("select lastname, firstname from CUSTOMER where id = ?");
CustomerKey key = (CustomerKey)ejbContext.getPrimaryKey(
);
customerNumber = key.id; ps.setLong(1, customerNumber); java.sql.ResultSet result = ps.executeQuery( ); while(result.next()){ lastName = result.getString("lastname"); firstName = result.getString("firstname"); } con.close(); }catch(Exception e){ throw new EJBException(e); } } // called at the end of a transaction just before a commit is
attempted
public void ejbStore( ){ try{ javax.sql.DataSource ds = (DataSource)jndiContext.lookup("java:comp/env/jdbc/Database"); java.sql.Connection con = ds.getConneciton( ); PreparedStatement ps = con.prepareStatement("update CUSTOMER set lastname = ?, firstname = ? where id = ?"); ps.setString(1, lastName); ps.setString(2, firstName); ps.setLong(3, customerNumber); if( ps.executeUpdate( ) != 1) throw new EJBException("SQL update failed. ejbStore( ) failed"); con.close(); }catch(Exception e){ throw new EJBException(e); }
}
... } Note: BMP beans use the ejbLoad( ) and ejbStore( ) callback methods differently than the Container-Managed Persistence (CMP) beans. See Java:API:EJB:EntityBean:CMP for details on how CMP beans use these methods. Comments and alternative answers
I think this example works perfectly with J2EE server... Author: Vallur Narasimhan (http://www.jguru.com/guru/viewbio.jsp?EID=50672), May 17, 2000 I think this example works perfectly with J2EE server but mostly people use only weblogic so please feel kind to attach source code that works with weblogic server from GI Solutions India Narasimhan.V.Vallur
Re: I think this example works perfectly with J2EE server... Author: srini phani (http://www.jguru.com/guru/viewbio.jsp?EID=541467), Nov 7, 2001 I developed a statelesssession bean and successfuly deployed it to the server.Counterfit I wrote the client code from which i am accessing the home and remote interface. It throws me an error in the JNDI context the error is as follows : javax.ejb.EJBException - with nested exception: [javax.naming.NameNotFoundException: Unable to resolve comp/env/jdbc/ds Resolved: 'comp/env' Unresolved:'j dbc' ; remaining name 'ds'] what is that we have to give in the (java:comp/env/ ? / ?) !!!!!!!!!! I have mentioned ds since it is the same name i have mentioned for the sql connection pool in the weblogic server. Can you help me out. thanks Srini Does anybody have the Deployment Descriptor for this... Author: IQbal Khan (http://www.jguru.com/guru/viewbio.jsp?EID=283544), Jan 2, 2001 Does anybody have the Deployment Descriptor for this bean? I am particularly interested in the JDBC resource settings. Are Enterprise JavaBeans and JavaBeans the same thing? Location: http://www.jguru.com/faq/view.jsp?EID=1109 Created: Nov 17, 1999 Modified: 2000-04-26 23:45:08.617 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Enterprise JavaBeans and JavaBeans are not the same thing; nor is one an extension of the other. They are both component models, based on Java, and created by Sun Microsystems, but their purpose and packages (base types and interfaces) are completely different. JavaBeans The original JavaBeans specification is based on the java.beans package which is a standard package in the JDK. Components built on the JavaBeans specification are intraprocess components that live in one address space and are typically used for Graphical User Interface (GUI) as visual widgets like buttons, tables, HTML viewers, etc. Enterprise JavaBeans The EJB specification is based on the javax.ejb package, which is a standard extension package. Components built on the EJB specification are interprocess components that live in multiple address spaces as distributed object. These components are used as transactional business objects that are accessed as remote objects. Comments and alternative answers
I think the following paragraph illustrates better... Author: Ramu Meda (http://www.jguru.com/guru/viewbio.jsp?EID=280486), Dec 18,
2000 I think the following paragraph illustrates better the difference: JavaBeans components are small-grained application bits. You can use JavaBeans to assemble larger-grained components or to build entire applications. JavaBeans, however, are development components and are not deployable components. You typically do not deploy a JavaBean because a JavaBean is not a complete application; rather, JavaBeans help you construct larger software that is deployable. And because they cannot be deployed, JavaBeans do not need a runtime environment in which to live. JavaBeans do not need a container to instantiate them, to destroy them, and to provide other services to them because the application itself is made up of JavaBeans. By way of comparison, the Enterprise JavaBeans (EJB) standard defines a component architecture for deployable components called enterprise beans. Enterprise beans are larger, coarser-grained application components that are ready to be deployed. They can be deployed as is, or they can be assembled with other components into larger application systems. Deployable components must be deployed in a container that provides runtime services to the components, such as services to instantiate components as needed. I disagrre Author: Iain Kerr (http://www.jguru.com/guru/viewbio.jsp?EID=981384), Nov 27, 2002 I think the former paragraph illustrates better. The key piece of understanding is that a JavaBean runs in its own address spaces. I think its vital that this is understood to fully understand JavaBeans. Re: I disagrre Author: capsvikas sharma (http://www.jguru.com/guru/viewbio.jsp?EID=1110954), Aug 26, 2003 well guys its a comparision between Client side javabeans and EJB. Can we compare server side javabeans with EJB thanks Vikas coarser-grained Author: praveen chandra (http://www.jguru.com/guru/viewbio.jsp?EID=1237281), Apr 8, 2005 Hi, Can you please exaplain what is coarser-grained and fine grained in detail with examples? Thanks, Chandra
What is passivation and activation? Location: http://www.jguru.com/faq/view.jsp?EID=1195 Created: Nov 22, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Passivation and activation are two phases of a resource management technique that reduces the number of bean instances needed to service all clients. Passivation is the process of disassociating a bean instance from its EJB object so that the instance can be reused or evicted to conserve memory. Activation is the process of associating a bean instance with an EJB object so that it can service a request. Beans are passivated when there is a lull in their use and activated when the EJB object receives a client request. The java.ejb.SessionBean and javax.ejb.EntityBean interface include two callback methods that notify a bean instance when it is about to passivated or activated. The ejbPassivate( ) method notifies a bean that it is about to passivated; the ejbActivate( ) method notifies a bean that it is about to activated. The mechanisms employed in passivation and activation change depending on the bean type. Stateful beans are usually evicted, while entity beans and stateless beans are pooled. A more detailed account of how different bean types passivated and activated is found under the FAQs for that type. Comments and alternative answers
A little correction. java.ejb.SessionBean appered... Author: Ning Wu (http://www.jguru.com/guru/viewbio.jsp?EID=251003), Nov 13, 2000 A little correction. java.ejb.SessionBean appered in the article should be javax.ejb.SessionBean SLSB and passivation. Author: Sanjeev Dhiman (http://www.jguru.com/guru/viewbio.jsp?EID=1089967), May 31, 2004 Stateless Session beans are never passivated :) How does passivation work in stateful session beans? Location: http://www.jguru.com/faq/view.jsp?EID=1196 Created: Nov 22, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Unlike entity beans and stateless session beans, stateful session bean are usually evicted from memory when they are passivated. This is not true of all vendors but this view serves as good model for understanding the concepts of passivation in session beans. When a stateful bean experiences a lull in use -- between client invocations and transactions -- the container may choose to passivate the stateful bean instance. To conserve resources the bean instance is evicted from memory (dereferenced and
garbage collected). When the EJB object receives a new client request, a new stateful instance is instantiated and associate with the EJB object to handle the request. Stateful beans maintain a conversational state, which must be preserved before the bean instance is evicted from memory. To accomplish this, the container will write the conversational state of the bean instance to a secondary storage (usually disk). Only the non-transient serializable instance fields are preserved. When the bean is activated the new instance is populated with the preserved state. References to live resources like the EJBContext, DataSource, JNDI ENC, and other beans must also be maintained somehow -- usually in memory -- by the container. The javax.ejb.SessionBean interface provides two callback methods that notify the bean instance it is about to passivated or was just activated. The ejbPassivate( ) method notifies the bean instance that it is about have its conversational state written to disk and be evicted from memory. Within this method the bean developer can perform operations just prior to passivation like closing open resources. The ejbActivate( ) method is executed just after a new bean instance has been instantiated and populated with conversational state from disk. The bean developer can use the ejbActivate( ) method to perform operations just prior to servicing client request, like opening resources. Comments and alternative answers
excellent description.. Author: puru naktode (http://www.jguru.com/guru/viewbio.jsp?EID=36717), Apr 18, 2000 excellent description.. It is even more complicated Author: Kirill Fakhroutdinov (http://www.jguru.com/guru/viewbio.jsp?EID=501201), May 7, 2002 The non-serializable issue for me is that according to EJB 1.0 and 1.1 specifications "Declaring the enterprise Bean’s fields as “transient” is, in general, discouraged." So, if I do not want something to be passivated what should I do? Even worse, if I do have some fields that are not serializable by design (say, from security or performance reasons) - again, according to specifications "The container may destroy an instance if the instance is not serializable after ejbPassivate." Because serialization is checked dynamically we can have stateful instances just simply destroyed by container if some instance variables happened not to be serializable. So, for transient by design fields instead of declaring them transient, we have to assign them null in ejbPassivate() (to prevent EJB instance from being destroyed when attempting to serialize), and in ejbActivate() we need to recreate these transient fields ourselves.
EJB STATEFUL SESSION PASSIVATION Author: bhanu kiran (http://www.jguru.com/guru/viewbio.jsp?EID=1039587), Dec 19, 2002 Since the state is stored in Hard disk if system/server crashes can we maintain the state once it restored How does a client application create a transaction object? Location: http://www.jguru.com/faq/view.jsp?EID=2566 Created: Dec 14, 1999 Modified: 2000-08-03 22:25:31.928 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) How you gain access to UserTransaction objects varies depending on the type of client. Enterprise JavaBeans provides two types of transaction management: •
•
Container-managed transactions. As the name implies, the EJB container makes the decisions (based on the deployment descriptor's trans-attribute setting) regarding how to bundle operations into transactions and then works with the transaction manager, which manages the transaction processing. Bean-managed transactions. In this case, a session bean obtains the UserTransaction object via the EJBContext using the getUserTransaction() method.
JMS clients can bundle several messages in a transaction simply by using a transactional session--a UserTransaction object is not required. To create a transactional session, use either QueueConnection.createQueueSession() or TopicConnection.createTopicSession() with true as the first argument. (Some JMS implementations support JTA, so that it's also possible to obtain a UserTransaction object from the JMS server.) In other environments, for example, a web server that supports servlets and/or JavaServer Pages (JSP), a JMS server, and others, you obtain a UserTransaction object via JNDI. Of course, for a servlet to obtain a UserTransaction object, there must be a JTS-capable server to deliver the object. Typically, the server provides the JNDI look-up name either directly or via a system or server property. For example, with the WebLogic server, you would use a code segment similar to the following: ... Context c = new InitialContext(); UserTransaction ut = (UserTransaction) c.lookup("javax.jts.UserTransaction"); ut.begin(); // perform multiple operations... ut.commit() ... With J2EE implementations, you obtain the UserTransaction object with a code segment similar to the following:
... Context c = new InitialContext(); UserTransaction ut = (UserTransaction) c.lookup("java:comp/UserTransaction"); ut.begin(); // perform multiple operations... ut.commit() ... If the environment provides the UserTransaction object via a system property, you would use a code segment similar to the following: ... String transName = System.getProperty("jta.UserTransaction"); Context c = new InitialContext(); UserTransaction ut = (UserTransaction) c.lookup(transName); ut.begin(); // perform multiple operations... ut.commit() ... JNDI remote look-up names and property names vary, of course, across servers/environment. Comments and alternative answers
WebLogic does it differently Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Feb 14, 2003 In WebLogic 6.1, the JNDI name of the UserTransaction is either javax.transaction.UserTransaction or weblogic.transaction.UserTransaction I have found that the standard (?) JNDI name "java:comp.UserTransaction" or "java:comp/UserTransaction" does not always work. WebSphere 5.0 Author: Christoph Ernst (http://www.jguru.com/guru/viewbio.jsp?EID=1106402), Aug 6, 2003 In WebSphere 5.0 the JNDI-Lookup works like UserTransaction ut = (UserTransaction) ctx.lookup("jta/usertransaction");
See e.g. http://www3.ibm.com/software/webservers/appserv/doc/v30/ae/web/doc/ent_beans/atswpgec.htm Re: WebSphere 5.0 Author: Ralf Taugerbeck (http://www.jguru.com/guru/viewbio.jsp?EID=1119711), Oct 6, 2003
The link above is a bit outdated (from WAS 3.0 documentation). Check the current Infocenter for detai support in WAS 5.0:
http://publib.boulder.ibm.com/infocenter/wasinfo/index.jsp?topic=/com.ibm.websphere.base.doc/info/a The lookup "jta/usertransaction" is still supported for J2EE apps with a spec level of 1.2 or lower. But 1.3 or later "java:comp/UserTransaction" is demanded.
Re[2]: WebSphere 5.0 Author: William Koscho (http://www.jguru.com/guru/viewbio.jsp?EID=1148721), Feb 24, 2004 I am familiar with looking up the JNDI reference, but I am having trouble defining the UserTransaction in Websphere. Can someone help me to set it up? How do I create a javax.transaction.UserTransaction object and map it to "java:comp/UserTransaction"? I am using WSAD 5.1 - any help is appreciated. Thanks, Bill Re[3]: WebSphere 5.0 Author: Donato Marrazzo (http://www.jguru.com/guru/viewbio.jsp?EID=1179813), Jun 18, 2004 You don't need set up nothing. java:comp/UserTransaction is implicitly defined, just use it! From J2EE 1.3 specs: "The J2EE platform must provide an object implementing the javax.transaction.UserTransaction interface to all web components. The platform must publish the UserTransaction object in the Java™ Naming and Directory Interface (JNDI) name space available to web components under the name java:comp/UserTransaction."
Re[4]: WebSphere 5.0 Author: himanshu Sharma (http://www.jguru.com/guru/viewbio.jsp?EID=1241678), Apr 29, 2005 We have a set of interface programs that use Open Adaptor framework for interfacing with external apps using MQ Series, JMS & Databases . The interface programs run in seperate JVMs and most of the time access at least two resources such as MQ and Database tables. Therefore it is neccesary to provide a two phase commit to preserve transacttion integrity across interface boundaries. In order to meet this requirement we need to understand how we can use WAS 5.1.1 (JTS impl) for XA compliant Datasources and JMS queues. I also feel that accessing WAS (Transaction Manager or UserTransaction object advertised over JNDI) is prohibited for client applications (seperate JVMs) other than the web apps.
using java:comp/UserTransaction Author: Radhakrishnan Nariangadu (http://www.jguru.com/guru/viewbio.jsp?EID=752623), Aug 4, 2005 Can I use the J2EE JNDI lookup even within a EJB container? I'm developing a Hibernate based DB component that will provide a uniform transactional interface anywhere,ie, J2EE container or normal JVM. Therefore within a Bean managed Session bean, rather than obtaining UserTransaction from the EJBContext will everything work smoothly if I obtain the UserTransaction using the JNDI lookup? I'm planning to switch to a non-managed configuration based on whether I can create an InitialContext. This will allow the same code to be unit tested in eclipse without having to run it within a App server. ...thanks in advance
Do JTS implementations support nested transactions? Location: http://www.jguru.com/faq/view.jsp?EID=2569 Created: Dec 14, 1999 Modified: 2000-08-03 22:05:39.612 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) A JTS transaction manager must support flat transactions; support of nested transactions is optional. If a client begins a transaction, and within that transaction begins another transaction, the latter operation will throw a NotSupportedException if the JTS implementation does not support nested transactions. Keep in mind that even if the JTS implementation supports nested transactions, this transaction manager-level support does not guarantee support for nested transactions in an application. For example, the EJB 1.1 specification does not support nested transactions. Why would a client application use JTA transactions? Location: http://www.jguru.com/faq/view.jsp?EID=2576 Created: Dec 14, 1999 Modified: 2000-08-03 22:03:56.209 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) One possible example would be a scenario in which a client needs to employ two (or more) session beans, where each session bean is deployed on a different EJB server and each bean performs operations against external resources (for example, a database) and/or is managing one or more entity beans. In this scenario, the client's logic could required an all-or-nothing guarantee for the operations performed by the session beans; hence, the session bean usage could be bundled together with a JTA UserTransaction object.
In the previous scenario, however, the client application developer should address the question of whether or not it would be better to encapsulate these operations in yet another session bean, and allow the session bean to handle the transactions via the EJB container. In general, lightweight clients are easier to maintain than heavyweight clients. Also, EJB environments are ideally suited for transaction management. Comments and alternative answers
Why would a client application use JTA transactions? Author: Mayank Jain (http://www.jguru.com/guru/viewbio.jsp?EID=791863), Mar 12, 2002 Do you think this would be a good approach? The client can have a Facade Session Bean in which the server could handle all the Transactions. How does a session bean obtain a JTA UserTransaction object? Location: http://www.jguru.com/faq/view.jsp?EID=2577 Created: Dec 14, 1999 Modified: 2000-08-03 22:19:19.481 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) If it's necessary to engage in explicit transaction management, a session bean can be designed for bean-managed transactions and obtain a UserTransaction object via the EJBContext using the getUserTransaction() method. (It may also use JNDI directly, but it's simpler to use this convenience method.) Comments and alternative answers
Do you mean "use JNDI" or "use JTA&... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Aug 3, 2000 Do you mean "use JNDI" or "use JTA"? How would you do it with JNDI? Why would a session bean use bean-managed transactions? Location: http://www.jguru.com/faq/view.jsp?EID=2578 Created: Dec 14, 1999 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) In some situations, it's necessary for a (stateful) session bean to selectively control which methods participate in transactions, and then take over the bundling of operations that form a logical unit of work. Comments and alternative answers
Good explanation Author: Santosh Malpekar (http://www.jguru.com/guru/viewbio.jsp?EID=30121), Mar 30, 2000 Good explanation
Comments Author: Suresh S (http://www.jguru.com/guru/viewbio.jsp?EID=320716), Apr 10, 2001 If some scenarios would have given, it would be better to understand. Thanks How does an enterprise bean that uses container-managed transactions obtain a JTA UserTransaction object? Location: http://www.jguru.com/faq/view.jsp?EID=2579 Created: Dec 14, 1999 Modified: 2000-08-03 21:49:20.023 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) It doesn't! By definition, container-managed transaction processing implies that the EJB container is responsible for transaction processing. The session bean has only limited control of transaction handling via the transaction attribute. Is it possible for a stateless session bean to employ a JTA UserTransaction object? Location: http://www.jguru.com/faq/view.jsp?EID=2580 Created: Dec 14, 1999 Modified: 2000-08-03 22:06:23.29 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) Yes, but with restrictions. By definition, a stateless session bean has no state; hence, each method invocation must be independent. (The bean can be "swapped out" between method invocations.) Thus, a stateless session bean can obtain a UserTransaction object via the EJBContext using the getUserTransaction() method, but it must start and finish each transaction within the scope of a method invocation. How do you configure a session bean for bean-managed transactions? Location: http://www.jguru.com/faq/view.jsp?EID=2581 Created: Dec 14, 1999 Modified: 2000-08-24 18:54:58.201 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) You must set transaction-type in the deployment descriptor. Comments and alternative answers
What do you set transaction-type to? Author: Vikas Gholba (http://www.jguru.com/guru/viewbio.jsp?EID=126575), Aug 14, 2000 What do you set transaction-type to? Re: What do you set transaction-type to? Author: Sukanya Subramanian (http://www.jguru.com/guru/viewbio.jsp?EID=382541), Mar 21, 2001 Bean Bean Managed
Author: Rajeev Sharma (http://www.jguru.com/guru/viewbio.jsp?EID=334960), Feb 23, 2001 Bean Managed How do you configure the transaction characteristics for a session bean with container-managed transactions? Location: http://www.jguru.com/faq/view.jsp?EID=2582 Created: Dec 14, 1999 Modified: 2000-08-24 18:55:27.106 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) You must set trans-attribute in the deployment descriptor. Comments and alternative answers
Set it to what? Can we have some sample code for the... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Aug 3, 2000 Set it to what? Can we have some sample code for the DD? Re: Set it to what? Can we have some sample code for the... Author: Damodara Rao (http://www.jguru.com/guru/viewbio.jsp?EID=428922), May 26, 2001 Within one transaction one row has to be inserted in oracle database throuh CMP EntityBean and the visibility of that row has to be made for inserting some other row in some other table because of constraints.How to make it visible within the transaction? Re[2]: Set it to what? Can we have some sample code for the... Author: selva raju (http://www.jguru.com/guru/viewbio.jsp?EID=594229), Dec 23, 2001 I am not how you have the Entity Bean Design for that.But I think the following will be the Solution for you. Create one Method in Session Bean with the transaction Attribute as "Required" and call the Both the Entity Beans from that method.Here I have assumed that you two different entity beans to represent the two different tables.And specity the transaction attribute for the create method of the Entity Beans as "Supports" or "Required". How does an entity bean obtain a JTA UserTransaction object? Location: http://www.jguru.com/faq/view.jsp?EID=2583 Created: Dec 14, 1999 Modified: 2000-08-03 21:59:28.181 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) It doesn't. Entity beans do not employ JTA transactions; that is, entity beans always employ declarative, container-managed transaction demarcation. Entity beans, by definition, are somewhat tightly coupled (via the EJB container and server) to a datastore; hence, the EJB container is in the best position to manage transaction processing.
Comments and alternative answers
The entity bean is not tightly coupled to the unde... Author: gaurav sharma (http://www.jguru.com/guru/viewbio.jsp?EID=210078), Sep 19, 2000 The entity bean is not tightly coupled to the underlying persistence framework. In fact the components are loosely coupled and are tightly cohesive with the interface. The container transaction API's enable the binding of components to the data interface layer transparently to the implementation of the component. Is it necessary for an entity bean to protect itself against concurrent access from multiple transactions? Location: http://www.jguru.com/faq/view.jsp?EID=2584 Created: Dec 14, 1999 Modified: 2000-08-03 22:26:36.274 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9) No. One of the motivations for using a distributed component architecture such as Enterprise JavaBeans is to free the business logic programmer from the burdens that arise in multiprogramming scenarios. Comments and alternative answers
The answer to this question is really misleading in... Author: dan benanav (http://www.jguru.com/guru/viewbio.jsp?EID=8173), Jan 25, 2000 The answer to this question is really misleading in my opinion. It is true that calls to the bean instance's methods are serialized, however calls to the entity object are not. That means from the client's perspective calls to the methods can occur concurrently. The bean provider also has to be aware of and code for that. For example, suppose you have a bean that has a qty field and a method called updateQuantity. Then you could define updateQuantity in the bean class as public void updateQty(int q){ qty -=q; } However this could lead to incorrect behavior because the container is free to create several instances of the bean to process method requests. Calls to these methods (on two different beans) can occur concurrently and that is the problem. So for example each instance gets the qty from the database and could start out with the same qty. When the qty is decreased in each of two calls
in two transactions each bean would decrease it's qty and store it back to the database. Here is a better picture, Transaction 1 calls updateQty. Container uses bean1 to process request. Transaction 2 calls updateQty on the same entity object. Container uses bean2 to process request. Container calls ejbLoad on bean1 which gets qty from a database. Value is 1. Container calls ejbLoad on bean2 which gets qty from a database. Value is 1. Container calls bean1 updateQty. qty field in bean1 becomes 0. Container calls bean2 updateQty. qty field in bean2 becomes 0. Container calls ejbStore on bean1 which stores 0 into the database. Container calls ejbStore on bean2 which stores 0 into the database. This of course is the wrong answer. I should store -1 into the db. There is a common misconception that since the container serializes calls to the bean instance that calls to the bean object are serialized. Hence the programmer must either serialize calls to the object or must use features of the database to handle the above situation. Serializing calls to the entity and session objects does not happen automatically. For session objects the container will throw an exception if the calls happen concurrently. Even many companies that develop ejb servers hold these misconceptions. Re: The answer to this question is really misleading in... Author: Mayank Jain (http://www.jguru.com/guru/viewbio.jsp?EID=791863), Mar 12, 2002 hi dan, If your answer is with respect to EJB 1.0 or EJB 1.1 specifications then you may be right... But as far as I know according to EJB 2.0 specifications... the client may or may not serialize his calls to an entity bean.... it is the container's responsibility to serialize the transactions (in case of Commit option A) or allow shared access to instances(in case of Commit Option B or Commit Option C). With respect to the comment given by dan henany -- The... Author: Vallur Narasimhan (http://www.jguru.com/guru/viewbio.jsp?EID=50672), May 17, 2000 With respect to the comment given by dan henany -The instance methods of the beans are serialized with respect to transactions but not individually with respect to methods. So just declarative knowledge is enough. Is an EJB, JMS, or general-purpose Java application server a transaction manager? Location: http://www.jguru.com/faq/view.jsp?EID=2586 Created: Dec 14, 1999 Modified: 2000-08-03 22:04:29.484 Author: Jerry Smith (http://www.jguru.com/guru/viewbio.jsp?EID=9)
It depends on the server implementation. The JTA and JTS specifications define client-, application-, and transaction manager-level operations. There is nothing to prevent a Java application server from implementing, JMS, EJB, and JTS functionality. On the other hand, it could (if available) obtain transaction manager services indirectly from another server. How do beans manage resource connections to back-end services other than databases ? Location: http://www.jguru.com/faq/view.jsp?EID=2990 Created: Dec 20, 1999 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) While EJB 1.1 provides the JNDI ENC for managing standard resources like URL, JDBC, JavaMail and JMS, connections to other types of resources are not addressed by EJB 1.0 or EJB 1.1, but there are solutions. Below is a list of some strategies that can provide access to "back-ends" besides relational databases. Leveraging the instance fields: Each EJB vendor implements resource management differently. In EJB servers where the instance is pooled and reused it may be possible to allow a back-end resource connection to be maintained through passivation. The back-end connection might wrapped in a CORBA or Java RMI object, accessed by a raw network socket, or some other connection facility. This strategy works in stateless session beans and entity beans in EJB servers that pool and reuse these bean types. In stateless beans you can simply reference the resources using the instance fields -- stateless beans are not passivated in EJB. In entity beans you can also reference the connections using instance fields but the field used must not be declared as a container-managed field in the deployment descriptor. In both stateless and entity beans there are methods can be used safely to open and close resource connections at the beginning and end of the beans life. In stateless session beans long-lived resources should be opened in the setSessionContext( ) method and closed in the ejbRemove( ) method. These methods are invoked at the beginning and end of a stateless session instance's life; when it's first instantiated and before its evicted form the container. In entity beans long-lived resource should be opened in the setEntityContext( ) method and closed in the unsetEntityContext( ) method. These methods are invoked at the beginning and end of an entity instance's life; when it's first instantiated and before its evicted form the container. CORBA or Java RMI Services: CORBA objects or Java RMI objects can be created that wrapper usual resources and expose them to the bean. These types of remote references will need to be handled with care as they can be affected by passivation, but the remote objects themselves are not part an EJB container and therefor are not passivated.
In stateful session beans the references will need to be released and re-constituted when the bean is activated using some kind of naming facility native to the reference type. With stateless and entity beans the above strategy, Leveraging the instance fields works well with this strategy. JNDI references: It may be possible to access a JNDI service directly from the bean and to attach live resources to the JNDI service. This depends on the JNDI service provider and your EJB vendor. Wait for EJB 2.0: The next version of EJB, which may be branded EJB 2.0, is supposed to include a Connection specification that details how connections to non-standard resources can be make available to beans at run time. If this is done correctly it will solve this problem, but who knows when or if it will be incorporated into the specification. Don't hold your breath. How can I access my EJBs from COM environments such as VB? Location: http://www.jguru.com/faq/view.jsp?EID=4551 Created: Jan 11, 2000 Modified: 2001-01-29 17:04:31.597 Author: Damian Mehers (http://www.jguru.com/guru/viewbio.jsp?EID=4550) Note: This question was answered by the vendor. [One possible solution is J-Integra] The J-Integra pure Java-COM bridge can be used to access EJBs running in any Application Server, in any JVM on any machine from COM clients such as Visual Basic or Microsoft Transaction Server. See the Step-by-Step EJB example at: http://www.linar.com/jintegra/doc/ Please also see the following FAQ for more products. Comments and alternative answers
this is also a good idea but i want to know how you... Author: Shoubhik Chakraborty (http://www.jguru.com/guru/viewbio.jsp?EID=47506), May 10, 2000 this is also a good idea but i want to know how you can access simple java .class files , its thru wrapper idl classes frm VC but for that u need 'javatlb' tool of java , where to find it plz. mail me to
[email protected] Re: this is also a good idea but i want to know how you... Author: sridhar yeragorla (http://www.jguru.com/guru/viewbio.jsp?EID=507726), Oct 1, 2001 Hi chkraborty, now javatlb is outdated. we got a separate integration toll jactivex. you can enter the name jactivex in msdn search and get the step by step procedure.
Re[2]: this is also a good idea but i want to know how you... Author: Sarit Seal (http://www.jguru.com/guru/viewbio.jsp?EID=1005041), Sep 27, 2002 You can have a Com Client a C++ program and then connect to java class using JNI. What are the constraints or drawbacks of container managed EJB's ? Location: http://www.jguru.com/faq/view.jsp?EID=5072 Created: Jan 15, 2000 Modified: 2000-01-16 06:05:55.869 Author: Sameer Tyagi (http://www.jguru.com/guru/viewbio.jsp?EID=4381) CMP in beans depends a lot on the EJB vendor implementation and utilities. With some implementations container-managed entity beans can only by mapped to one table, while other implemenations offer Multiple table mappings to a single bean. The bottom line,It depends on the container provider being used. Comments and alternative answers
Container Managed EJB's Author: Nick Knight (http://www.jguru.com/guru/viewbio.jsp?EID=464493), Jul 30, 2001 Many implementations do not handle querying very well when a large result set is expected. Using CM beans causes a large number of bean instances to be created. Instead, session beans should be used with the use of a JDBC driver and a vector to store the results. What are the constraints or drawbacks of container managed EJB's ? Author: Rajeev Hans (http://www.jguru.com/guru/viewbio.jsp?EID=1180311), Jun 21, 2004 CMP can't be used if your back-end is not a relational database (e.g. any legacy ERP system ) atleast at the time of my writing this comment. Is entity data persisted at the end of a transaction or at any time? Location: http://www.jguru.com/faq/view.jsp?EID=5115 Created: Jan 16, 2000 Modified: 2000-08-03 22:08:10.663 Author: Sameer Tyagi (http://www.jguru.com/guru/viewbio.jsp?EID=4381) Depends on what you mean by "persisted". Data that is part of a transaction like database rows are persisted depending on the success of the transaction. If the transaction manager determines that the transaction was successful or there were no problems during any of the steps invoved in it, the data is committed, or otherwise rolled back. The container, on the other hand, invokes certain state transition lifecycle methods to conserve resources. This involves passivation and activation of the bean or instance swapping. This happens independent of the transaction since the client never interacts directly with the bean instance but with the server's implementation of the EJBObject.
Comments and alternative answers
So I think the answer is: The data is written to... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Aug 3, 2000 So I think the answer is: The data is written to the database after every change (which means potentially after every method call), but in a state determined by the transaction level. Later, when the transaction is complete, the data may be committed or rolled back.
How can my JSP page communicate with an EJB Session Bean? Location: http://www.jguru.com/faq/view.jsp?EID=5314 Created: Jan 17, 2000 Modified: 2000-01-20 10:56:07.612 Author: Govind Seshadri (http://www.jguru.com/guru/viewbio.jsp?EID=14) The following is a code snippet that demonstrates how a JSP page can interact with an EJB session bean: <%@ page import="javax.naming.*, javax.rmi.PortableRemoteObject, foo.AccountHome, foo.Account" %> <%! //declare a "global" reference to an instance of the home interface of the session bean AccountHome accHome=null; public void jspInit() { //obtain an instance of the home interface InitialContext cntxt = new InitialContext( ); Object ref= cntxt.lookup("java:comp/env/ejb/AccountEJB"); accHome = (AccountHome)PortableRemoteObject.narrow(ref,AccountHome.class); } %> <% //instantiate the session bean Account acct = accHome.create(); //invoke the remote methods acct.doWhatever(...); // etc etc... %> Comments and alternative answers
It is a good practise to use as little Java code as... Author: Prasad Thammineni (http://www.jguru.com/guru/viewbio.jsp?EID=36479), Apr 15, 2000 It is a good practise to use as little Java code as possible in a JSP as possible. In the above example, the JSP page designer has to deal with and understand the mechanics of accessing an EJB. Instead encapsule the EJB mechanics in a Mediator and expose the EJB methods as methods of the Mediator. Use the Mediator in the JSP. The
Mediator is usually written by the EJB developer. The Mediator can provide additional value like attribute caching etc. Re: It is a good practise to use as little Java code as... Author: Chris Pearson (http://www.jguru.com/guru/viewbio.jsp?EID=1140678), Jan 23, 2004 Can a EJB initiate a call to the JSP first? There's also the ejbutils tag library available from... Author: Joseph Ottinger (http://www.jguru.com/guru/viewbio.jsp?EID=37791), Apr 19, 2000 There's also the ejbutils tag library available from Orion, which makes this very easy to do. I wonder if there are any EJB Vendors that create Beans... Author: Gautam Bajekal (http://www.jguru.com/guru/viewbio.jsp?EID=54828), May 23, 2000 I wonder if there are any EJB Vendors that create Beans for you whenever EJB's are deployed. The Beans would encapsulate the EJB Session bean creation and methods. That would be a neat feature to have. See also What is the most efficient approach for i... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), May 29, 2000 See also What is the most efficient approach for integrating EJB with JSP? Another way of communicating between a JSP and a S... Author: Nagaraj shyagale (http://www.jguru.com/guru/viewbio.jsp?EID=29160), Dec 1, 2000 Another way of communicating between a JSP and a Session Bean is through Servlets. That is, to follow the MVC architecture using the Model as EJB, Controller as a Servlet and the View as a JSP. this all is very exiting ...can you just give the ... Author: pinak vedalankar (http://www.jguru.com/guru/viewbio.jsp?EID=269419), Mar 15, 2001 this all is very exiting ...can you just give the example of the above case... any one ex ...in which jsp page calls java bean and which in turn called EJB What are all the different kinds of servers? (Such as Web Servers, Application Servers, etc) Location: http://www.jguru.com/faq/view.jsp?EID=5917 Created: Jan 20, 2000 Modified: 2000-12-20 10:06:49.031 Author: Paul Danckaert (http://www.jguru.com/guru/viewbio.jsp?EID=5801) The servers involved in handling and processing a user's request break down into a few basic types, each of which may have one or more tasks it solves. This flexibility
gives developers a great deal of power over how applications will be created and deployed, but also leads to confusion over what server is able to, or should, perform a specific task. Starting at the basic level, a user is typically submitting a request to a system through a web browser. (We are conveniently ignoring all other types of clients (RMI, CORBA, COM/DCOM, Custom, etc..) for the time being for purposes of clarity.) The web request must be received by a Web Server (otherwise known as an HTTP Server) of some sort. This web server must handle standard HTTP requests and responses, typically returning HTML to the calling user. Code that executes within the server environment may be CGI driven, Servlets, ASP, or some other server-side programming language, but the end result is that the web server will pass back HTML to the user. The web server may need to execute an application in response to the users request. It may be generating a list of news items, or handling a form submission to a guest book. If the server application is written as a Java Servlet, it will need a place to execute, and this place is typically called a Servlet Engine. Depending on the web server, this engine may be internal, external, or a completely different product. This engine is continually running, unlike a traditional CGI environment where a CGI script is started upon each request to the server. This persistance gives a servlet connection and thread pooling, as well as an easy way to maintain state between each HTTP request. JSP pages are usually tied in with the servlet engine, and would execute within the same space/application as the servlets. There are many products that handle the web serving and the servlet engine in different manners. Netscape/iPlanet Enterprise Server builds the servlet engine directly into the web server and runs within the same process space. Apache requires that a servlet engine run in an external process, and will communicate to the engine via TCP/IP sockets. Other servers, such as MS IIS don't officially support servlets, and require add-on products to add that capability. When you move on to Enterprise JavaBeans (and other J2EE components like JMS and CORBA) you move into the application server space. An Application Server is any server that supplies additional functionality related to enterprise computing -- for instance, load balancing, database access classes, transaction processing, messaging, and so on. EJB Application Servers provide an EJB container, which is the environment that beans will execute in, and this container will manage transactions, thread pools, and other issues as necessary. These application servers are usually stand-alone products, and developers would tie their servlets/JSP pages to the EJB components via remote object access APIs. Depending on the application server, programmers may use CORBA or RMI to talk to their beans, but the baseline standard is to use JNDI to locate and create EJB references as necessary. Now, one thing that confuses the issue is that many application server providers include some or all of these components in their product. If you look at WebLogic (http://www.beasys.com/) you will find that WebLogic contains a web server, servlet engine, JSP processor, JMS facility, as well as an EJB container. Theoretically a product like this could be used to handle all aspects of site development. In practice,
you would most likely use this type of product to manage/serve EJB instances, while dedicated web servers handle the specific HTTP requests. See also: What is the difference between an Application Server and a Web Server? Comments and alternative answers
The following link provides a list of all available... Author: Govind Seshadri (http://www.jguru.com/guru/viewbio.jsp?EID=14), Feb 3, 2000 The following link provides a list of all available web servers (HTTP servers). It also offers detailed information regarding the functionality offered by each of them. http://serverwatch.internet.com/webservers.html Here's a great comparison chart listing all the Java... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Apr 12, 2000 Here's a great comparison chart listing all the Java application servers: http://www.flashline.com/Components/appservermatrix.jsp There are three types of servlet engines: 1) StandAlone... Author: Shuchi Agarwal (http://www.jguru.com/guru/viewbio.jsp?EID=30635), May 2, 2000 There are three types of servlet engines: 1) StandAlone Servlet Engine: It is a web server that includes built in support for servlets.For eg Java Web Server etc. 2) Add on Servlet Engine:It functions as a plug-in for an existing server,a server that was not originally designed with servlets in mind.For eg JServ, JRun,IBM WebSphere etc. 3) Embeddable Servlet Engine:It is a lightweight server deployment platform that can be embeddable in another application. That application becomes the true server.For eg JavaServerEngine etc. what are all the different web servers that support... Author: krishna murthy (http://www.jguru.com/guru/viewbio.jsp?EID=274676), Dec 21, 2000 what are all the different web servers that support servlet 2.0 technology ? how to decide up on the which servlet enebled web server to use for developing a web based application ? Good Response Paul Danckaert ! Author: Jeevie S (http://www.jguru.com/guru/viewbio.jsp?EID=3836), Sep 5, 2001 I came across this response after a long time from it's post date, but it's very good. How do enterprise beans access native libraries? Location: http://www.jguru.com/faq/view.jsp?EID=8831 Created: Jan 25, 2000 Modified: 2000-01-26 05:15:13.433
Author: Tim Rohaly (http://www.jguru.com/guru/viewbio.jsp?EID=10) Question originally posed by telmo sa (http://www.jguru.com/guru/viewbio.jsp?EID=5055 In short, they don't. The EJB 1.1 Specification, section 18.1.2 (Programming Restrictions) lists some things that enterprise beans cannot do. In particular: •
The enterprise bean must not attempt to load a native library.
This function is reserved for the EJB Container. Allowing the enterprise bean to load native code would create a security hole. The EJB 1.1 specification is available for download from http://java.sun.com/products/ejb/docs.html. Comments and alternative answers
They cannot access JNI portably. Basically, given... Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4), May 3, 2000 They cannot access JNI portably. Basically, given comments recently made by Mark Hapner, it seems that the "must not" is not a hard constraint but rather a "must not do if you want the EJB to be portable." Certainly, IMHO, the security issue trumps the portability issue so it's a moot point. :-)
Of course, if you want to write unportable/unsecure... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), May 5, 2000 Of course, if you want to write unportable/unsecure EJBs, a good place to start is the jGuru JNI FAQ. Can I extend the discussion here a little? The security... Author: Mark Hagan (http://www.jguru.com/guru/viewbio.jsp?EID=103511), Jul 17, 2000 Can I extend the discussion here a little? The security issue confuses me a bit. What would be an example of a security breach? Also, not that it's relevant to security but, I was planning on having my EJB call out to other java classes which contained the static loading and native method calls. Any reason why this wouldn't work? Thanks. The reason why the EJB spec does not supports this... Author: harish ganesan (http://www.jguru.com/guru/viewbio.jsp?EID=347623), Mar
8, 2001 The reason why the EJB spec does not supports this interface to native libraries is that: 1.The EJB compoenents we develop should be in intention of true distribution 2.the application developers should not develop bean components that are not resuable and portable to different EJb containers because it ties u up to single ejb vendor I'm also somewhat confused by this restriction. For... Author: Richard Steele (http://www.jguru.com/guru/viewbio.jsp?EID=343953), Mar 13, 2001 I'm also somewhat confused by this restriction. For example, how would type 2 JDBC drivers work if the bean cannot load native libraries? I have to create an EJB for a system that's accessible through a C library. My initial reaction was to create a JNI implementation of the client interface, called by the EJB. But this means it won't be portable, though from the comments here it might still work. So, can it be done or not? Author: Ralph Cook (http://www.jguru.com/guru/viewbio.jsp?EID=3483), Apr 11, 2001 All the FAQs and specs and google searches just say that EJB's can't load native libraries (the container needs to do that) but they don't say much about using native functions. We want to put a servlet/EJB front on some legacy code. Realizing that it may not be the most "standard" or "portable", is it possible? Robustness is sacrificed as well Author: Doug Bell (http://www.jguru.com/guru/viewbio.jsp?EID=113602), Oct 6, 2001 I was faced with the issue of calling a native application from an EJB on a recent project. In the process of investigating various alternatives, we attempted using JNI (under WebLogic 5.1 running on Solaris 2.7). It worked, at least in that WebLogic allowed it to happen and the calls worked. However, in testing the robustness of the solution we had the native code perform a divide-by-zero. The resulting exception crashed WebLogic. So even if your particular application server allows the EJB to load and call a native library, and even if you don't care about portability or security (and I'm not sure I understand the security issue here), you better really trust your C code 'cause it's not just going to take down a single transaction. Also, an earlier response asked about having a non-EJB class do the loading of the native library. The EJB spec states that the restrictions on EJBs apply to all classes running in the EJB container. So it's all the same.
BTW, we solved our issue by modifying the native application to run as a persistent service and then communicated with it through a socket. If you do this, the native app has to be the socket listener as EJBs aren't allowed to listen to ports (for obvious reasons).
How do I implement a logging system in my beans? Location: http://www.jguru.com/faq/view.jsp?EID=8993 Created: Jan 26, 2000 Modified: 2000-05-29 11:46:07.715 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16)
Using
java.io
is prohibited
Using the java.io package from within a bean is prohibited. The EJB 1.1 Specification, section 18.1.2 (Programming Restrictions) states the following: An enterprise bean must not use the java.io package to attempt to access files and directories in the file system. The file system APIs are not well-suited for business components to access data. Business components should use a resource manager API, such as JDBC API, to store data. The EJB 1.1 specification is available for download from http://java.sun.com/products/ejb/docs.html
Alternative Solutions To perform logging operations you must you a resource connection supported by the EJB programming model. EJB servers may support several resource connection options, which can be used to log events as shown below: • • • •
JDBC (javax.sql.DataSource) : Write log events in to a relational database. URL (java.net.URL) : Write log events to a custom logging server or post them to a web server. JavaMail (javax.mail.Session) : E-mail log events to a special account JMS (javax.jms.QueueConnectionFactory | javax.jms.TopicConnectionFactory) : Send the log events as messages.
Comments and alternative answers
Some other common alternative solutions include si... Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362), Apr 10, 2000 Some other common alternative solutions include singleton RMI or CORBA servers.
All of these alternatives are potentially expensive... Author: John Huang (http://www.jguru.com/guru/viewbio.jsp?EID=231461), Oct 18, 2000 All of these alternatives are potentially expensive operations in terms of performance. I like to know what is the consequence if using java.io package. Is it scalibility issue, robusness issue or else? EJB 1.1 Specification does not tell you why. I can understand why it is not good to store business data in file system. My reading of the EJB spec is that it doesn't preclude... Author: Mark Wutka (http://www.jguru.com/guru/viewbio.jsp?EID=7136), Nov 20, 2000 My reading of the EJB spec is that it doesn't preclude using System.out to log messages. It doesn't ban java.io altogether, just the use of java.io to access files and directories in the file system. I think the reasoning behind the restriction is that there's an assumption that the file access storage/retrieval must be transactionable and the file system isn't. Writing the System.out isn't really the same as storing data, so you could argue that it doesn't violate the restriction. You could argue this one either way and I'd like to see Sun clarify it. I have noticed that several of Sun's example EJB's make use of System.out, though, which leads me to believe that it's legal. logging: consider using log4j Author: Geert Mergan (http://www.jguru.com/guru/viewbio.jsp?EID=382575), Mar 20, 2001 I suggest doing logging with log4j, a wonderful logging framework: • •
Logging to System.out is not forbidden by the ejb spec so at least for that log4j is usable. I will also log to files. I know this does violate the EJB spec, but certain parts of EJB spec can be broken without too many problems. And I can always switch off logging to files if it turns out to mess things up.
Log4j is Apache open source: www.log4j.org Re: logging: consider using log4j Author: Eibhlis Ni She (http://www.jguru.com/guru/viewbio.jsp?EID=920094), Jul 22, 2002 Hi there I am trying to extend our use of the log4j framework. I would like to use the NDC class to uniquely stamp each request but I am finding it difficult to find examples of implementations on the web. Do you have any suggestions? Cheers Eibhlis Re: logging: consider using log4j
Author: Jim Shain (http://www.jguru.com/guru/viewbio.jsp?EID=16877), Feb 24, 2003 The post is old so this question will be retorical. If certain parts of the EJB spec can be broken, then why do the authors use the words "must not" instead of "should not". This sounds a little like Bill Clinton, define "is". Maybe the authors should have referenced RFC 2119. In there it states: 2. MUST NOT This phrase, or the phrase "SHALL NOT", mean that the definition is an absolute prohibition of the specification.
Then maybe we could debate the term absolute. Speaking of absolute, I think I'll go have a drink. Re: My reading of the EJB spec is that it doesn't preclude... Author: Greg Duclos (http://www.jguru.com/guru/viewbio.jsp?EID=477365), Aug 15, 2001 I'm pretty sure I read somewhere that you can use java.io in an EJB because the EJB container might not have a filesystem, ie. if the container is a database. Re: My reading of the EJB spec is that it doesn't preclude... Author: ahmedyaser ahmedyaser (http://www.jguru.com/guru/viewbio.jsp?EID=897758), May 30, 2002 EJBs support non-transactional operations as well, so to me, file system being nontransactional can't be a reason. I think we need a concrete explanation for this. We have a scenario in which we need to read a database and generate files in a certain format, for interfacing with external systems. How is this possible in a pretty way without doing file I/O from EJBs?
Re[2]: My reading of the EJB spec is that it doesn't preclude... Author: michael lu (http://www.jguru.com/guru/viewbio.jsp?EID=923019), Jun 21, 2002 Basically what EJB wants to resolve is the transaction system. Typically that'll be OLTP system involving heavy database access. Because there's SQL standard for Relational database system, it's easy for EJB to standardize on that model. However, both semantics and implemenations of different file systems (UFS, JFS, NTFS, EXT2FS, whatever, even virtually there are no standard locking mechnism for them) tend to be quite different AND that really hurts one important goal of EJB - Portability. So if you base your application heavily on file system access, then EJB will be an overkill for it probably. However, I DO think it's only not recommended to do file manipulation in EJB while it's still legitimate to do some simple file operations. Otherwise, how can you dump debug info to System.out and System.err streams? But I'd like to say that relying on file access in EJB could become a very tricky programming practice. So even if you can do that, use
that at your own risk. Besides, JDK prior to 1.4 (even including 1.4) provides only limited file operating capability IMHO. Custom request context passed through from Client Author: Gordon Sim (http://www.jguru.com/guru/viewbio.jsp?EID=513657), Oct 8, 2001 On the subject of logging, is there a nice way to attach custom context info to a request on a bean, so that client side logs can be more easily related to server side logs? i.e. I want to have a sessionid in every log entry, but dont want to have to make this a parameter of every call. One option may be to use the caller principal, since I dont actually require the use of this for security. Log4j and other logging solutions Author: Sean Sullivan (http://www.jguru.com/guru/viewbio.jsp?EID=203382), Aug 4, 2002 http://jakarta.apache.org/log4j/ http://jakarta.apache.org/commons/logging/ java.util.logging http://java.sun.com/j2se/1.4/docs/guide/util/logging/ Protomatter Syslog http://protomatter.sourceforge.net/
What is a container? Location: http://www.jguru.com/faq/view.jsp?EID=9876 Created: Jan 29, 2000 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Enterprise beans are software components that run in a special environment called an EJB container. The container hosts and manages an enterprise bean in the same manner that a Java WebServer hosts a Servlet or an HTML browser hosts a Java applet. An enterprise bean cannot function outside of an EJB container. The EJB container manages every aspect of an enterprise bean at run time including remote access to the bean, security, persistence, transactions, concurrency, and access to and pooling of resources. The container isolates the enterprise bean from direct access by client applications. When a client application invokes a remote method on an enterprise bean, the container first intercepts the invocation to ensure persistence, transactions, and security are applied properly to every operation a client performs on the bean. The container manages security, transactions, and persistence automatically for the bean, so the bean developer doesn't have to write this type of logic into the bean code itself. The enterprise bean can focus on encapsulating business rules, while the container takes care of everything else.
Containers will manage many beans simultaneously in the same fashion that a Java WebServer manages many Servlets. To reduce memory consumption and processing, containers pool resources and manage the lifecycles of all the beans very carefully. When a bean is not being used a container will place it in a pool to be reused by another client, or possibly evict it from memory and only bring it back when its needed. Because client applications don't have direct access to the beans -- the container lies between the client and bean -- the client application is completely unaware of the containers resource management activities. A bean that is not in use, for example, might be evicted from memory on the server, while its remote reference on the client remains intact. When the client invokes a method on the remote reference, the container simply re-incarnates the bean to service the request. The client application is unaware of the entire process. An enterprise bean depends on the container for everything it needs. If an enterprise bean needs to access a JDBC connection or another enterprise bean, it does so through the container; if an enterprise bean needs to access the identity of its caller, obtain a reference to itself, or access properties it does so through the container. The enterprise bean interacts with its container through one of three mechanisms: callback methods, the EJBContext interface, or JNDI. Callback Methods: Every bean implements a subtype of the EnterpriseBean interface which defines several methods, called callback methods. Each callback method alerts the bean of a different event in its lifecycle and the container will invoke these methods to notify the bean when it's about to pool the bean, persist its state to the database, end a transaction, remove the bean from memory, etc. The callback methods give the bean a chance to do some housework immediately before or after some event. Callback methods are discussed in more detail in other sections. EJBContext: Every bean obtains an EJBContext object, which is a reference directly to the container. The EJBContext interface provides methods for interacting with the container so that that bean can request information about its environment like the identity of its client, the status of a transaction, or to obtain remote references to itself. JNDI: Java Naming and Directory Interface is a Java extension API for accessing naming systems like LDAP, NetWare, file systems, etc. Every bean automatically has access to a special naming system called the Environment Naming Context (ENC). The ENC is managed by the container and accessed by beans using JNDI. The JNDI ENC allows a bean to access resources like JDBC connections, other enterprise beans, and properties specific to that bean. The EJB specification defines a bean-container contract, which includes the mechanisms (callbacks, EJBContext, JNDI ENC) described above as well as a strict set of rules that describe how enterprise beans and their containers will behave at runtime, how security access is checked, transactions are managed, persistence is applied, etc. The bean-container contract is designed to make enterprise beans portable between EJB containers so that enterprise beans can be developed once then run in any EJB container. Vendors like BEA, IBM, and Gemstone sell application servers that include EJB containers. Ideally, any enterprise bean that conforms to the specification should be able to run in any conformant EJB container.
Portability is central to the value that EJB brings to the table. Portability ensures that a bean developed for one container can be migrated to another if another brand offers more performance, features, or savings. Portability also means that the bean developer's skills can be leveraged across several EJB container brands, providing organizations and developers with better opportunities. In addition to portability, the simplicity of the EJB programming model makes EJB valuable. Because the container takes care of managing complex tasks like security, transactions, persistence, concurrency and resource management the bean developer is free to focus attention on business rules and a very simple programming model. A simple programming model means that beans can be developed faster without requiring a Ph.D. in distributed objects, transactions and other enterprise systems. EJB brings transaction processing and distributed objects development into the mainstream. How do I introspect a bean at run time to discover its type(s) and available methods? Location: http://www.jguru.com/faq/view.jsp?EID=10610 Created: Feb 1, 2000 Modified: 2000-02-01 07:11:58.411 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Question originally posed by Srilekha Mudumbai (http://www.jguru.com/guru/viewbio.jsp?EID=5112 Client applications or beans can access meta data about a bean from its EJBMetaData object. The EJBMetaData object is obtained from the bean's EJB home reference using the EJBHome.getEJBMetaData( ) method as shown below: AccountHome acctHome = ... get a reference to the bean's EJB home. EJBMetaData ejbMetaData = acctHome.getEJBMetaData( ); The EJBMetaData object implements the javax.ejb.EJBMetaData interface which defines methods for obtaining the class of the bean's remote interface, home interface, bean type (entity, stateful or stateless session), and the primary keys type (entity only). A reference to the bean's EJB home can also be obtained. Below is the interface definition of EJBMetaData. package javax.ejb; public interface EJBMetaData { // Obtain the home interface of the enterprise Bean. public EJBHome getEJBHome(); //Obtain the home interface of the enterprise Bean. java.lang.Class getHomeInterfaceClass(); //Obtain the Class object for the enterprise Bean's home interface. java.lang.Class getPrimaryKeyClass(); //Obtain the Class object for the enterprise Bean's primary key class. java.lang.Class getRemoteInterfaceClass(); //Obtain the Class object for the enterprise Bean's remote interface. boolean isSession(); //Test if the enterprise Bean's type is "session". boolean isStatelessSession();
} Once a client application has a reference to bean's remote and home interface classes, normal Java reflection can be used to introspect the methods avaiable to client. Below is an example: Class remoteClass = ejbMetaData.getRemoteInterfaceClass(); java.lang.reflect.Method [] methods = remoteClass.getDeclaredMethods(); for(int i = 0; i methods.length; i++){ System.out.println(methods[i].getName()); }
There are no mechanisms a client can use to introspect on a the bean class itself. This makes sense since a bean, as a component, is represented by its remote and home interfaces. The bean class itself should not be visible to the client. The EJBMetaData is designed to be used by IDEs and other builder tools that may need generic methods for obtaining information about a bean at runtime. What makes a Java class an enterprise bean? Location: http://www.jguru.com/faq/view.jsp?EID=10622 Created: Feb 1, 2000 Modified: 2000-02-01 07:14:47.937 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Question originally posed by sharma MR (http://www.jguru.com/guru/viewbio.jsp?EID=4939 An enterprise bean is composed of many parts, not just a single class. Essentially, an enterprise bean is constructed with a bean class, remote interface, home interface and deployment descriptor. These constituents are discussed below. A bean class is the implementation class of the bean that defines its business, persistence, and passivation logic. The bean class implements either the javax.ejb.EntityBean or javax.ejb.SessionBean interface and runs inside the EJB container. Instances of the bean class service client request indirectly; instances of the bean class are not visible to the client. The remote interface defines the business methods that will be visible to the client's that use the enterprise bean. The remote interface extends the javax.ejb.EJBObject interface and is implemented by a remote (distributed object) reference. Client applications interact with the enterprise bean through its remote interface. The home interface defines the create, delete (remove), and query methods for an enterprise bean type. The home interface extends the javax.ejb.EJBHome interface and is implemented by a remote (distributed object) reference. The client application will use the home interface to create beans, find existing beans, and remove specific beans. The deployment descriptor is used to describe the enterprise bean's runtime behavior to the container. Among other things the deployment descriptor allows the transaction, persistence, and authorization security behavior of a bean to be defined
using declarative attributes. This greatly simplifies the programming model when developing beans. An enterprise bean represents the sum of all these parts (remote, home, bean class, and deployment descriptor) as one component. An enterprise bean is not an enterprise bean if any one of these parts is missing. A change to anyone of these parts -- changing even one attribute in the deployment descriptor for example -creates an entirely new enterprise bean. Comments and alternative answers
EJB Author: Anitha Rathanam (http://www.jguru.com/guru/viewbio.jsp?EID=448785), Jul 3, 2001 The implementation of Session bean or the Entity bean interfaces makes the plain java class an Enerprise bean. Message Driven Bean does neither have remote nor home interfaces. Even then how does we say that it is still an EJB? Author: Navin Sidhaye (http://www.jguru.com/guru/viewbio.jsp?EID=720474), Jan 15, 2002 According to the explaination given above and ejb has to have home, remote and bean class. In addition to that it also need to have a deployment descriptor which will dectate the bean's behavior at run time. But the Message Driven Bean does neither have remote nor home interfaces. Even then how does we say that it is still an EJB? Re: Message Driven Bean does neither have remote nor home interfaces. Even then how does we say that it is still an EJB? Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727), Jan 15, 2002 Navin, When this FAQ was created, the Message Driven Bean wasn't part of the standard EJB specifications. The MDB has, in fact, appeared with EJB 2.0 Re[2]: Message Driven Bean does neither have remote nor home interfaces. Even then how does we say that it is still an EJB? Author: Seetesh H (http://www.jguru.com/guru/viewbio.jsp?EID=1038574), Dec 17, 2002 MDB implements MessageDrivenBean and so it does become a part of your Enterprise bean and not a simple java class. Seetesh While deploying CMP entity beans, which fields in the bean are containermanaged and how are they identified? Location: http://www.jguru.com/faq/view.jsp?EID=11096 Created: Feb 3, 2000 Modified: 2000-08-24 18:55:46.998 Author: Tim Rohaly (http://www.jguru.com/guru/viewbio.jsp?EID=10) Question
originally posed by M J Thatipamala (http://www.jguru.com/guru/viewbio.jsp?EID=4718 Container-managed fields may be specified in the bean's deployment descriptor. An entity bean, for example, has an XML deployment descriptor containing elements similar to the following:
<enterprise-beans> <entity> <description>This entity bean models an audio compact disc. <ejb-name>MusicCDBean
musicstore.MusicCDHome musicstore.MusicCD <ejb-class>musicstore.MusicCDBean
Container <prim-key-class>musicstore.MusicCDPK
False upc title artist type price In the above deployment descriptor, the container-managed fields are specified to be upc, title, artist, type, and price. While the deployment descriptor provides information about the container-managed fields for use during deployment, the details of how these fields are mapped into the database (or other persistent storage mechanism) are controlled by the containerspecific deployment process itself. To learn more about the container-specific deployment process, you will need to consult your container vendor's documentation. Comments and alternative answers
can you please give info about deploying CMP in weblogic Author: kathar meera (http://www.jguru.com/guru/viewbio.jsp?EID=1192060), Aug 10, 2004
can you please more eloborate on the deployment descriptor and could you please provide info about configuring CMP in Weblogic beans Author: anil patel (http://www.jguru.com/guru/viewbio.jsp?EID=1235783), Mar 31, 2005 Its also there in Beans.. u can also get it from the beans.. What newsgroups and mailing lists are available to learn more about EJBs? Location: http://www.jguru.com/faq/view.jsp?EID=11099 Created: Feb 3, 2000 Modified: 2000-02-03 12:47:08.327
Author: Tim Rohaly (http://www.jguru.com/guru/viewbio.jsp?EID=10) Question originally posed by John Mitchell PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=4 Sun manages two EJB-related mailing list: The EJB-INTEREST mailing list is for discussion of Enterprise JavaBeans development. A searchable archive of this list can be found at http://archives.java.sun.com/archives/ejb-interest.html. The J2EE-INTEREST mailing list is for discussion of Sun's Java 2 Enterprise Edition platform and for users of Sun's J2EE Reference Implementation. A searchable archive of this list can be found at http://archives.java.sun.com/archives/j2ee-interest.html. You may subscribe or unsubscribe to either of these lists by following the links on the above archive pages. When can we hope to see a comprehensive security spec for EJB? Location: http://www.jguru.com/faq/view.jsp?EID=11178 Created: Feb 3, 2000 Modified: 2000-02-03 14:53:59.52 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Question originally posed by Roisin Parkes (http://www.jguru.com/guru/viewbio.jsp?EID=5237 Currently the EJB security model supports authorization level security. Authorization security or access control allows control over which users can invoke what methods on a bean. Access control in EJB is declarative, which simplifies the programming model. Its possible that authentication security, which validates the identities of users accessing the system, will be defined in EJB 2.0. Its likely that the Java Authentication and Authorization security service will be used, but this is not definite. If this authentication is added to EJB, it will provide a standard and portable model for authenticating (login) of users. Secure communication, which is commonly implemented with technologies like SSL, may also be defined in EJB 2.0, but this is less likely since it's more of a value added vendor feature than a requirement for portability. The release date for EJB 2.0 (as of this writing) has not been determined. It seems likely that EJB 2.0 will become final sometime in late 2001 or 2002. Does the EJB programming model support inheritance? Location: http://www.jguru.com/faq/view.jsp?EID=11504 Created: Feb 4, 2000 Modified: 2000-02-04 14:41:34.909 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Question originally posed by James Webster (http://www.jguru.com/guru/viewbio.jsp?EID=8615 Inheritance is supported in EJB in a limited fashion. Enterprise beans are made up of several parts including: a remote interface; a home interface, a bean class
(implementation); and a deployment descriptor (see the FAQ What makes a Java class an enterprise bean? ). The remote interface, which extends javax.ejb.EJBObject can be a subtype or a super-type of remote interfaces of other beans. This is also true of the home interface, which extends javax.ejb.EJBHome. The bean class, which implements either javax.ejb.EntityBean or javax.ejb.SessionBean can also be a subtype or super-type of the bean class used by another enterprise bean. Deployment descriptors are XML files, so there is no Object-Oriented (OO) inheritance in the deployment descriptor. Because an enterprise bean is not one object -- its the composition of several parts -- traditional OO inheritance is not possible. The constituent Java parts (remote, home, bean class) of an enterprise bean may themselves subtype or serve as supertype, but the bean as a whole (the sum of its parts) doesn't support inheritance. Comments and alternative answers
There's a bug in J2EE RI which prevents you from having... Author: Patrick Wendel (http://www.jguru.com/guru/viewbio.jsp?EID=14423), Feb 15, 2000 There's a bug in J2EE RI which prevents you from having a remote interface B which derives from A which derives from EJBObject. You could use several interfaces instead, I suppose, as a workaround. I know Websphere supports inheritance. Does WebLogic... Author: jun hong (http://www.jguru.com/guru/viewbio.jsp?EID=121053), Aug 16, 2000 I know Websphere supports inheritance. Does WebLogic 4.5 support inheritance of EJB? How do I perform I/O operations from a bean? Location: http://www.jguru.com/faq/view.jsp?EID=12638 Created: Feb 9, 2000 Modified: 2000-05-29 12:02:04.075 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16)
Using
java.io
is prohibited
Using the java.io package from within a bean is prohibited. The EJB 1.1 Specification, section 18.1.2 (Programming Restrictions) states the following: An enterprise bean must not use the java.io package to attempt to access files and directories in the file system. The file system APIs are not well-suited for business components to access data. Business components should use a resource manager API, such as JDBC API, to store data.
The EJB 1.1 specification is available for download from http://java.sun.com/products/ejb/docs.html
Alternative Solutions To perform I/O operations you must use a resource connection supported by the EJB programming model. EJB servers may support several resource connection options, which can be used to log events as shown below: • • • •
JDBC (javax.sql.DataSource) : Write I/O data in to a relational database. URL (java.net.URL) : Write I/O data to a custom server or post them to a web server. JavaMail (javax.mail.Session) : E-mail I/O data to a special account JMS (javax.jms.QueueConnectionFactory | javax.jms.TopicConnectionFactory) : Send the I/O data as messages.
Comments and alternative answers
What about JNDI? JNDI is a J2EE API, one could quite... Author: James Webster (http://www.jguru.com/guru/viewbio.jsp?EID=8615), Feb 12, 2000 What about JNDI? JNDI is a J2EE API, one could quite easily write a JNDI SPI for accessing the filesystem (in fact, I think there is such an SPI included in the Sun JNDI downloads). I think this part of the specification is ill- concieved anyway, and forces developers to jump through hoops if they want their beans to work with files (what if I want to encapsulate the generation of an interface file in a session bean? sounds like a good idea to me!). And what is the spirit of this part of the spec: 1. Developers should AVOID writing beans that contain direct references to java.io packages (therefore, using the JNDI example I gave above would be okay?), but really, no one is going to stop them... OR 2. Container developers should INTERCEPT ANY requests to java.io classes and throw Security Exceptions if such an access occurrs? The latter seems a bit harsh to me! Does the io access just refer to the EJB itself calling... Author: dee dee (http://www.jguru.com/guru/viewbio.jsp?EID=95806), Aug 15, 2000 Does the io access just refer to the EJB itself calling the file system or can a bean use a helper class to do the io and pick up the generated file from the system? The EJB-Interest mailing list has some recent threads... Author: John Zukowski (http://www.jguru.com/guru/viewbio.jsp?EID=7), Nov 27, 2000 The EJB-Interest mailing list has some recent threads that discuss this further: Writing files with EJBs and File I/O in EJB. Is this restriction still applicable ? Author: Kunal Parikh (http://www.jguru.com/guru/viewbio.jsp?EID=1178680), Jun 14, 2004
Just wanted to know if the IO restriction is still applicable. Also, what about using a Helper class to do fileIO ? TIA, Kunal How should complex find operations be implemented? Location: http://www.jguru.com/faq/view.jsp?EID=13332 Created: Feb 11, 2000 Modified: 2000-05-29 12:05:40.71 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Question originally posed by Joe McDaniel (http://www.jguru.com/guru/viewbio.jsp?EID=5292 In bean-managed persistence (BMP) complex find operations are not difficult to implement, because you have complete control over how a find operation works through the ejbFind methods in the bean class. ejbFind methods in BMP entities can span multiple tables and even different data sources to locate the right entity beans. With container-managed persistence (CMP) its more difficult because you are dependent on the versatility of the EJB vendor. In other words, if the vendor does not support sophisticated find operations or syntax, its more difficult to declare complex find operations at deployment time. With CMP you have a couple options: •
•
Convert the CMP bean to a BMP bean and hand code the ejbFind methods yourself. This is a classic scenario for using BMP over CMP; when the EJB vendor is not sophisticated enough to support a bean's data access needs. Use a session bean to obtain the data you need. When a search operation becomes to complex to implement in a single bean its a good indication that the search operation is not appropriate for a find method. Search operations that span the data encapsulated by several different entity beans should be placed in a session bean with the emphasis on returning only the data needed, not necessarily bean references. Data can be returned in tabular format instead of bean references.
NOTE: A common design error is to implement search operations that filter results of multientity find requests implemented by other entity beans. This should be avoided. If you can not find the entity beans in one find request, then you should use a search method in a session bean. Should synchronization primitives be used on bean methods? Location: http://www.jguru.com/faq/view.jsp?EID=14274 Created: Feb 14, 2000 Modified: 2000-02-15 06:31:50.898 Author: Greg Boettcher (http://www.jguru.com/guru/viewbio.jsp?EID=14271) Question originally posed by suresh ramamoorthi (http://www.jguru.com/guru/viewbio.jsp?EID=13144 No. The EJB specification specifically states that the enterprise bean is not allowed to use thread primitives. The container is responsible for managing concurrent access to beans at runtime.
Can I use Threads in a enterprise bean? Location: http://www.jguru.com/faq/view.jsp?EID=14648 Created: Feb 15, 2000 Modified: 2000-05-22 12:57:17.2 Author: Aravind Naidu (http://www.jguru.com/guru/viewbio.jsp?EID=12326) Question originally posed by sanath sarma (http://www.jguru.com/guru/viewbio.jsp?EID=13815 No. The thread management is done by the container for you. As a bean developer you are not allowed to use threads. Section 18.1.2 of the EJB 1.1 specification states: •
The enterprise bean must not attempt to manage threads. The enterprise bean must not attempt to start, stop, suspend, or resume a thread; or to change a thread’s priority or name. The enter-prise bean must not attempt to manage thread groups.
These functions are reserved for the EJB Container. Allowing the enterprise bean to manage threads would decrease the Container’s ability to properly manage the runtime environment. Related FAQs: •
http://www.jguru.com/jguru/faq/view.jsp?EID=15893
Comments and alternative answers
usage of threads inside beans. Author: rajeev hans (http://www.jguru.com/guru/viewbio.jsp?EID=1056849), Feb 14, 2003 I agree with the fact that we should not try to alter anything with the current threads. But is it possible to start a new thread from a bean ? Re: usage of threads inside beans. Author: anand andrew (http://www.jguru.com/guru/viewbio.jsp?EID=813206), Apr 17, 2003 your question>"But is it possible to start a new thread from a bean ?" Yes.But it is not recommended by EJB specs/containers. Anand Andrew Why are beans not allowed to create their own threads? Location: http://www.jguru.com/faq/view.jsp?EID=15893 Created: Feb 19, 2000 Modified: 2000-02-20 15:30:42.767 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Question originally posed by dan benanav (http://www.jguru.com/guru/viewbio.jsp?EID=8173 Enterprise beans exist inside a container at run time. The container is responsible for managing every aspect of the enterprise bean's life including: transactions, access control, persistence, resource pooling, etc. In order for the container to manage the
runtime environment of a bean, it must have complete control over the threads that access and run within a bean. This means that beans can not start or manage their own threads. Containers deny enterprise beans the privilege to manage threads for three basic reasons: Resource management, security, and thread-sensitive storage. Resource Management Containers manage every aspect of the runtime environment used by enterprise beans including transactions, access control, life cycle, resource connections, VM security, class loading, and threads. This allows the container to conserve as many resources as possible, which is important when there are hundreds of enterprise beans servicing thousands of clients. Without strict management of resources like memory and threads, EJB systems might consume to many resources (memory and cycles), which would result in a slow system, a prospect that is untenable in a hightransaction environment. Threads started and managed by enterprise beans would not be managed by the container, which would make it difficult to conserve resources. Security There is no way for a container system to know in advance that a bean's use of threads is benign. While intentions may be sincere it is possible -- probably inevitable -- that developers would create malignant beans that spawn so many threads that the entire system slows down. One bean instance's misuse of threads or the commutative effect of many instances could cause a system slowdown. This is an insurgent denial of service, where the beans themselves sabotage a system's ability to respond to client requests. Security is a very good reason for denying bean's the privilege of starting and managing their own threads. Thread-Specific Storage Thread-Specific Storage (TSS) is an established and common technique employed by vendors to propagate and track client requests through the container system. It involves associating data with a thread. The data may be information about the client's identity, the transaction context, and other information, which can be accessed by any part of the container without having to pass the data explicitly. This is especially useful when enterprise beans invoke other enterprise beans or access resources, because it provides a convenient and transparent mechanism for transferring information about the who is making the request and under what circumstances. Each vendor will use the TSS technique differently according to the mechanics of their server. Threads started and managed by the enterprise bean explicitly would not have the proper TSS -- that would require intimate knowledge and access to the vendors container system. Without the right TSS the enterprise bean's threads can not operate within the container system properly. This is another reason why bean are not allowed to start and manage their own threads, it would short-circuit the vendor's use of TSS. Related FAQs: • •
Can I use Threads in an enterprise bean? What is a container?
Comments and alternative answers
The following is a quote from Mark Hapner, Sun's l... Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16), Feb 28, 2000 The following is a quote from Mark Hapner, Sun's lead enteprise Java architect. "Although conflict with the container is one of the reasons why EJBs are not allowed to create threads, there is a more important reason. A major objective of EJB is to achieve the creation of a multi-user service by implementing single threaded components. Writing robust, multi-threaded code is hard and eliminating the [requirement] that this skill to be mastered in order to implement a middle-tier service is one of the main benefits of EJB. The goal is to delegate all responsibility for managing concurrency to a container and its resources (DBMSs, etc). EJB 1.1 succeeds in doing this for many types of applications. EJB 2.0 will significantly expand the EJB app domain by adding support for asynchronous invocation (JMS integration). So, the question is not what you can do within your container it is what your container can do for you :>). Why should you be worrying about creating threads if you can get the container to handle all of that complexity?" -- Mark Hapner, EJB-INTEREST mailing list post "Re: Threads question (Concrete examples?)"
I had a requirement of asynchronous method invocat... Author: Sathish Srinivasan (http://www.jguru.com/guru/viewbio.jsp?EID=46492), May 9, 2000 I had a requirement of asynchronous method invocation. What should I do with EJB1.1 Container( apart from waiting for my particular EJB2.0 complaint app server )? I knew I could create a queue and write another bean/ process to do the job.But for my scenario, I thought, it is too much overhead. I went ahead with Threads. Any thoughts on how I should have proceeded.? How does EJB support polymorphism? Location: http://www.jguru.com/faq/view.jsp?EID=18807 Created: Feb 28, 2000 Modified: 2000-05-29 12:14:12.899 Author: Daniel Chong (http://www.jguru.com/guru/viewbio.jsp?EID=18540) Question originally posed by sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437
Because an EJB consists of multiple "parts", inheritance is achievable in a rather limited fashion (see FAQ answer on inheritance here). There have been noteworthy suggestions on using multiple inheritance of the remote interface to achieve polymorphism, but the problem of how to share method signatures across whole EJBs remains to be addressed. The following is one solution to achieving polymorphism with Session Beans. It has been tried and tested on WebLogic Apps Server 4.50 with no problems so far. We will use an example to show how it's done. Say, there are 2 session beans, Tiger and Lion, that share some method signatures but provide different implementations of the methods. • • • •
AnimalHome and Animal are the home and remote interfaces. The signatures of the polymorphic methods are in Animal. AnimalBean is the base implementation bean. TigerBean and LionBean extend from AnimalBean. They may override the methods of AnimalBean, implementing different behaviors. Deploy Tiger and Lion beans, specifying AnimalHome and Animal as their home and remote interfaces. Note that Tiger and Lion should have different JNDI lookup names.
Comments and alternative answers
Any other polymorphism options? Author: Dan Broadway (http://www.jguru.com/guru/viewbio.jsp?EID=424378), May 18, 2001 Can anyone point to any other discussions of implementing polymorphism with EJB? Our current design is polymorphism heavy and we are searching for options. Thanks in advance What classes does a client application need to access EJB? Location: http://www.jguru.com/faq/view.jsp?EID=20865 Created: Mar 6, 2000 Modified: 2000-08-11 12:13:21.15 Author: Sameer Tyagi (http://www.jguru.com/guru/viewbio.jsp?EID=4381) Question originally posed by Sukumar Subbiah (http://www.jguru.com/guru/viewbio.jsp?EID=1871 It is worthwhile to note that the client never directly interacts with the bean object but interacts with distributed object stubs or proxies that provide a network connection to the EJB container system. The mechanhism is as follows. 1. The client uses the JNDI context to get a remote reference (stub) to the home object ( the EJBHome). 2. It uses the home to get a remote reference (stub) to the EJBs remote object (the EJBObject) 3. It then invokes business methods on this remote object.
The client needs the remote interface, the home interface, the primary key( if it is an entity bean). In addition to these, the client would need the JNDI factory implementation, and the remote and home stubs. In some EJB servers the Factory and/or stubs can be dynamically loaded at run time. In other EJB servers they must be in the classpath of the client application. See also: •
Which, if any, of the automatically generated stub & skeleton class files does one need to include in a JAR file to be used when creating stand-alone clients?
Comments and alternative answers
In which packages are these classes. Author: Florian Binder (http://www.jguru.com/guru/viewbio.jsp?EID=446574), Dec 4, 2001 In which packages are the classes, which I need to connect to an ejb. Which servers, and how? Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Dec 10, 2001 "In some EJB servers the Factory and/or stubs can be dynamically loaded at run time. " -- which servers? and how are the classes actually loaded? via a URLClassLoader or what? What is an EJB primary key? How is it implemented when the database doesn't have a primary key? Location: http://www.jguru.com/faq/view.jsp?EID=20875 Created: Mar 6, 2000 Modified: 2000-08-15 06:31:37.383 Author: Sameer Tyagi (http://www.jguru.com/guru/viewbio.jsp?EID=4381) Question originally posed by Igor Mandrosov (http://www.jguru.com/guru/viewbio.jsp?EID=12762 A primary key is an object that uniquely identifies the entity bean. According to the specification, the primary key must be unique for each entity bean within a container. Hence the bean's primary key usually maps to the PK in the database (provided its persisted to a database). You may need to create a primary key in the database for the sake of referential integrity. This does not, however, mean you NEED a primary key in the database. As long as the bean's primary key (which maps to a column or set of columns) can uniquely identify the bean it should work. [with minor correction from Amit Chawla.] See also: •
Can a primary key have more than one field?
• •
How do I automatically generate primary keys? Can the primary key in the entity bean be a Java primitive type such as int?
Comments and alternative answers
What if the value of a compound primary key change... Author: Sesh Jalagam (http://www.jguru.com/guru/viewbio.jsp?EID=41326), Apr 27, 2000 What if the value of a compound primary key changes? What I mean here is, let's say that a table has columns Name and Balance and we made a primary key by combining both of these columns. What happens if I have a set method that changes the Balance column. Am I not changing the EB (since an EB is identified by its primary key). Does this mean I am creating a new instance of the EB? Thank you Sesh No, you are not creating a new instance of the EB ... Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243), May 11, 2000 No, you are not creating a new instance of the EB (entity bean). If you have a set method that changes the Balance column, what it means is that your bean has (for example) a setBalance(float balance) method. When this method is called, the new value is stored in the balance field of the entity bean and the container then persists this value with the column and row this bean represents in the database and will then update the new value in the database. There will not be a new instance of the entity bean created. What's an .ear file? Location: http://www.jguru.com/faq/view.jsp?EID=21087 Created: Mar 6, 2000 Modified: 2000-08-04 13:26:17.953 Author: Mobushir Hingorjo (http://www.jguru.com/guru/viewbio.jsp?EID=11910) Question originally posed by John Zukowski PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=7 An .ear file is an "Enterprise Archive" file. The file has the same format as a regular .jar file (which is the same as ZIP, incidentally). The .ear file contains everything necessary to deploy an enterprise application on an application server. It contains both the .war (Web Archive) file containing the web component of the application as well as the .jar file. In addition there are some deployment descriptor files in XML. http://java.sun.com/j2ee/j2sdkee/techdocs/guides/ejb/html/Overview.fm.html contains additional information. Comments and alternative answers
Should the .ear be enough to deploy an enterprise bean... Author: Benoit Xhenseval (http://www.jguru.com/guru/viewbio.jsp?EID=3363), Apr 18, 2000 Should the .ear be enough to deploy an enterprise bean in any EJB Server?
Re: Should the .ear be enough to deploy an enterprise bean... Author: MURALIDHAR KALAVACHARLA (http://www.jguru.com/guru/viewbio.jsp?EID=735059), Jan 25, 2002 Frankly speaking I did not use this packaging method as yet. But there seem to be some issues that I came across to know while reading about java packaging. Here is an excerpt from one of those I want to share with the community... " Currently, the J2EE 1.3 specification defines an enterprise application packaging unit to be a JAR file with an .ear extension. EAR files can contain one or more: - EJB modules (.jar extension) - Web application modules(.war extension) - JCA resource adapter modules (.rar extension) - Application client modules (.jar extension) Since most web-based J2EE applications are composed of web and EJB applications, the EAR file meets the basic requirements for packaging an application. However, it is lacking in capability for packaging complicated J2EE applications. For example, the following components are often used in a J2EE application, but cannot be declared in an EAR file: - Some JMS consumers that run within an application server, such as a MessageConsumer that runs as part of a ServerSession - JDBC DataSource objects - JMS ConnectionFactory and Destination objects - JMX MBeans - Startup and shutdown classes (admittedly, a propriety extension provided by vendors, but generally unilaterally supplied by all vendors) Currently, all of these components of an application have to be manually configured and deployed through a vendor's administration interface. As the usage of the items listed above increases over time, it will become more important for EAR files to natively support packaging of these components to achieve true J2EE application portability." Benoit: Not all EJB servers support deployment of ... Author: Taylor Goetz (http://www.jguru.com/guru/viewbio.jsp?EID=123153), Aug 11, 2000 Benoit:
Not all EJB servers support deployment of applications packaged as .ear files. And, as far as I can tell, this functionality is not a requirement for EJB 1.1 certification. WebLogic is one server that does not support deployment of .ear files. Orion is another EJB container that does support .ear files. I have found Orion to be very true to the specification, and very similar to the reference implementation. Re: Benoit: Not all EJB servers support deployment of ... Author: Billie Goodson (http://www.jguru.com/guru/viewbio.jsp?EID=1237349), Apr 8, 2005 The link for WebLogic should be http://www.bea.com not beai.com Can beans use stored procedures in a database? Location: http://www.jguru.com/faq/view.jsp?EID=22905 Created: Mar 10, 2000 Modified: 2000-03-10 12:53:56.824 Author: Richard Monson-Haefel (http://www.jguru.com/guru/viewbio.jsp?EID=16) Question originally posed by Anil Datt (http://www.jguru.com/guru/viewbio.jsp?EID=20887 Stored procedures can be used by session beans that access the database using JDBC and bean-managed entity beans that use JDBC to manage their own persistence. JDBC provides a call interface for using stored procedures. An example is provided below: InitialContext cntx = new InitialContext( ); DataSource dataSource = (DataSource) cntx.lookup("java:comp/env/jdbc/mydatabase"); Connection con = dataSource.getConnection( ); CallableStatement storedProcedure = con.prepareCall("{? = call someprocedure [(?,?)]}"); Comments and alternative answers
Some advanced CMP Object/Relational mapping tools also... Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362), Apr 12, 2000 Some advanced CMP Object/Relational mapping tools also allow the use of stored procedures in the persisting of Entity Beans. Hopefully a standard approach will be forthcoming in the upcoming EJB 2.0 specification Re: Some advanced CMP Object/Relational mapping tools also... Author: V Shah (http://www.jguru.com/guru/viewbio.jsp?EID=226807), Oct 23, 2001 Hi, Do you know this can be achieved using webgain ? I need to call a stored procedure for every insert/update/delete and I'm using CMP bean. Any idea, how would I go about doing this ?
Implment JTA? Author: Neo Gigs (http://www.jguru.com/guru/viewbio.jsp?EID=748386), May 9, 2002 Hi there, Can JTA being implemented if I have a series of stored procedure calls? How? (source code) Tq Neo Is method overloading allowed in EJB? Location: http://www.jguru.com/faq/view.jsp?EID=28118 Created: Mar 24, 2000 Modified: 2000-04-03 00:08:44.325 Author: sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437) Question originally posed by Daniel Weimer (http://www.jguru.com/guru/viewbio.jsp?EID=25540 Yes you can overload methods. How can JMS be used from EJB 1.1? Location: http://www.jguru.com/faq/view.jsp?EID=28553 Created: Mar 25, 2000 Modified: 2000-03-29 06:21:56.666 Author: Jason Vanguard (http://www.jguru.com/guru/viewbio.jsp?EID=27748) Question originally posed by Jon Finanger (http://www.jguru.com/guru/viewbio.jsp?EID=1625 The same as any client would use JMS. At this point there is no integration, but it is planned for a future release of the EJB spec. Comments and alternative answers
Could you please expand: Can a bean be a JMS subscriber... Author: Benoit Xhenseval (http://www.jguru.com/guru/viewbio.jsp?EID=3363), Apr 18, 2000 Could you please expand: Can a bean be a JMS subscriber and "sit" there in memory waiting for a JMS event? How could we guarantee that this bean stays active in memory? EJB 1.1 specification doesn't allow an enterprise bean... Author: Alessandro Alinone (http://www.jguru.com/guru/viewbio.jsp?EID=14810), Apr 27, 2000 EJB 1.1 specification doesn't allow an enterprise bean to receive messages asynchronously. You can only pull messages through the receive() method. The asynchronous delivery will be made possible by EJB 2.0 specification. Here is a quote from JMS 1.0.2 specification (sec. 1.4.3 on page 18): "The current EJB specification
defines beans that are invoked synchronously via method calls from EJB clients. A future release of EJB will add a form of asynchronous bean that is invoked when a JMS client sends it a message." Can primary keys contain more than one field? Location: http://www.jguru.com/faq/view.jsp?EID=30244 Created: Mar 30, 2000 Modified: 2000-08-15 06:29:45.532 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by Harish Somisetty (http://www.jguru.com/guru/viewbio.jsp?EID=27358 Yes, a primary key can have as many fields as the developer feels is necessary, just make sure that each field you specify as the primary key, you also specify a matching field in the bean class. A primary key is simply one or more attributes which uniquely identify a specific element in a database. Also, remember to account for all fields in the equals() and hashCode() methods. Comments and alternative answers
There's a bug in the current version of the J2EE r... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Apr 6, 2000 There's a bug in the current version of the J2EE reference EJB server (the one you run by typing "j2ee" from the command line) -- it won't deploy a bean with a complex primary key unless that key is actually a CMP property (public instance variable) of the Bean. Is there a J2EE server for RedHat Linux 6.1? Location: http://www.jguru.com/faq/view.jsp?EID=32032 Created: Apr 4, 2000 Modified: 2000-04-04 10:35:49.086 Author: sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437) Question originally posed by Sanjay Mistry (http://www.jguru.com/guru/viewbio.jsp?EID=17764 There are couple of EJB servers Check this website http://www.flashline.com/Components/appservermatrix.jsp?sid=9548598793753501378072-150 Comments and alternative answers
The Inprise application server also runs on RedHat... Author: Thomas Kirsch (http://www.jguru.com/guru/viewbio.jsp?EID=47333), May 10, 2000 The Inprise application server also runs on RedHat Linux 6.1 How does Container Managed Persistence work with automatically generated database ID fields? Should I map the ID field explicitly or leave it unspecified? Location: http://www.jguru.com/faq/view.jsp?EID=33146 Created: Apr 6, 2000 Modified: 2000-04-10 11:21:41.876
Author: sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437) Question originally posed by sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437 In the Deployment Descriptor, map the normal fields appropriately, but don't specify the auto-id field as one of the container managed fields. Comments and alternative answers
But you still have to specify the primary key field... Author: Andrei Iarnykh (http://www.jguru.com/guru/viewbio.jsp?EID=224922), Mar 1, 2001 But you still have to specify the primary key field in the entity bean, don't you? So how to work it around? How can one have non-client specific state in stateless session beans? Location: http://www.jguru.com/faq/view.jsp?EID=33182 Created: Apr 6, 2000 Modified: 2000-04-10 10:36:43.271 Author: sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437) Question originally posed by Alex Stouffs (http://www.jguru.com/guru/viewbio.jsp?EID=23864 You can use the Environment to get a pointer to a somewhat global state, that's shared among all EJBs: public class test implements SessionBean { private transient SessionContext ctx; static final float PIE=3.14 ; private transient Properties myprops; //all the SessionBean methods public void setSessionContext(SessionContext ctx) { this.ctx = ctx; myprops = ctx.getEnvironment(); } } Let's assume I use a JavaBean as a go-between a JSP and an EJB, and have, say, 50 concurrent clients that need to access the EJB functionality. Will the JSP container actually instantiate 50 instances of the bean, or can it reuse a single instance to access the EJB? Location: http://www.jguru.com/faq/view.jsp?EID=35052 Created: Apr 11, 2000 Modified: 2000-08-14 11:26:53.146 Author: Govind Seshadri (http://www.jguru.com/guru/viewbio.jsp?EID=14) Question originally posed by Garth Dyck (http://www.jguru.com/guru/viewbio.jsp?EID=34850 It depends on the scope you associate with the JavaBean. If you assign the bean with page (which is the default) scope or request scope, a new bean will be instantiated for each incoming request.
If you assign the bean with session scope, you will still have 50 instances loaded in memory (assuming each incoming request is triggered by a distinct client), although some may have been instantiated from an earlier request from the same client. However, you may not want to use the session scope for a high-volume site as these beans will continue to reside in memory, long after the request has been serviced, consuming valuable resources until they are invalidated either explicitly or due to a session timeout. You can also assign the bean with application scope, in which case it is instantiated just once before being placed into the servlet context of the container. It can then be accessed at a later time, as long as the server is up and running. Although this may sound like an attractive proposition, do note that you will have to contend with significant multithreading issues. For instance, you'll have to ensure that the bean is accessed in a thread-safe manner from each of the JSP files. While you can do this using explicit synchronization from within the JSP file, do note that your application may take a significant performance hit because of this - especially if you expect tens or hundreds of concurrent clients accessing your pages. So, in short, your best bet may be to assign the bean with request scope. Comments and alternative answers
Is it viable to have JSP in one Server,servlet in ... Author: Rangarajan Mangudi Parthasarathy (http://www.jguru.com/guru/viewbio.jsp?EID=347775), Mar 16, 2001 Is it viable to have JSP in one Server,servlet in another,and EJB in other. If possible send some example code. JSP pages invokes the business methods,to the servlet,which in turn forwards it to the EJB. Re: Is it viable to have JSP in one Server,servlet in ... Author: ravi vedala (http://www.jguru.com/guru/viewbio.jsp?EID=1177955), Jun 11, 2004 I dont see any problem with that, as long as you are not expecting all these to be part of a cluster. What happens when two users access an Entity Bean concurrently? Location: http://www.jguru.com/faq/view.jsp?EID=35269 Created: Apr 12, 2000 Modified: 2000-08-03 22:23:01.884 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by seema guptha (http://www.jguru.com/guru/viewbio.jsp?EID=32228 Taken from Enterprise JavaBeans by Richard Monson-Haefel, "EJB, by default, prohibits concurrent access to bean instances. In other words, several clients can be connected to one EJB object, but only one client thread can access the bean instance at a time. If, for example, one of the clients invokes a method on the EJB object, no other client can access that bean instance until the method invocation is complete." So, to answer your question, two users will never access an Entity Bean concurrently.
If you wish to know more about this issue, I would suggest downloading and reading the white paper from Sun: http://java.sun.com/products/ejb/docs.html . Some entity beans may require loopback calls, where bean A is invoked, in turn invoking bean B, which then invokes a method call on bean A. This kind of concurrency is tricky and is best avoided. As a side note, the use of 'synchronized' is not permitted in EJB. (You must leave all that up to the server.) Comments and alternative answers
I disagree with the statement "two users will... Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362), Apr 17, 2000 I disagree with the statement "two users will never access an Entity Bean concurrently." Referring to the section 9.1.11 of the EJB 1.1 specification - "Concurrent access from mulitple transactions" states that the container can allow for concurrent access to an Entity Bean. This functionality is extremely vital for high transactional systems. Having serialized access to an Entity Bean can cause deadlocks and hanging clients. A high end EJB container, such as the Inprise Application Server supports this enterprise level functionality. In this case, the transactional synchronization is left up to the database and JDBC connection specified by the transaction isolation. This can provide many benefits, consider Client A that accesses a Customer Entity Bean - CBean. Client A is in a transaction but doesnt change CBean, Client B can access and change CBean and does not have to wait for Client A to finish reading. You may now ask "well then Client B is seeing an out of date CBean", This is exactly how transaction isolation on a database works and is dependent on the transaction isolation specified on the JDBC connection. I believe that this depends on whether you look at... Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644), Apr 24, 2000 I believe that this depends on whether you look at transactional concurrency, or at threadwise concurrency. The spec allows transactional concurrency (as Mr. Castaneda points out) but not threadwise concurrency. The key in Monson-Haefel's quote is '...until the method invocation is complete' This indicates to me that he (and the original poster) were discussing concurency from a threading point of view, not from the transactional point of view that Mr Castaneda brings up. In Entity bean deployment descriptor, we can define... Author: Archana Karnik (http://www.jguru.com/guru/viewbio.jsp?EID=68139), Jul 13, 2000
In Entity bean deployment descriptor, we can define whether the bean is-reentrant or non-reentrant. If we define the entity bean as being reentrant, multiple clients can connect to the Entity bean & execute methods within the entity bean concurrently. Container takes care of synchronization. If we define the entity bean as non-reentrant and many clients connect to it concurrently to execute a method, exception is thrown . Re: In Entity bean deployment descriptor, we can define... Author: Kalpeshkumar Soni (http://www.jguru.com/guru/viewbio.jsp?EID=916018), Jul 2, 2002 can somebody throw more light on this reentrant thing ? how to specify isolation levels for session/entity beans in weblogic and any other ap server. what about oracle9iAS Re: In Entity bean deployment descriptor, we can define... Author: Seetesh H (http://www.jguru.com/guru/viewbio.jsp?EID=1038574), Dec 17, 2002 Have u tried this Archana? If yes which app server r u using? Seetesh What's the reason for having two interfaces -- EJBHome for creating, finding & removing and EJBObject for implementing business methods. Why not have an single interface which supports both areas of functionality? Location: http://www.jguru.com/faq/view.jsp?EID=35558 Created: Apr 12, 2000 Modified: 2000-04-14 08:44:05.104 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by rajesh kkkkkkkkk (http://www.jguru.com/guru/viewbio.jsp?EID=16780 This design reflects the common "Factory" Design pattern. The EJBHome interface is the Factory that creates EJBObjects. EJBObject instances are the product of the factory. The reason for having two interfaces is because they are both responsible for different tasks. The EJBHome is responsible for creating and finding EJBObjects, whilst the EJBObject is responsible for the functionality of the EJB. Comments and alternative answers
Suppose Both the methods of Home, Remote are in single... Author: Uma Sankar ramaraju (http://www.jguru.com/guru/viewbio.jsp?EID=36320), Apr 14, 2000 Suppose Both the methods of Home, Remote are in single interface EJBxyz. and the ejbinterface for our ejb is like this interface MyEJBInterface extends EJBxyz { // create or initalization methods create(args1); create(args1); // biz methods operation1(...); operation2(....);
}
the ejbean is implemented in MyEJB.java. A client can access MyEJB in the below manner. InitialContext ctx = new IntialContext(); Object objRef= ctx.lookup("myejbjndiname"); MyEJBInterface myIface = (MyEJBInterface ) PortableRemoteObject.narrow(objRef, objRef.class); myIface.operation1(...);
Like in the code above client can call the biz methods with out really creating the Object. This will certainly increase programming bugs. For the above to work properly, ejbhome implementor should have a default ejb in it to redirect the call to( current implementation allows to crete the ejb on demand) . Initializing the default ejb poses many problems. It can be intialized with a standard set of arguments (removes the current flexibility of overloaded create methods). Some entity beans can have only finder methods with out creation methods, what to do in those cases ( ???) Having single interface for both the purposes promotes programatical errors, and removes current ambiguities. By careful look of the problems encountered above we get the answer that interface and it's creation are two different abstractions. By using creation abstraction just to create & find and the interface to do biz methods we get cleaner code, and flexibility to create, find ejb's with multiple types of arguments. for a good pattern for this design see Robert's answer above Can a bean act as a singleton to provide logging and other services? Location: http://www.jguru.com/faq/view.jsp?EID=35559 Created: Apr 12, 2000 Modified: 2000-04-14 08:48:47.801 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Diederik de Groot (http://www.jguru.com/guru/viewbio.jsp?EID=11611 No, You cannot implement a Singleton in EJB. A way to do this could be to implement an RMI or CORBA object. Comments and alternative answers
EntityBean as Singleton? Author: Ravi Shankar (http://www.jguru.com/guru/viewbio.jsp?EID=560697), Nov 26, 2001 Wouldn't the following scheme work like a singleton? Define a read-only BMP EntityBean with <prim-key-class> as String. In the ejbFindByPrimaryKey() method, always return a hard-coded string (irrespective of the primary key value passed in). Wouldn't all clients then get a reference to the same EJB instance? Regards Ravi
Does it work? Did you try? Author: Chris Duerr (http://www.jguru.com/guru/viewbio.jsp?EID=1234080), Mar 22, 2005 The ejb specification states: at any time, there is only one client thread per bean instance active. Therefore I expect that there might more than one instance of an entity bean, even if there is only one data set to represent. Setting the entitiy bean read-only means that there is no call to the (unneseccary) ejbStore(). A read-only bean still may be represented by more than one instance. But this is blank theory, so does it in practice work? Did you try? Use a stateless session bean with an instance pool size of 1. Author: Dominic Cioccarelli (http://www.jguru.com/guru/viewbio.jsp?EID=759666), Feb 14, 2002 You can (in many application servers) determine the instance pool size for each bean. By implementing a stateless session bean with an instance size of 1, you effectively have a singleton. The downside is that setting the pool size is vendor specific. Re: Use a stateless session bean with an instance pool size of 1. Author: David Li (http://www.jguru.com/guru/viewbio.jsp?EID=767271), Feb 21, 2002 My impression is that a stateless session bean instance is not free threaded and does not allow a re-entry while another client is using it. The other way to view it is that if a single instance of a stateless session bean were a singleton and were able to serve multiple client simultanouly, why would you ever need to put more than one bean instances in a pool? Hope somebody can confirm my impression or tell me why I am wrong. Thanks David Re[2]: Use a stateless session bean with an instance pool size of 1. Author: Kirill Fakhroutdinov (http://www.jguru.com/guru/viewbio.jsp?EID=501201), May 7, 2002 You are right that this singleton EJB can not be multithreaded - as any other EJB. Only one client at a time would be able to access it. And because other EJBs can not wait because of the absence of synchronization mechanisms they probably will be just failing (unless application server/container will be able to put them "on hold" - that I doubt). P.S. Read-only singleton could be free-threaded, but read-write singleton usually has to be synchronized. Use Of Singleton Pattern in EJB. Author: santosh Terkhedkar (http://www.jguru.com/guru/viewbio.jsp?EID=996598), Sep 9, 2002 I think use of singleton pattern is possible in EJb, we can use JNDI to store arbitrary objects and lookup these objects through jndi,but use of singleton pattern in ejb is not
useful. other way to achive this could be to write a java class and call this bean from within java class and make only one instance of this class. Re: Use Of Singleton Pattern in EJB. Author: Ankush Purwar (http://www.jguru.com/guru/viewbio.jsp?EID=1221499), Jun 20, 2005 Using your approach write a java class and call this bean from within java class and make only one instance of this class doesn't work in clustering. Which fields in beans should be public? Location: http://www.jguru.com/faq/view.jsp?EID=35561 Created: Apr 12, 2000 Modified: 2000-04-17 07:55:28.417 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by sanath sarma (http://www.jguru.com/guru/viewbio.jsp?EID=13815 All Container Managed Fields in an Entity Bean must be public. Ejb 1.1 spec section 9.4.1 - "The fields must be defined in the entity bean class as public, and must not be defined as transient." How do you implement callbacks in EJB? Location: http://www.jguru.com/faq/view.jsp?EID=35566 Created: Apr 12, 2000 Modified: 2000-04-17 08:01:09.382 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by telmo sa (http://www.jguru.com/guru/viewbio.jsp?EID=5055 If your client is an EJB, it can pass a reference to itself to the method of the bean that it is calling. The EJB can then call methods directly on that interface. If your client is a Java client, your client requires some sort of object that will "listen" for call-backs. This could be either a CORBA or RMI object. Again, you could pass references to these objects to the EJB, which could then invoke methods on the references. Comments and alternative answers
Case 1: Client is an EJB. If client EJB is running... Author: Thomas Kirsch (http://www.jguru.com/guru/viewbio.jsp?EID=47333), May 10, 2000 Case 1: Client is an EJB. If client EJB is running in a JVM different from the one of the server EJB and you pass a reference of the client EJB to the server EJB for a "direct" call back, how can the server EJB find the client EJB? In a "direct" callback there is no look-up in a Java naming service involved. Case 2: The client contains an RMI object that listens for callbacks. Do you have to
register this client RMI object with an RMI registry running on the client machine for the EJB to find the object? Don't worry: RMI takes care of all that automagically.... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), May 17, 2000 Don't worry: RMI takes care of all that automagically. The RMI skeleton, in processing the request, saves all the information about the caller. A nameserver is only required if you only know the name of the remote object; since you've been invoked by it, then by definition you already know who and where it is. Wrong answers !! Author: Raees Uzhunnan (http://www.jguru.com/guru/viewbio.jsp?EID=281081), Feb 14, 2002 An enterprise bean should not pass its reference to any callback methods. It should first obtain a remote refernce to itself using contect object and then pass this to the callback method. This is for container to have a track of who all accessing the specified enterprise bean - based on spec 1.1 When should I use bean-managed transactions instead of specifying transaction information in the deployment descriptor? Location: http://www.jguru.com/faq/view.jsp?EID=36327 Created: Apr 14, 2000 Modified: 2000-08-03 22:11:55.978 Author: Uma Sankar ramaraju (http://www.jguru.com/guru/viewbio.jsp?EID=36320) Question originally posed by hari narayandas (http://www.jguru.com/guru/viewbio.jsp?EID=32993 Hi Hari, The Sun J2EE EJB Guide says like this: Although beans with container-managed transactions require less coding, they have one limitation: When a method is executing, it can be associated with either a single transaction or no transaction at all. If this limitation will make coding your session bean difficult, you should consider using bean-managed transactions. The following pseudo-code illustrates the kind of fine-grained control you can obtain with bean-managed transactions. By checking various conditions, the pseudo-code decides whether to start and stop different transactions within the business method. begin transaction ... update table-a ... if (condition-x) commit transaction else if (condition-y) update table-b
commit transaction else rollback transaction begin transaction update table-c commit transaction ... I think what it means is there are some limitations in j2ee transaction support. In a container managed situation, nested or multiple transactions are not allowed within a method. if a biz method needs those features you need to go for bean managed transactions. Comments and alternative answers
Actually, BMT isn't about nested transactions. It just... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Apr 17, 2000 Actually, BMT isn't about nested transactions. It just allows you finer control than the various transaction options provided by the container. If you tell it to in the DD, the container will suspend an existing transaction, create a new one, join on the an existing one, and so forth, automatically doing the right thing before and after your method. Bean-managed transactions just allow you to do the same sort of stuff, only with more control over the conditions under which that would happen. That is, you can do transaction stuff *inside* a method, rather than letting the method be the level of granularity. It turns out that nested transactions are not currently supported by Java TP implementations. Or has that changed?
How do I automatically generate primary keys? Location: http://www.jguru.com/faq/view.jsp?EID=37217 Created: Apr 17, 2000 Modified: 2000-08-15 06:30:23.774 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by sat d (http://www.jguru.com/guru/viewbio.jsp?EID=14705 A common way to do it is to use a stateless session bean to retrieve the ID that you wish to use as the primary key. This stateless session bean can then execute an Oracle sequencer or procedure etc. to retrieve the ID value used as the primary key. Comments and alternative answers
Such mechanism is not possible with MS SQL Server.... Author: Se Hee Lee (http://www.jguru.com/guru/viewbio.jsp?EID=21287), Apr 19, 2000 Such mechanism is not possible with MS SQL Server. There is no way of getting the next sequence number which serves as the primary key in SQL Server. In this MS
SQL case, the developer has to make the table non-automatic, and use some type of helper class to find the the next key which is always unique. That is not true. For MS SQL Server you can issue,... Author: James Pansarasa (http://www.jguru.com/guru/viewbio.jsp?EID=54657), Jun 14, 2000 That is not true. For MS SQL Server you can issue, in the context of the same transaction, a "SELECT @@IDENTITY ..." call to get the last identity value generated by the statement. If the statement did not affect any tables with identity columns, @@IDENTITY returns NULL. If multiple rows are inserted, generating multiple identity values, @@IDENTITY returns the last identity value generated. Example (taken from the MS SQL Server 7.0 documentation): This example inserts a row into a table with an identity column and uses @@IDENTITY to display the identity value used in the new row. INSERT INTO jobs (job_desc,min_lvl,max_lvl) VALUES ('Accountant',12,125) SELECT @@IDENTITY AS 'Identity'
If you are using Oracle it can be done via a database... Author: Malcolm Speedie (http://www.jguru.com/guru/viewbio.jsp?EID=100266), Jul 24, 2000 If you are using Oracle it can be done via a database trigger. You can have the trigger automatically set the id if you do not provide one on insert. Here is a simple example: CREATE OR REPLACE TRIGGER emps_in_trg BEFORE INSERT ON emps FOR EACH ROW DECLARE v_seq_num
NUMBER(10);
BEGIN -- By using IS NULL we give the programmer the option to set these values -- otherwISe we default them IF :new.emp_id IS NULL THEN SELECT emp_id_sequence.nextval INTO v_seq_num FROM dual; :new.emp_id := v_seq_num; END IF;
EXCEPTION WHEN OTHERS THEN NULL; -- Should really do something END emps_in_trg; / show errors
This Oracle trigger does not work. You are always ... Author: Srihari Bathini (http://www.jguru.com/guru/viewbio.jsp?EID=54760), Sep 8, 2000 This Oracle trigger does not work. You are always giving 0 (Zero) to sequence number, it will say, duplicate key. I tested this. My approach is to use a simple Singleton Class to ... Author: Alexandros Kotsiras (http://www.jguru.com/guru/viewbio.jsp?EID=47511), Jan 8, 2001 My approach is to use a simple Singleton Class to generate PKs instead of a Session Bean. The only public method of the class is nextVal() which can be implemented in different ways. The above example shows my prefered implementation by using an Oracle Sequence : public class SequenceGen {
private static Context jndiCtx ; private static DataSource ds ; private static SequenceGen singleInstance ; private SequenceGen() { Hashtable ht = new Hashtable() ; ht.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); ht.put(Context.PROVIDER_URL, "t3://localhost:7001"); try{ jndiCtx = new InitialContext(ht) ; ds = (javax.sql.DataSource) jndiCtx.lookup("weblogic.jdbc.jts.EJBThin"); System.out.println("############# SequenceGen.constructor() called ###############"); } catch(NamingException ex) { ex.printStackTrace() ; } finally { try{ jndiCtx.close() ; } catch(NamingException ex) { ex.printStackTrace() ; } }
} private static SequenceGen getSingleInstance() { if(singleInstance == null) singleInstance = new SequenceGen(); return singleInstance ; } // This is the only public method !! You can change the implementation to whatever unique ID generator you want to use. public static synchronized long nextVal() { long nextVal = -1 ; Connection conn = null ; PreparedStatement pst = null ; ResultSet rs = null ; try{ conn = getConnection(); pst = conn.prepareStatement("Select RMH_SEQ.nextval from DUAL"); rs = pst.executeQuery(); if(rs.next()) nextVal = rs.getLong(1); } catch(SQLException ex) { ex.printStackTrace() ; } finally { try{ if(rs != null) rs.close(); if(pst != null) pst.close() ; freeConnection(conn); }catch(SQLException ex) { ex.printStackTrace() ; } return nextVal ; }
}
private static Connection getConnection() { Connection conn = null ; try{ conn = getSingleInstance().ds.getConnection() ; System.out.println("Sequence.getConnection() called "); } catch(SQLException ex) { ex.printStackTrace() ; } return conn ; } private static void freeConnection(Connection conn) { try{ if(conn != null) conn.close(); } catch(SQLException ex) {
ex.printStackTrace() ;
} }
public static void main(String[] args) { System.out.println("nextval 1 : " + SequenceGen.nextVal()); // This time the constructor will not be called again System.out.println("nextval 2 : " + SequenceGen.nextVal()); }
}
Then in the Entity Bean i add a no-args ejbCreate() method as follows : public class CabinBean implements EntityBean { int id ; public CabinPK ejbCreate() throws Exception { int _id = (int)SequenceGen.nextVal(); this.id = _id ; return null ; } . . . }
This should be faster and is definitelly simpler than the Session context approach. No need for <ejb-ref> in all your Entity Beans Also it hides from the Client the creation of the PKs. I don't want the EJB client Application to have control over the creation of PK values. The advantage of the Session bean approach is that it is accessible from remote Entity Beans (residing in external JVMs). Re: My approach is to use a simple Singleton Class to ... Author: Jasen Halmes (http://www.jguru.com/guru/viewbio.jsp?EID=766898), Feb 21, 2002 The problem with this approach is that if you can't rely on a "trigger/sequence" like mechanism at the db level and you implement your own, you need to write an SQL update statement. When you try to commit that, you get an IllegalStateException because apparently jdbc inherits the callers transaction state, in this case an EJB. Has anyone figured out how to use a non EJB id generation that uses jdbc and is called from an EJB and does an update (and therefore a commit)? Re: My approach is to use a simple Singleton Class to ... Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727), Feb 21, 2002 Alexandro, how do you handle clustering ? Re[2]: My approach is to use a simple Singleton Class to ...
Author: Nick Kelly (http://www.jguru.com/guru/viewbio.jsp?EID=768078), Feb 22, 2002 I think the proposed singleton solution is OK, because it uses an Oracle sequence to generate the actual key - which always returns a new unique value when you invoke .NEXTVAL. However, it is still an Oracle specific solution. It would be nicer to see a mechanism that was directly portable across DBs. Re[3]: My approach is to use a simple Singleton Class to ... Author: cedric perrot (http://www.jguru.com/guru/viewbio.jsp?EID=1059101), Oct 8, 2003 this is the only portable way for different databases. from the code you just call the procedure or function. otherwise you have to cope with @@IDENTITY's in SQL Server, ROWID's in Oracle .... i appended the oracle solution its easy to port it to any database. create table uk_sequence_table ( TABLE_NAME varchar2(100), COUNTER integer ); ALTER TABLE uk_sequence_table ADD PRIMARY KEY (TABLE_NAME) USING INDEX TABLESPACE TS_SALE_INDEX01; CREATE OR REPLACE FUNCTION uk_for_table (tname IN VARCHAR) RETURN INTEGER IS cntr INTEGER; -- declare the return variable BEGIN lock table uk_sequence_table in exclusive mode; update uk_sequence_table set COUNTER = COUNTER + 1 where TABLE_NAME = tname; select COUNTER into cntr from uk_sequence_table where TABLE_NAME = tname; RETURN cntr; END; / CREATE OR REPLACE PROCEDURE uk_for_table_proc ( tname IN VARCHAR, lngIdentity OUT INTEGER ) IS BEGIN lock table uk_sequence_table in exclusive mode; update uk_sequence_table set COUNTER = COUNTER + 1 where TABLE_NAME = tname; select COUNTER into lngIdentity from uk_sequence_table where TABLE_NAME = tname; END; INSERT INTO uk_sequence_table (TABLE_NAME, COUNTER) VALUES ('
', 0); Re: My approach is to use a simple Singleton Class to ... Author: jyothi veera (http://www.jguru.com/guru/viewbio.jsp?EID=1084918), May 14, 2003 I have pretty much understood the code but iam not sure about where to include this code in wsad and also i din't get a clear picture about the jndi context. Please can you explain me a little bit in detail Thanks How do you model for a JOIN operation in a relational database using entity bean(s)? Do you have to have separate entity beans for each table in the database?
Location: http://www.jguru.com/faq/view.jsp?EID=37219 Created: Apr 17, 2000 Modified: 2000-04-18 15:06:30.614 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Benjamin Ghofrani (http://www.jguru.com/guru/viewbio.jsp?EID=28085 This depends on the granularity and the design of your Entity beans. A way to do it is to model an Entity for each table and for the join specify a reference to Entity Bean 2 (from table2 ) from Entity Bean 1 (from table 1). If this is a one-toone relationship then you could easily place these into the same Entity bean - this is a design issue and has other factors involved. For a one-to-many relationship you could specify a collection of EJB references to Entity Bean 1 inside Entity Bean 2. If you're using CMP, the above information will be very much reliant on the EJB CMP tool that you are using. Each tool has its strengths. I am basing this response on the Inprise Application Server 4.0. Comments and alternative answers
Another possibility is that one of the tables may not... Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644), Apr 24, 2000 Another possibility is that one of the tables may not map to an entity at all: it may instead map to a 'value object' AKA 'dependant object'. Again this really depends on what your beans _are_, on what your design is. An example where I'd probably use value objects is where i have a Customer (which would be an entity) who has many Addresses (each of which would be a value object). The net effect is that your Entity becomes more coarse grained, which is generally considered a Good Thing in distributed systems. This has several advantages: 1. You can pull an address across the wire/process boundary in one shot, which is nice since you usually use most of the fields of an address. 2. It's simpler to construct good transactions, since you get a big chunk of data, which you can call accessors on locally, therefore out of transaction scope. 3. It allows you to define an optimistic locking mechanism at the Customer level, so that you can detect when possibly conficting changes are made to any of the Customer's dependents
Re: Another possibility is that one of the tables may not... Author: Banda Srinivas (http://www.jguru.com/guru/viewbio.jsp?EID=389958), Apr 5, 2001 hi, if we use one entity bean for multiple tables, is that possible to insert/delete/update (DML) operations on the tables thru this entity bean? if yes,
how?? please give me a detailed answer. Joins in Entity Beans Author: surya navi (http://www.jguru.com/guru/viewbio.jsp?EID=388862), Mar 27, 2001 To avoid the complicated nature of doing joins with Entity beans , we took the DAO(Data access Objects) route suggested in J2EE design blue prints book. In Session bean , create a connection object and pass it to DAO JavaBean's method with the required parameters. In DAO, we execute a simple SQL query using Statement object and return a collection to session bean.We use the entity beans only for creating and updating records.For search we avoid entity beans. This improves performance too and this is the route suggested by Weblogic People.It works nicely and simplified the programming work in our project Re: Joins in Entity Beans Author: henry lee (http://www.jguru.com/guru/viewbio.jsp?EID=489761), Sep 24, 2001 test Re: Joins in Entity Beans Author: Anthony Alcamo (http://www.jguru.com/guru/viewbio.jsp?EID=571329), Dec 3, 2001 Surya, This improves performance, but can be quite dangerouse to write data without the transactional facility your EJB container provides. Anthony Re[2]: Joins in Entity Beans Author: Vincy Kalvar (http://www.jguru.com/guru/viewbio.jsp?EID=988302), Aug 23, 2002 As surya says he uses DAO's only for finders.Not to update,create.So it can't be that dangerous is my guess. test Author: henry lee (http://www.jguru.com/guru/viewbio.jsp?EID=489761), Sep 24, 2001 test How should singleton EJBs be implemented in a cluster ? Location: http://www.jguru.com/faq/view.jsp?EID=37838 Created: Apr 19, 2000 Modified: 2000-04-19 12:16:11.852 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Aravind Naidu (http://www.jguru.com/guru/viewbio.jsp?EID=12326 There is no such thing as a Singleton EJB. This design pattern cannot be achieved with EJB, an alternative solution to the problem using J2EE standards includes implementation using RMI or CORBA. Comments and alternative answers
I have to somewhat disagree with the answer regarding,... Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243), Jun 21, 2000 I have to somewhat disagree with the answer regarding, "...This design pattern cannot be achieved with EJB," and just make the suggestion that you could set your bean up so that there is only one istance of it in the EJB pool controlled by the container. In this case, if a client had a connection to this "Singleton"-like EJB bean, then any other client would have to wait. Use the maxBeansInFreePool and maxBeansInCache fields in the deployment descriptor. Or, for an entity bean, don't provide any create m... Author: Constantin Gonciulea (http://www.jguru.com/guru/viewbio.jsp?EID=124918), Aug 11, 2000 Or, for an entity bean, don't provide any create method, and make the find method return a fixed primary key. In this case you'd have to store the bean "manually" in the database. You cannot just narrow down the pool to one instance... Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362), Oct 11, 2000 You cannot just narrow down the pool to one instance and call it a solution, it is a hack. It does not work in a cluster, and still does NOT gurantee that the same physical instance will be used. Another flaw is that not all EJB containers allow you to control the pool at such a fine level and those that do provide minimums that are larger than 1. Singleton pattern with EJBs Author: Puppa Kononen (http://www.jguru.com/guru/viewbio.jsp?EID=490736), Sep 5, 2001 There is no way to implement a singleton pattern in a distributed environment without having a single point of failure. I think you can use reference storing to JNDI (or the Handle), but then all the requests for that EJB would be pointed at the same server, which might not be efficient. The only resources that are shown to all servers in a cluster are the JNDI tree and normally the database. Also the information between entity bean's that represent the same data is shared, so entity bean's are the first place where I would store 'singleton' information. Yes, there still issues to be solved (what happens if two EJB clients want to change the same data), but this way you can provide similar behaviour as in the singleton pattern. How do I connect to SQL Server 6.5 from J2EE for Windows? What changes should I have to do in the properties file? Can I use the JDBC-ODBC bridge?
Location: http://www.jguru.com/faq/view.jsp?EID=37845 Created: Apr 19, 2000 Modified: 2000-04-24 19:56:01.653 Author: John Zukowski (http://www.jguru.com/guru/viewbio.jsp?EID=7) Question originally posed by Sathya Narayanan (http://www.jguru.com/guru/viewbio.jsp?EID=31789 If you insist on initially using a database other than Cloudscape, you should carefully read and follow the instructions in the following J2EE RI documentation: • •
Configuration Guide Release Notes
How is the passivation of Entity beans Managed? Location: http://www.jguru.com/faq/view.jsp?EID=38317 Created: Apr 20, 2000 Modified: 2000-04-21 12:15:35.921 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by Sripada Srinivas (http://www.jguru.com/guru/viewbio.jsp?EID=23408 The passivation of Entity beans is managed by the container. To passivate an instance, the container first invokes the ejbStore() method for synchronizing the database with the bean instance, then the container invokes the ejbPassivate() method. It will then return the bean instance back to the pooled state. (Every bean has an instance pool.) There are two ways for transitioning an entity bean from the ready to the pooled state, by using the ejbPassivate() or ejbRemove() method. The container uses ejbPassivate() to disassociate the bean instance from the entity object identity, and uses ejbRemove() to remove the entity object. When the instance is put back into the pool, it is no longer associated with an entity object identity. The container can now assign the instance to any entity object within the same entity bean home. A bean instance in the pool can be removed by using unsetEntityContext(). A more thorough discussion can be found in the EJB 1.1 specification by Sun. Comments and alternative answers
The short answer is "by the container" :... Author: Gene De Lisa (http://www.jguru.com/guru/viewbio.jsp?EID=38746), Oct 9, 2000 The short answer is "by the container" :) Activation/passivation means different things to session beans and entity bean. In a stateful session bean, the container will persist the state in activate/passivate. This does not happen for entity beans.
Activation for an entity bean means "the container has just grabbed an anonymous instance of the entity class from the free pool and has associated it with an identity". Identity means a primary key stored in an EJBObject. Beans in the free pool have no valid state since they are not associated with an EJBObject (and therefore a primary key).There is no loading of state here. With BMP you load the state in ejbLoad; with CMP the container does it right before ejbLoad. Passivation for an entity bean means "the container is done with this instance and it is going back to being an anonymous member of the free pool". There is no saving of state here. With BMP you save the state in ejbStore; with CMP the container does it right after ejbStore. Take a look at the EJB spec 1.1 on page 102. Figure 23 shows this is a pseudo Harel state diagram. Also look at Figure 28, page 138 and Figure 29, page 139 for object interaction diagrams. To complete a transaction, which Transaction Attributes or Isolation Level should be used for a stateless session bean? Location: http://www.jguru.com/faq/view.jsp?EID=38749 Created: Apr 21, 2000 Modified: 2000-08-03 22:23:58.612 Author: Gene De Lisa (http://www.jguru.com/guru/viewbio.jsp?EID=38746) Question originally posed by Santosh Malpekar (http://www.jguru.com/guru/viewbio.jsp?EID=30121 [For example, I have a method transfer which transfers funds from one account to another account.] Vague question. Is the Session bean doing the DB work? I'll assume no. Let's say AtmEJB is a Session bean with the transfer method. Let's say AccountEJB is an Entity bean. Step 1: When the client invokes the transfer method you want that to be the transaction; i.e. "the transfer transaction". therefore you need to set the tx attribute of transfer to something that will make the container start a tx at the beginning of transfer and terminate it at the end of transfer. RequiresNew might be a good choice but you need to look at all your use cases not just this one. Step 2: The AccountEJB methods invoked from the transfer method need to have a tx attribute that allows them to be part of an ongoing tx. That means that deposit and withdraw cannot be RequiresNew! (that would suspend the transfer tx and run in its own tx). Look at the spec for these: there are 3 that meets the criteria for deposit
and withdraw in the transfer use case. Which one to use? What are the other use cases in which deposit and withdraw will be called? Find one that works for each one. Explain the different Transaction Attributes and Isolation Levels with reference to a scenario. Location: http://www.jguru.com/faq/view.jsp?EID=39161 Created: Apr 23, 2000 Modified: 2000-08-03 22:14:50.017 Author: Milind Sawant (http://www.jguru.com/guru/viewbio.jsp?EID=36835) Question originally posed by Santosh Malpekar (http://www.jguru.com/guru/viewbio.jsp?EID=30121 The Enterprise JavaBeans model supports six different transaction rules: •
TX_BEAN_MANAGED. The TX_BEAN_MANAGED setting indicates that the enterprise bean manually manages its own transaction control. EJB supports manual transaction demarcation using the Java Transaction API. This is very tricky and should not be attempted without a really good reason.
•
TX_NOT_SUPPORTED. The TX_NOT_SUPPORTED setting indicates that the enterprise bean cannot execute within the context of a transaction. If a client (i.e., whatever called the method-either a remote client or another enterprise bean) has a transaction when it calls the enterprise bean, the container suspends the transaction for the duration of the method call.
•
TX_SUPPORTS. The TX_SUPPORTS setting indicates that the enterprise bean can run with or without a transaction context. If a client has a transaction when it calls the enterprise bean, the method will join the client's transaction context. If the client does not have a transaction, the method will run without a transaction.
•
TX_REQUIRED. The TX_REQUIRED setting indicates that the enterprise bean must execute within the context of a transaction. If a client has a transaction when it calls the enterprise bean, the method will join the client's transaction context. If the client does not have a transaction, the container automatically starts a new transaction for the method. Attributes
•
TX_REQUIRES_NEW. The TX_REQUIRES_NEW setting indicates that the enterprise bean must execute within the context of a new transaction. The container always starts a new transaction for the method. If the client has a transaction when it calls the enterprise bean, the container suspends the client's transaction for the duration of the method call.
•
TX_MANDATORY. The TX_MANDATORY setting indicates that the enterprise bean must always execute within the context of the client's transaction. If the client does not have a transaction when it calls the enterprise bean, the container throws the TransactionRequired exception and the request fails.
Comments and alternative answers
Yes we can all read p 177-178 of the EJB spec. Where... Author: Gene De Lisa (http://www.jguru.com/guru/viewbio.jsp?EID=38746), Apr 28,
2000 Yes we can all read p 177-178 of the EJB spec. Where is the scenario the questioner asked for? Re: Yes we can all read p 177-178 of the EJB spec. Where... Author: Kalpeshkumar Soni (http://www.jguru.com/guru/viewbio.jsp?EID=916018), Jul 2, 2002 Nobody seems to paying attention to isolation levels ! Re: Yes we can all read p 177-178 of the EJB spec. Where... Author: sesha venkat (http://www.jguru.com/guru/viewbio.jsp?EID=1245960), May 26, 2005 Hi I still did not understand the difference between TX_REQUIRED and TX_SUPPORTS from the explanation given. Can anybody explain. Thanks in advance. Re[2]: Yes we can all read p 177-178 of the EJB spec. Where... Author: Giri B (http://www.jguru.com/guru/viewbio.jsp?EID=1248402), Jun 13, 2005 TX_REQUIRED A bean is going to participate in TX or a client call a Bean then that method should executed in the TX if client doesnot have the TX then Container will create the TX for that TX_SUPPORTS The client supports the TX to the method execution.If the client doesnot have any TX then the method will execute without TX Are there any good examples of how to handle one-to-many, many-to-one, and many-to-many entity bean relationships? Location: http://www.jguru.com/faq/view.jsp?EID=40120 Created: Apr 25, 2000 Modified: 2000-04-26 10:48:11.45 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Joe McDaniel (http://www.jguru.com/guru/viewbio.jsp?EID=5292 The EJB spec does not specify how to deal with relationships. You'll have to develop your own Java classes to handle these design patterns. Francesco Mondora points us to an IBM RedBook on EJB Development using VisualAge (chapter 10), The itso.bank.ejb.relation package includes two classes (ManyLink and SingleLink) that support implementing persistent one-to-many associations between entity beans depending on storing and retrieving primary or foreign key values in a database. The one-to-many relationships are mapped to backward pointing foreignkey references.
Class ManyLink implements the multi-value association end. Depending on the relation type parameter in the constructor, ManyLink supports an aggregation association (the parent controls the live cycles of its children) or a normal association. Class SingleLink is the single-valued inverse association end of the one-to-many relationship. Which IDEs are available that support EJB development? And are any free or low-cost? Location: http://www.jguru.com/faq/view.jsp?EID=40579 Created: Apr 26, 2000 Modified: 2000-04-26 10:57:05.156 Author: Keir Hansen (http://www.jguru.com/guru/viewbio.jsp?EID=38387) Question originally posed by DINESH DEWAN (http://www.jguru.com/guru/viewbio.jsp?EID=37190 We've been doing some review of WebGain's StructureBuilder 3.3, which supports a UML-to-Javacode cyclical development, and with its new "ejbCreate" facility, supports 1.0 and 1.1 EJB development. So far, we're thoroughly impressed. A little clunky/slow, but definitely worth investigating for lower cost (standard $395, enterprise $695) bean development. A fully functional demo is available at http://www.webgain.com/Products/Structure_Builder/. What is the most efficient approach for integrating EJB with JSP? Should the EJBs be invoked directly from within JSP scriptlets? Should the access take place from within Java beans? Or is it best to use custom tags for this purpose? Location: http://www.jguru.com/faq/view.jsp?EID=42963 Created: May 1, 2000 Modified: 2000-05-02 23:22:15.212 Author: Christopher Longo (http://www.jguru.com/guru/viewbio.jsp?EID=2166) Question originally posed by Sanjay Mistry (http://www.jguru.com/guru/viewbio.jsp?EID=17764 JSP scriptlet code should be minimal. Invoking EJB code directly on a JSP page results in many lines of code on your JSP page, including try...catch blocks to catch naming and finding exceptions. Using a standard JavaBean as an intermediary between the JSP page and EJB server cuts down on the amount of code needed to add to a JSP page, and promotes reuse. The JavaBean should be a simple wrapper around the EJB you are accessing. If you use a standard JavaBean you could also use the jsp:useBean tag to setup EJB parameters, such as the server URL and server security parameters. Custom tags are also an option. However, they require a lot more coding than a simple JavaBean wrapper. The point should be to rewrite as little code as possible while at the same time keeping the JSP scriptlet content as light as possible. Comments and alternative answers
See also How can my JSP page communicate with an EJB... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), May 29, 2000 See also How can my JSP page communicate with an EJB Session Bean?. Ok, fine. How about this: Your regular JavaBean creates... Author: Gene De Lisa (http://www.jguru.com/guru/viewbio.jsp?EID=38746), Aug 1, 2000 Ok, fine. How about this: Your regular JavaBean creates a Session bean. Where does it remove the Session bean? There is no "stopUsingBean" tag. You cannot rely on the finalizer. So, do you just wait for the session timeout? This is why I don't use the JavaBean intermediary. Simple. Have a method in your bean: public void... Author: Christopher Longo (http://www.jguru.com/guru/viewbio.jsp?EID=2166), Oct 12, 2000 Simple. Have a method in your bean: public void removeSession() { session.remove(); }
The Orionserver taglibs provide a really easy way using... Author: Mathias Bogaert (http://www.jguru.com/guru/viewbio.jsp?EID=202039), Dec 28, 2000 The Orionserver taglibs provide a really easy way using EJB's with JSP pages, and it is fast too. Download from: http://www.orionserver.com/tags/ejbtags/ What if I have JSP in one server(View), Servlet in... Author: Rangarajan Mangudi Parthasarathy (http://www.jguru.com/guru/viewbio.jsp?EID=347775), Mar 16, 2001 What if I have JSP in one server(View), Servlet in another server(Controller),EJB in another server(Model). Does it not improve the scalability of my application?. Give me some sample code if possible. How do you get a JDBC database registered with a JNDI name so that it can be accessed from an EJB? Location: http://www.jguru.com/faq/view.jsp?EID=42968 Created: May 1, 2000 Modified: 2000-08-24 18:58:56.376 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by David Bosschaert (http://www.jguru.com/guru/viewbio.jsp?EID=40641
The short answer is that it depends on which container you're using to some extent. The one thing that (should be) common in EJB 1.1 containers is that the ejb-jar.xml file's entry for that bean needs to contain a 'resource-ref' stanza, like so: jdbc/LocalDB2 javax.sql.DataSource Container The res-ref-name is the most interesting part. This is the JNDI name relative to the java:comp/env namespace. Hence, to get this connection you'd do (in your bean): Context context = new InitialContext(); DataSource source = context.lookup("java:comp/env/jdbc/LocalDB2"); which gives you a DataSource that you can call getConnection on. The other half of this is container specific and done at deployment time by a 'Deployer' or 'Assembler' (to use the rolenames specified by the EJB spec.) This can work very differently from one container to the next, but here are a couple of (abbreviated) examples. With Weblogic 5.1, you must define a connection pool in weblogic.properties, then edit the weblogic specific deployment descriptor (using the EJB Deployment tool) to associate the resource-ref specified in ejb-jar.xml with that connection pool. With Inprise Application Server 4.0, all of the parameters for the connection (JDBC driver, connection URL, etc.) are specified in the inprise specific deployment descriptor (also editable via their deployment tool). Other servers will have other ways of associating the resource-ref with a pre-defined connection pool. Comments and alternative answers
I would like to know how I get my existing JDBC da... Author: David Bosschaert (http://www.jguru.com/guru/viewbio.jsp?EID=40641), May 8, 2000 I would like to know how I get my existing JDBC database registered with JNDI so that I can use it as explained in this page. To give an example: I use the open source database InstantDB. Normally I would connect to it with: Class.forName("idbDriver"); Connection con = DriverManager.getConnection("jdbc:idb:c:\temp.prp");
How and where do I register my JDBC database in order to use it with EJB's through the JNDI? I would like to know how I get my existing JDBC database registered with JNDI. Author: Sribha Jain (http://www.jguru.com/guru/viewbio.jsp?EID=484436), Sep 26,
2001 I am SQL server as my database and weblogic 4.0 Application server How to manage fields that can have null values in a container-managed Entity bean? Location: http://www.jguru.com/faq/view.jsp?EID=43332 Created: May 2, 2000 Modified: 2000-05-02 12:53:12.198 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by guru guru (http://www.jguru.com/guru/viewbio.jsp?EID=39655 First of all, let's just set up a typical scenario: You are developing a product which allows a bank to sign up new customers online. You have done analysis and design and settled on having two tables: 'users' and 'account' (let's keep it simple). Each "user" will have a corresponding "account". The foreign key between the two will be the "account number". So, for the 'users' table, you have the following fields: firstName, lastName, userId, password, and acctNum. When this table is created in the database, it is empty. Now you must relate your EJB code to this table for persistence. For simplicity sake I will leave out the Session bean (which I would use to talk to my Entity bean), the Entity bean primary key class, and the home and remote interfaces. We have the UserBean: public class UserBean implements javax.ejb.EntityBean { public String firstName = null; public String lastName = null; public String userId = null; public String password = null; public long acctNum = -1; /** * Called by the container after the UserHome.create() is called */ public void ejbCreate(String userId, String password, long acctNum) { this.userId = userId; this.password = password; this.acctNum = acctNum; } ... ... public void setUserData(UserData data) throws RemoteExeption, UserDataException { this.firstName = data.getFirstName(); this.lastName = data.getLastName(); } ... ... }
Now, assuming you have the User (remote interface class), UserHome (home interface class), UserPK (primary key class) already done, you need to create the bean's deployment descriptor. Inside the deployment descriptor, you must specify the database table, 'users', which this bean will map to. Also, you must specify which fields from your bean map to which fields in the 'users' database table. (This is how the container knows which fields to persist between your bean and the database table.) Now assuming all code compiles and you have an EJB server up and running and you have deployed your bean, all you need to do is write a client (I would use a client to access a session bean, say 'CustomerSession', which would talk to my entity bean) to create a new user and pass in the userId, password and acctNum values, which will create the new user in the database. Notice the fields in the UserBean will now be set, but the firstName and lastName fields will still be set to null. These fields will still be empty in the database and will not change until these fields are set in the bean, since it is persisted. Now, call the setUserData(UserData data) method for setting the firstName and lastName, and these fields will now be set in the database and no longer be null. The container will handle the persistence of any fields which are set to null, just as it will handle any fields which are set to some meaningful value. Comments and alternative answers
NOT NULL Author: pei wang (http://www.jguru.com/guru/viewbio.jsp?EID=424597), May 18, 2001 How about if the lastname, firstname are defined as NOT NULL in user table? What will happen when the EJB try to persist itself the first time? How can I debug my EJB applications? Location: http://www.jguru.com/faq/view.jsp?EID=45681 Created: May 7, 2000 Modified: 2000-05-11 10:08:40.327 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Sanjay Mistry (http://www.jguru.com/guru/viewbio.jsp?EID=17764 This depends upon which EJB Container you are using. Borland's JBuilder 3.5, Foundation Edition allows you to debug any Java 2 application, including the Inprise Application Server, WebLogic Server and J2EE Reference implementation. You can download it free from www.borland.com/jbuilder. There are other IDE's out there including NetBeans/Forte www.sun.com/forte/ffj/ce/ that can also debug EJB. Comments and alternative answers
The IDE Visual Café has a unique remote debugging... Author: Christoph Krüger (http://www.jguru.com/guru/viewbio.jsp?EID=30208), May 16, 2000
The IDE Visual Café has a unique remote debugging feature which allows you to debug the EJB or any other Java class from your desktop while it is running on the Application Server. Unfortunately it's not freely available but you can get a 60 day unlimited trial version. Our Application Server is the Objectspace Voyager ... Author: Frank Falkenberg (http://www.jguru.com/guru/viewbio.jsp?EID=25357), Jun 13, 2000 Our Application Server is the Objectspace Voyager 3.3. To debug our EJB applications on this Application Server we are using a remote debugger (it is the Debug Enterprise from Metamata; see: http://www.metamata.com ). This debugger is not Application Server specific as many other products we tried to evaluate (if you are using BEA WebLogic you may have a much wider range of remote debug tools to choose from). To debug you compile your EJB source files with the metamata compiler 'mjavac' and deploy the class files including the automatically generated debuginfo class file in a JAR as you would normally do with your EJB application. When you start the Application Server, you can attach to the process of the server/container from the remote debug console and perform all standard debug actions as setting breakpoints, defining watches, stepping through your EJB code expression by expression etc. My impression is that this remote debugger is easy to use and improves our development process for EJB applications very much - b.t.w. we used mainly 'System.out.println' - debugging before. How can an applet talk directly with EJB? Location: http://www.jguru.com/faq/view.jsp?EID=46410 Created: May 8, 2000 Modified: 2000-05-09 08:36:22.113 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Sanjay Mistry (http://www.jguru.com/guru/viewbio.jsp?EID=17764 An applet must use the same procedure as any other Java class: it must use JNDI to locate the EJB Home Interface, then use RMI to talk with the Home Interface as well as the EJB itself. This means that the J2EE and/or JNDI and/or RMI classes need to be present in the applet's Java Virtual Machine. The easiest way to assure this is to use the latest Java Plug-in. Netscape 6, aka Mozilla, ships with the Java Plug-in. Other browsers have various problems with RMI and JNDI classes that are beyond the scope of this answer. Note, however, that it is not recommended to use EJB directly from applets, in part due to compatibility issues. Instead, you can use Servlets inside the application server to provide an HTML front-end that is assured to work on a much larger base of clients.
Comments and alternative answers
Has anyone used applet in Netscape with EJB an ? What... Author: Michael Chen (http://www.jguru.com/guru/viewbio.jsp?EID=278118), Dec 14, 2000 Has anyone used applet in Netscape with EJB an ? What do you do with the j2ee.jar, is it included as part of the archive? Why isn't it recommended to use EJB from applets? What... Author: Pratap Das (http://www.jguru.com/guru/viewbio.jsp?EID=129542), Mar 7, 2001 Why isn't it recommended to use EJB from applets? What are the compatibility issues that you mention? Also, if the users need a much more dynamic interaction with the GUI, wouldn't you still use an applet? Re: Why isn't it recommended to use EJB from applets? What... Author: Mark Bennetts (http://www.jguru.com/guru/viewbio.jsp?EID=445713), Jun 26, 2001 Dont forget that EJB communication uses RMI-IIOP protocols. A good reason for not performing direct Applet - EJB communication is because of firewalls that will block these protocols. It is much safer (and well recognised) to use basic HTTP/HTTPS between client and Web server, and then communicate to the EJB tier from the Web tier. Hope this helps. Keep in mind that the Java runtime that comes with... Author: John Zukowski (http://www.jguru.com/guru/viewbio.jsp?EID=7), Mar 8, 2001 Keep in mind that the Java runtime that comes with browser is Java 1.1-based, not Java 1.2+ based. Also, keep in mind that an untrusted applet can only communicate back to the server from which it came. You are basically forcing your users to download the Java Plug-in AND the J2EE classes if you want to use EJB in an applet. And, more then likely it will need to be signed... Instead, you should rely on some middleware to do the actual EJB communications. The best solution for applet to communicate with EJB... Author: harish ganesan (http://www.jguru.com/guru/viewbio.jsp?EID=347623), Mar 9, 2001 The best solution for applet to communicate with EJB will be through an intermediate servlet. The applet to servlet communication can be established as firts step. The servlet can act as EJB client. This type of architecture is easy to maintain and effectively deploy web applications. What is the best way of implementing a web application that uses JSP, servlet and EJB technologies all together following a Model View Controller (MVC) architecture? Location: http://www.jguru.com/faq/view.jsp?EID=48001 Created: May 11, 2000 Modified: 2000-06-21 11:05:30.729
Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by christophe hillegeer (http://www.jguru.com/guru/viewbio.jsp?EID=43669 [See the Sun J2EE Blueprints for "an integrated set of documentation and examples that describe and illustrate 'best practices' for developing and deploying componentbased enterprise applications using the J2EE platform" including some good architecture whitepapers and source code. -Alex] Hmm, 'Best Way' is a bit rough - there are several 'good' ways, and the usual set of trade-offs between them. (I'm a consultant - I have to start any answer with "It depends...", otherwise they revoke my whiteboard privileges) The main thing you need to keep in mind as you design this sort of a system is that you want the interface into the EJB's to be rather narrow: in any flow, the ideal is to call one EJB method (hopefully on a stateless session bean), and let it make calls to entities on your behalf, then hand back the data you need to display. How you display it depends: you can either embed beans on your JSPs and let the beans make that hopefully-one EJB call, or you can post to a servlet, let that make the call, then forward to the JSP for display. The second of these is more flexible and gives you more leverage to hide, change, and enforce your site's structure. The first, however, will be easier for developers new to this web thing to follow. Essentially, I'm saying that Entity beans are your model, your controller is Session beans (maybe with a bit of help from servlets or beans), and your JSPs, beans and servlets are your View. One thing to note here: this discussion strongly implies that your EJBs are capable of externalizing their state as some number of very simple 'value objects' (not EJBs themselves, just something we can pass back and forth). These value objects are probably tuned tightly to a workflow, and will be produced by that session bean. This way the traffic between the EJB (server) and the JSP/Servlet (client) is tuned to what the client needs, while the transaction load on the server is minimized. Comments and alternative answers
I have to disagree (somewhat) with the comment that... Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243), May 17, 2000 I have to disagree (somewhat) with the comment that "...your controller is Session beans...", because it really "depends" on the architecture of the system. The Session beans will not look up any Entity beans or invoke any methods on an Entity bean without a client invoking a method on the Session bean itself. In other words, the controller could be an independent Java application, or a C++ application using CORBA, or a combination of HTML/WML page with servlets, or another EJB application. The controller really takes on multiple forms depending on the architecture of the system. If I had a simple system constructed of EJB beans, with JSP's providing the interface between the client (web) and the application, then the
JSP's (actually servlets compiled from JSP) would be the controller. If I had an RMI application on another server talking directly to the Session beans of my server, then the RMI application is the controller. I am working on a large project using model view a... Author: Vibhu Srinivasan (http://www.jguru.com/guru/viewbio.jsp?EID=60278), May 31, 2000 I am working on a large project using model view architecture. Here goes my two cents worth of an architecture that has produced good results for us The architecure involves a MVC with the controllers being entity and session beans. We are moving away from using entity beans unless there are many transactions involved. These ejbs pass back value objects as specified in the blueprints by sun. We also use bulk accessor session beans which go directly to the database and also call some other session or entity beans. This is the model. Now about the controller and the view: • • •
• •
All the JSP's talk to servlets which are the controllers. The servlets control creation and setting various properties on the java beans. The java beans are broken to two kinds. 1. Data access beans 2. Presentation beans The servlets create the presentation beans which are tied to some screens . The JSPs only read information from the java beans.
Check out the blueprints from sun for some good analysis! Re: I am working on a large project using model view a... Author: Anupam De (http://www.jguru.com/guru/viewbio.jsp?EID=958113), Mar 15, 2003 I have a question - if you are using JSP/Beans combination, then the View model will be tying in the bean hard coding the data to the table with the html codes. How best to separate it out ? One I was thinking was with Hashtables/Array ? But I am looking or complete separation of the presentation layer from any code snippets of Java. I am using Apache Tomcat 4.0.1 J2EE architecture Author: Mindy Couleur (http://www.jguru.com/guru/viewbio.jsp?EID=1175354), Jun 1, 2004 I am new to J2EE and am wondering if you can expand on your answer a bit. I've noticed that much of the logic that I see in Servlets could go in EJB's. I'm wondering just how thin the servlet layer should be. I also would like to confirm some RMI logic
flow. As far as I understand..... JSP calls Servlet Remote interface then Servlet call EJB remote interface....reply goes back to servlet then servlet forwards to JSP for display. Is that considered the best way to separate the layers? Are there any JNDI tutorials? Location: http://www.jguru.com/faq/view.jsp?EID=50797 Created: May 17, 2000 Modified: 2000-05-17 14:07:17.49 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Yes, check out The JNDI Tutorial online and/or buy a copy of it here. What books cover JNDI (Java Naming and Directory Interface)? Location: http://www.jguru.com/faq/view.jsp?EID=50819 Created: May 17, 2000 Modified: 2000-05-17 14:17:58.483 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out The JNDI Tutorial. It's also available on the web. For other books that are relevant to JNDI, check out Are ther any books that provide decent JNDI coverage?. When does the container call my bean's ejbCreate / ejbPostCreate / ejbStore / ejbPassivate / ejbActivate / ejbLoad / ejbPassivate method? And what should I do inside it? Location: http://www.jguru.com/faq/view.jsp?EID=51577 Created: May 18, 2000 Modified: 2000-06-19 12:41:34.947 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) The lifecycle of an enterprise bean is the heart of the EJB system. Your bean is basically implemented as a set of callback methods. There are a lot of these methods, which can be confusing; however, the implementation of each one is actually quite straightforward. Most of the time you can get away with implementing only a few of them. Using Bean-Managed Persistence, each callback method ejbX means the obvious thing (usually "you must do X"). Using Container-Managed Persistence, • • • • • •
ejbCreate means "fill in your defaults" ejbPostCreate means "your primary key is now valid; keep initializing" ejbStore means "I'm about to store your data into the DB" ejbPassivate means "I just stored your data, and I'm about to passivate you" ejbActivate means "I just activated you, and I'm about to load in your data" ejbLoad means "I just loaded your data from the DB"
The following table is based on the EJB Spec 1.1, chapter 9, section 5. Section 9.4 and 9.5 has detailed descriptions of each of the callbacks; you should definitely read the spec, and use the table as a quick reference only.
Initialization:
Container-Managed Persistence Bean-Managed Persistence Client calls EJBHome create() Container calls ejbCreate() Bean fills in default values Bean creates representation in DB Container extracts field values from bean Container creates representation in DB Container creates a new Remote Object (Wrapper) Container calls ejbPostCreate() Primary Key is now valid Bean does more initialization Container creates a new EJB Instance Home returns a remote reference to client Passivating an active instance:
Container-Managed Persistence Bean-Managed Persistence Container calls ejbStore() Bean performs pre-storage cleanup Bean stores data into DB Container extracts container-managed fields Container stores data into DB Container calls ejbPassivate() Bean performs post-storage cleanup Activating a passive instance:
Container-Managed Persistence Bean-Managed Persistence Client calls business method of Remote Object (Wrapper) Container calls ejbActivate() Bean performs pre-activation initialization Container loads state from DB Container sets instance fields Container calls ejbLoad() Bean performs pre-load initialization Bean loads state from DB Remote Object calls business method of Bean Bean performs business logic Bean returns value to Remote Object
Remote Object returns value to client Comments and alternative answers
Passivate calls ejbStore! Author: Geraldo Xexeo (http://www.jguru.com/guru/viewbio.jsp?EID=524001), Jan 14, 2002 It is very annoying that to passivate an object for an BMP there is a call to ejbStore before the call to ejbPassivate. So, a naive ejbStore will make extra updates completely unnecessary in the database, as I see. Re: Passivate calls ejbStore! Author: Neo Gigs (http://www.jguru.com/guru/viewbio.jsp?EID=748386), Apr 26, 2002 Hi there, Let say i need to run a stored procedure calls inside a EJB (regardless CMP or BMP), should I just create a method call that fired the stored procedure or which area of the lifecycle? Here i provide my EJBean code, please help me to verify: import import import import import import import import
java.io.Serializable; java.ejb.*; java.sql.*; java.naming.*; java.util.*; weblogic.db.jdbc.*; NTConn.ConnSetup; db.UpdMainLedgIE;
public class UpdMainLedgIEBean implements EntityBean { // Initializes object references ConnSetup TestSetupConn; Connection conn; String url = "jdbc:oracle:[email protected]:1521:REL4"; UpdMainLedgIE local_UpdMainLedgIE; // Initializes variables private EntityContext ctx; private int iMainLedgPrin; private int iMainLedgInt; private int iMainLedgLPI; private int iMainLedgOC1; private int iMainLedgOC2; private int iMainLedgUappAmt; private int iMainLedgIISInt; private int iMainLedgIISLP1; private int iMainLedgIntClw; private int iMainLedgLPIClw; private int iTotUnchrgPrin;
private int iPrpdUduePrin; private String iLastUpdUsrId; private String iLastUpdBrchCd; public void setSessionContext(SessionContext ctx) { log("setSessionContext called"); this.ctx = ctx; } public void unsertEntityContext() { log("unsetSessionContext called"); this.ctx = null; } public void ejbActivate() { log("ejbActivate called: " + id()); } public void ejbPassivate() { log("ejbPassivate called: " }
+ id());
// Updates data public void ejbStore() { log("ejbStore called: " + id()); } // Return records from db public void ejbLoad() { log("ejbLoad called: " + id()); } // Insert new records public void ejbCreate() { log("ejbCreate called: " + id()); } // Prepare to run create method public void ejbPostCreate() { log("ejbPostCreate called: " + id()); } // For records remove purposes public void ejbRemove() { log("ejbRemove called: " + id()); }
// For logging purposes public void log(String s) { System.out.println(s); } // Return a string with the bean id private String id() { return "PK = " + (String) ctx.getPrimaryKey(); } private void cleanup(Connection con) { try { if (con != null) con.close(); } catch (Exception e) { log("Error closing connection: " + e); throw new EJBException(e); } } public void UpdateLedger(int r_iMainLedgPrin, r_int iMainLedgInt, int r_iMainLedgLPI, int r_iMainLedgOC1, int r_iMainLedgOC2, int r_iMainLedgUappAmt, int r_iMainLedgIISInt, int r_iMainLedgIISLP1, int r_iMainLedgIntClw, int r_iMainLedgLPIClw, int r_iTotUnchrgPrin, int r_iPrpdUduePrin, String iLastUpdUsrId, String iLastUpdBrchCd) { this.iMainLedgPrin = r_iMainLedgPrin; this.iMainLedgInt = r_int iMainLedgInt; this.iMainLedgLPI = r_iMainLedgLPI; this.iMainLedgOC1 = r_iMainLedgOC1; this.iMainLedgOC2 = r_iMainLedgOC2; this.iMainLedgUappAmt = r_iMainLedgUappAmt; this.iMainLedgIISInt = r_iMainLedgIISInt; this.iMainLedgIISLP1 = r_iMainLedgIISLP1; this.iMainLedgIntClw = r_iMainLedgIntClw; this.iMainLedgLPIClw = r_iMainLedgLPIClw; this.iTotUnchrgPrin = r_iTotUnchrgPrin; this.iPrpdUduePrin = r_iPrpdUduePrin; this.iLastUpdUsrId = iLastUpdUsrId; this.iLastUpdBrchCd = iLastUpdBrchCd; log("UpdateLedger called: " + id()); try { TestSetupConn = new ConnSetup; conn = TestSetupConn.MBSConn(); local_UpdMainLedgIE = new UpdMainLedgIE(iMainLedgPrin, iMainLedgInt,
iMainLedgOC2, iMainLedgIISLP1, iTotUnchrgPrin,
iMainLedgLPI, iMainLedgOC1, iMainLedgUappAmt, iMainLedgIISInt, iMainLedgIntClw, iMainLedgLPIClw,
iPrpdUduePrin, iLastUpdUsrId, iLastUpdBrchCd, conn); } catch (SQLException sqle) { log("One update transaction failed: " + id()); throw new EJBException(ejbE) } finally { cleanup(conn); } } }
Thanks Neo Exception in ejbPostCreate and rollback. Author: Ken Loh (http://www.jguru.com/guru/viewbio.jsp?EID=46975), Apr 7, 2005 It would be very helpful if there is an explanation on what would happen if there is an exception in ejbPostCreate. If the bean has a relationship with another bean, what would happen if the associated bean could not be created ? Would there be a rollback ? What's the difference between EJBHome, EJB Home, EJB Object, EJBObject and EJB (not to mention Home Interface and Remote Interface)? Location: http://www.jguru.com/faq/view.jsp?EID=51578 Created: May 18, 2000 Modified: 2000-05-18 20:36:36.409 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) The EJB spec is all about really bad naming decisions. First, an Enterprise JavaBean is not a JavaBean (but you already knew that). The "Home Interface" is actually a Factory Object. It is responsible for locating or creating instances of the desired bean, and returning remote references. When you write the source code for the EJB Home Interface, you must extend the interface EJBHome, and provide method signatures for all the desired create() and find() methods. An object that implements the Home Interface is automatically generated by the EJB Server tools. The "EJB Object", or Remote Object, is actually a Wrapper. It sits somewhere inside the container, between the client and your code. It is responsible for performing all the setup and shutdown tasks (like opening transactions, or restoring data state) immediately before and after your enterprise bean is called.
The "EJB Object" is generated by the EJB Server tools -- you don't have to write any part of it. However, you do have to write another interface, called the "Remote Interface" or the "EJBObject Interface," that extends interface EJBObject, and provides method signatures for all the business methods. The server automatically generates a Java class that implements the Remote Interface; it is this object that is registered with RMI, and a reference to it is returned by the Home Interface (which we now know is actually a Factory Object). The "EJB," or Enterprise Bean, ironically, is not the EJB Object (even though it is an EJB and it is an object). It doesn't even implement the EJBObject interface, nor does it implement the Remote Interface. Instead, it implements either the EntityBean interface or the SessionBean interface. It also must implement all the methods defined in the Remote Interface -- but it doesn't actually implement the interface (in the Java sense). This is unfortunate, since we cannot rely on the Java compiler to make sure we've implemented all the right methods. It must also implement one ejbCreate() method for each create() method in the Home Interface (as well as ejbFind()/find()). See what I mean about poorly chosen names? :-) Comments and alternative answers
Home is a interface where you provide all your business... Author: harikishan charagundla (http://www.jguru.com/guru/viewbio.jsp?EID=92970), Jul 3, 2000 Home is a interface where you provide all your business methods you want to provide to the client. Remote is the Interface where all Create Methods and FindbyPrimaryKey's and remove methods will be declared. EJB Bean the class, which implements these methods, when the user calls the methods in the remote Interface the corresponding methods will be called. The calling of the methods is taken care by the container which is residing in the EJB Server. Note: Even though you do not extend any of the interface which we have created previously we have to implement the methods of the interface, yes it looks amazing but it is EJB specification. Re: Home is a interface where you provide all your business... Author: JavaP P (http://www.jguru.com/guru/viewbio.jsp?EID=850304), Feb 12, 2005 HI HariKishan, Update the message. It might leads to a confusion for new EJB programmer. Thanks in advance. Sorry to say Hari that u have got the home and remote... Author: kishore_k_v k (http://www.jguru.com/guru/viewbio.jsp?EID=202022), Sep 10, 2000
Sorry to say Hari that u have got the home and remote mixed up.I for one rely on online help a lot to get more info.Please change it before someone new to ejb goes. Of Course I'm sure it was just another typographical error. Can the security context be passed between a web container (servlets/jsp) and an EJB container ? When the servlet calls an EJB I want its identity to be that of the original web client authenticated with a certificate. Location: http://www.jguru.com/faq/view.jsp?EID=53955 Created: May 22, 2000 Modified: 2000-08-13 16:38:04.872 Author: Siva Visveswaran (http://www.jguru.com/guru/viewbio.jsp?EID=46210) Question originally posed by Daniel Weimer (http://www.jguru.com/guru/viewbio.jsp?EID=25540 The whole issue of propagation of authentication context from client to the EJB server is still evolving - both in terms of the specification as well as vendor offerings. According to the current Java 2 specification (page 224): "the container is the authentication boundary between callers and components hosted by the caller. For inbound calls it is the container's responsibility to make an authentic representation of the caller identity available to the component". The JAAS 1.0 specification extends the types of principals and credentials that can be associated with the client but it is also evolving. Thus given the container implementation that is required to drive this whole thing, the answer depends on your app vendor - some like Weblogic (WLE), Websphere provide security plug-ins/SDKs that can enable the propagation. Other vendors are close behind. Check your vendor plug-in. Comments and alternative answers
Some vendors, like Pramati, provide a facility where... Author: Asit Padhi (http://www.jguru.com/guru/viewbio.jsp?EID=61648), Jul 18, 2000 Some vendors, like Pramati, provide a facility where the security credentials of the web client are first authenticated by the web container and when the Servlet calls the EJB components the same security context is passed on to the EJB container. Re: Some vendors, like Pramati, provide a facility where... Author: Nilesh Shah (http://www.jguru.com/guru/viewbio.jsp?EID=1810), Sep 19, 2002 Is this still true?. We are want to use Resin servlet engine at web layer and weblogic 7.0 at EJB layer. Can we pass security context from resin to weblogic?. Can JAAS help use here?. If we use weblogic at both layer that it passes the context.
Why is EJB better than Microsoft COM/DCOM/MTS/DNA ? Location: http://www.jguru.com/faq/view.jsp?EID=56727 Created: May 25, 2000 Modified: 2000-05-26 16:55:46.965 Author: Sharanya Vemu (http://www.jguru.com/guru/viewbio.jsp?EID=56479) Question originally posed by Varsha Shetty (http://www.jguru.com/guru/viewbio.jsp?EID=50958
The two primary architectures for distributed computing
are CORBA and Sun`s Enterprise JavaBeansTM. Some would argue that Microsoft`s Component
Object candidates, says, cobbled story to tell. DCOM exist critical
Model and Distributed COM are additional but Greenfeld disagrees. "DCOM may eventually become a server technology of importance," he "but right now, it`s a desktop technology together to have the appearance of a server Few, if any, large-scale implementations of or even aspire to enterprise-scale, missionoperations at this point."
are taking a almost
Most developers interviewed for this story wait-and-see attitude toward DCOM, while all have piloted or ran an implementation of CORBA or Enterprise JavaBeans. InformationWeek, December 13, 1999
side
"...a polarization in the market for servercomponents, with Microsoft on one side and EJB-focused vendors and users on the other.
While the still holds, heterogeneous,
co-existence and interoperability message IDC believes that EJB is well on the way to becoming a de facto standard for multiplatform environments"
Synopsis:
IDC, "Programmer Development Tools 1999 Worldwide Markets and Trends", April 1999
"Enterprise JavaBeans is definitely a strategic Schwab vice launch new quickly"...DCOM, on systems such as couldn't even applications"
direction for us" says Lisa Villareal, a president. "It's given us the ability to products and new channels very however, has one big weakness -- it only runs Microsoft's Windows NT, which remains far less reliable than other corporate operating Unix. Schwab, for instance, worried that it use DCOM for larger transactions and didn't consider it as a way of developing new Wall Street Journal, July 1999 Programmers using the Java and CORBA (common object request broker architecture)
programming COM 44
models outnumber those targeting Microsoft's programming model by nearly a 2-to-1 margin: percent to 24 percent. Forrester Research, Inc., July 1999
2000, with
Microsoft is scheduled to release Windows its EJB alternative, COM+ (Component Object Model), by year's end. Analysts say EJB is
ahead of
COM+ in adoption in the enterprise. PCWeek, July 25, 1999
It's a bit really nice
"So tallying up my numbers, EJB wins 8 to 1. one-sided, isn't it? But as I said, MTS was a prototype for EJB" Anne Thomas, Patricia Seybold Group; "Comparing MTS and EJB"; Distributed Computing, December 1998
Comments and alternative answers
The above is cribbed from ENTERPRISE JAVABEANSTM T... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), May 31, 2000 The above is cribbed from ENTERPRISE JAVABEANSTM TECHNOLOGY VS. COM+/MTS at Sun's EJB site . See also Sun's J2EE FAQ, Blueprints, and the various white papers at Sun's J2EE site and Sun's EJB site. Also, MTS does not support Object Persistence Author: Anoop Sehdev (http://www.jguru.com/guru/viewbio.jsp?EID=208040), Sep 17, 2000 Also, MTS does not support Object Persistence Being Java, EJB has the freedom of being platform ... Author: ravi kishore (http://www.jguru.com/guru/viewbio.jsp?EID=310013), Jan 23, 2001 Being Java, EJB has the freedom of being platform independent unlike MS DCOM/COM/MTS Is there a EJB Server available for Win98? Location: http://www.jguru.com/faq/view.jsp?EID=57292 Created: May 26, 2000 Modified: 2000-05-26 16:59:48.406 Author: Andrea Pompili (http://www.jguru.com/guru/viewbio.jsp?EID=51802) Question originally posed by Suresh Kuyilath (http://www.jguru.com/guru/viewbio.jsp?EID=52013 I installed Weblogic (4.5.1 and 5.1.0) in my computer with Win98 and it works perfectly (the only changes with respect to NT are that it doesn't use the Native interface for I/O connections and uses the standard socket implementation)... The only recommendation is that you must have a "powerful" machine with at least 128MB of RAM (better 192MB for 5.1.0) and a 400MHz processor (or above)... Anyway take a look at http://java.sun.com/products/ejb/tools1.html where Sun lists all the container and developement tool avaiable... Comments and alternative answers
The J2EE reference implementation from Sun works on... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), May 26, 2000 The J2EE reference implementation from Sun works on Windows 95 and Windows 98 as well as Windows NT. Download it from the Sun J2EE Product Page. You may have to edit the various .bat scripts to change the end-of-line character to be DOScompatible. You can also use JRun 3.0 from www.allaire.com. It... Author: Anoop Sehdev (http://www.jguru.com/guru/viewbio.jsp?EID=208040), Sep
17, 2000 You can also use JRun 3.0 from www.allaire.com. It works on variety of platforms including the Win 98 that you have asked for.. Is there a difference between container managed and bean managed persistence in terms of performance? Location: http://www.jguru.com/faq/view.jsp?EID=58125 Created: May 29, 2000 Modified: 2000-07-31 05:08:26.189 Author: Siva Visveswaran (http://www.jguru.com/guru/viewbio.jsp?EID=46210) Question originally posed by olivier rachon (http://www.jguru.com/guru/viewbio.jsp?EID=44117 [Short answer: with bean-managed persistence, you can optimize your queries and improve performance over the generalized container-managed heuristics. But container-managed persistence is very convenient, and vendors will be working to improve its performance as time goes on. -Alex] There is of course a difference as many CMPs use O-R mapping using metadata, which is slower than hardcoded queries (except vendors like GemStone that use a OODB which is slow anyway!) As always, a lot depends on the database schema. Given that CMP is still evolving, complex relationships (e.g.inheritance) and distributed transactions are not even supported by most EJB server vendors, leave alone performance. Having said that however, it does not seem right to compare BMP and CMP on performance because the motivation of CMP is precisely to relieve bean providers from thinking about this! In (J2EE) theory, a good CMP implementation should perform well in a production environment; in practice, except for a couple of vendors who have traditionally been strong in persistent storage space (e.g. Persistence Software, GemStone) you will not find great CMP support at this very moment. BMP offers a tactical approach while CMP is more strategic. Which implies that if you can work-around some (perhaps severe) limitations for near-term, there may be much to gain with CMP as the vendor offering matures. Given that RMI-IIOP does not support distributed garbage collection (unlike RMI-JRMP), do I need to do something explicitly to GC beans, or is it magically handled by the EJB framework? Location: http://www.jguru.com/faq/view.jsp?EID=60460 Created: May 31, 2000 Modified: 2000-05-31 10:21:02.894 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Alex McManus (http://www.jguru.com/guru/viewbio.jsp?EID=45888 (The lack of distributed GC was noted in the article "EJBs from a critical perspective".) It is the Containers' responsibility to handle distributed garbage collection. This is how EJB's were designed.
Looking at Stateful Session Beans (SFSB) or Entity Beans. When you write a SFSB, you must implement ejbActivate() and ejbPassivate(). Implementing these methods, mean that the container can passivate your bean, hence take it out of memory and store its state on disk or in a datastore somewhere. Whilst this article does take a hit at EJB, I believe that it is misleading in some sense and is outdated. Most of the pot shots that it takes about EJB products not supporting latest standards etc. are now obsolete as vendors such as Inprise, BEA, GemStone etc. have updated there products, it's a shame that he didn't get to review the beta products... The article also mentions the importance of "Dynamic Glue" which is not using statically generated stubs and skeletons. This is in fact possible with RMI-IIOP using DII (Dynamic Invoacation Interface), but he fails mention how this technology is used in building systems and why it is important. He says that it is why CORBA has failed, which is wrong. EJB is a logical extension of and most Containers are built on top of CORBA. He also mentions the overheads of intra-vm calls. This is something that most products provide optimizations for and something he clearly hasn't researched as this is a feature that CORBA ORB's have supported for quite a while. OK, so EJB doesn't support user-created threads. So how do I perform tasks asynchronously? Location: http://www.jguru.com/faq/view.jsp?EID=60468 Created: May 31, 2000 Modified: 2000-05-31 10:22:32.115 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Venkateswaran Muthuswamy (http://www.jguru.com/guru/viewbio.jsp?EID=47714 If your EJB does not need to know about the results of the aynch calls, then you can use JMS to send an asynch. message to another part of the system. Another alternative is to place the multithreaded code inside a CORBA or RMI server and call this from your EJB. Always keep site of the big picture, RMI and CORBA are part of J2EE and can be used as part of a 'J2EE' solution. There are some things that these technologies can do that EJB at this present time cannot. Comments and alternative answers
You can perform tasks asynchronously in two different... Author: Prasad Thammineni (http://www.jguru.com/guru/viewbio.jsp?EID=36479), Jun 14, 2000 You can perform tasks asynchronously in two different ways. 1. Using client-side threads - less complex. Kick off separate threads for each EJB access. At a later time join the threads on the client-side. 2. Using JMS - more complex. Define EJB methods with an additional parameter to indicate whether it is a asynchronous call or not. If called asynchronously, the EJB method would post a JMS message to a queue
and return immediately without doing any work. The JMS queue monitor would pick up the message and call the EJB by setting the asynchronous parameter to false. The EJB executes the method and returns the results. The queue monitor posts the results to an output queue being monitored by the client. Both JavaPro and Java Report had published articles on this topic recently. How should I set the CLASSPATH to develop EJBs? Location: http://www.jguru.com/faq/view.jsp?EID=60466 Created: May 31, 2000 Modified: 2000-06-09 03:06:23.66 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Rajshekhar Bashetti (http://www.jguru.com/guru/viewbio.jsp?EID=54152 This depends on the J2EE Application Server that you are using, but for all of them you will at least require all of the J2EE classes, which are downloadable as part of the J2EE Reference Implementation. Basically, take the JAR file from your implmentation and add it to your CLASSPATH. The easiest way is to just copy the file to the jre\lib\ext directory under your JDK directory. Comments and alternative answers
Can you give me the exact classpath to compile EJB... Author: Anil Vupputuri (http://www.jguru.com/guru/viewbio.jsp?EID=61459), Jun 2, 2000 Can you give me the exact classpath to compile EJB files? Thanking you. Anil. if you are using weblogic server you can set the e... Author: ravindra ch (http://www.jguru.com/guru/viewbio.jsp?EID=63594), Jun 3, 2000 if you are using weblogic server you can set the environmental variables by calling the "setenv" command at the command prompt. First of all, to "develop EJBs", you want... Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243), Jun 13, 2000 First of all, to "develop EJBs", you want to be able to do the following: 1. 2. 3. 4. 5.
compile your *.java files into *.class files create your serialized deployment descriptor run the ejb compiler on your serialized deployment descriptor file create a JAR file (including a Manifest file you've created) (recommended) check the JAR file for ejb compliance
Now, to do the compiling etc. you at least want your CLASSPATH to include the path to the Java compiler (javac), the path to the JAR utility, and the path to the EJB
compiler (should come with your EJB server - weblogic.ejbc for Weblogic). Of course you don't even have to set your CLASSPATH if you want to do each step at a command line - you will just have to give the full path to the compiler(s). need help in istalling java2 in windows XP Author: regy john (http://www.jguru.com/guru/viewbio.jsp?EID=536181), Nov 1, 2001 I installed it, for some reason my command prompt does not accept the commands for java2 such as javac. Thank you My session beans call other bean methods within a transaction. Using beanmanaged transactions, how should I take care of commit and rollback ? Location: http://www.jguru.com/faq/view.jsp?EID=62121 Created: Jun 2, 2000 Modified: 2000-09-12 15:55:36.874 Author: Siva Visveswaran (http://www.jguru.com/guru/viewbio.jsp?EID=46210) Question originally posed by Shalabh Nigam (http://www.jguru.com/guru/viewbio.jsp?EID=47481 There are two steps here: 1. Coding step: public class exBean implements SessionBean { EJBContext ec; javax.transaction.UserTransaction utxn; . . . utxn = ec.getUserTransaction(); utxn.begin();
}
// do all your txn stuff // getting DB connections, updates, other bean methods, etc. . . utxn.commit();
Note you have to begin a txn before opening dB connections and close connections before committing. 2. Deployment step: - Your app server must support a JTS for distributed txns. Most do. - Verify there is no conflict with the bean transaction properties in calling beans. Comments and alternative answers
Are there any issues if each of my bean methods uses... Author: Shalabh Nigam (http://www.jguru.com/guru/viewbio.jsp?EID=47481), Jul 3, 2000 Are there any issues if each of my bean methods uses a different DB Connection? What code changes do we need to make to upgrade our EJBs developed in Weblogic 4.5 to work under Weblogic 5.1? Location: http://www.jguru.com/faq/view.jsp?EID=65536 Created: Jun 9, 2000 Modified: 2000-06-09 20:43:12.272 Author: sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437) Question originally posed by Ramasubramani Subramani (http://www.jguru.com/guru/viewbio.jsp?EID=50068 BEA describes the differences at http://www.weblogic.com/docs51/classdocs/API_ejb/EJB_whatsnew.html#1024497 [See also http://www.jguru.com/jguru/faq/view.jsp?EID=319.] Is it possible to use Microsoft Access as the database while implementing entity beans? (Weblogic refuses to use the JDBC-ODBC bridge, since it needs a thin driver.) Location: http://www.jguru.com/faq/view.jsp?EID=70556 Created: Jun 10, 2000 Modified: 2000-06-16 08:15:11.171 Author: Prasad Thammineni (http://www.jguru.com/guru/viewbio.jsp?EID=36479) Question originally posed by Nilesh Bhattad (http://www.jguru.com/guru/viewbio.jsp?EID=62514 You are right about the JDBC-ODBC bridge. Since it does not support multi-threading it is not of much use. But you can find 3rd-party drivers in the market that will allow you to work with MS Access from EJBs. For a list of those drivers search for MS Access drivers from the following page: http://industry.java.sun.com/products/jdbc/drivers. What is an EJB Context? Location: http://www.jguru.com/faq/view.jsp?EID=64760 Created: Jun 13, 2000 Modified: 2000-06-13 08:22:48.343 Author: sairam kudapa (http://www.jguru.com/guru/viewbio.jsp?EID=64721) Question originally posed by Anuradha Chavan (http://www.jguru.com/guru/viewbio.jsp?EID=55611 EJBContext is an interface that is implemented by the container, and it is also a part of the bean-container contract. Entity beans use a subclass of EJBContext called EntityContext. Session beans use a subclass called SessionContext. These EJBContext objects provide the bean class with information about its container, the client using the bean and the bean itself. They also provide other functions. See the API docs and the spec for more details. How do you use the JNDI ENC to access JavaMail? Location: http://www.jguru.com/faq/view.jsp?EID=75066
Created: Jun 14, 2000 Modified: 2000-06-14 07:30:41.03 Author: Steven Lau (http://www.jguru.com/guru/viewbio.jsp?EID=72026) Question originally posed by Se Hee Lee (http://www.jguru.com/guru/viewbio.jsp?EID=21287 First of all, you have to create a javax.mail.Session like you would in accessing other resources such as JDBC connections:
InitialContext ctx = new InitialContext(); Session session = (Session) ctx.lookup("java:comp/env/TheMailSession"); After that, everything else is the same:
Message msg = new MimeMessage(session); ... ...
Depending on the application server you're using, you'll have different ways in setting up the ENC. Can I deploy a new EJB without restarting my server? (I'm using Weblogic.) Location: http://www.jguru.com/faq/view.jsp?EID=75637 Created: Jun 14, 2000 Modified: 2000-06-14 15:51:26.555 Author: Suja Rao (http://www.jguru.com/guru/viewbio.jsp?EID=62310) Question originally posed by Dakshinamurthy Ramachandran (http://www.jguru.com/guru/viewbio.jsp?EID=57231 Sure. WebLogic Server4.5 includes "hot deploy" feature that allow you to deploy, redeploy or undeploy EJBs while the Server is running, from the Weblogic Console. Deployment of EJBs made through the console are however lost when you restart the WebLogic Server. Comments and alternative answers
http://www.weblogic.com/docs45/techdeploy/hotdeplo... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Jun 21, 2000 http://www.weblogic.com/docs45/techdeploy/hotdeploy.html#deploy See: http://www.weblogic.com/docs45/techdeploy/hot... Author: Keith Schwartz (http://www.jguru.com/guru/viewbio.jsp?EID=27189), Jun 21, 2000 See: http://www.weblogic.com/docs45/techdeploy/hotdeploy.html if you're using weblogic 4.5 or: http://www.weblogic.com/docs51/techdeploy/hotdeploy.html
if you're using weblogic 5.1. How do I get a list of records (like from a database query) in EJB? Location: http://www.jguru.com/faq/view.jsp?EID=74357 Created: Jun 17, 2000 Modified: 2000-06-17 16:37:01.419 Author: sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437) Question originally posed by es goh (http://www.jguru.com/guru/viewbio.jsp?EID=59126 [Basically, you have to cheat. Make a custom data class that is not an EJB. Create a Vector or List containing objects of this type, one per EJB; fill the data objects with the same values as are in the EJBs. Then you can return this List, and it will be serialized through RMI, and magically reconsituted on the client side. -Alex] In your bean: public get Vector getCustomerData() { //Connect to DB //get result set Vector vector = new Vector(); //iterate and build CustomerData object and add to vector return vector; } In your bean's remote interface: public Vector getCustomerData() throws RemoteException; In both client and server: public class CustomerData implements java.io.Serializable { private long id; private String name; public CustomerData(long id, String name) { this.id = id; this.name = name; } public long getId() { return id; } public String getName() { return name; }
} In client (for ejb 1.0 lookups....)
Context ctx = getInitialContext(); //get initial context for lookup CustomerHome CustHome = (CustomerHome)ctx.lookup("Customer"); Customer customer = CustHome.create(); Vector v=customer.getCustomerData(); // iterate through v Comments and alternative answers
An Alternative to this could be using a method in the... Author: Anoop Sehdev (http://www.jguru.com/guru/viewbio.jsp?EID=208040), Sep 17, 2000 An Alternative to this could be using a method in the bean (e.g. ejbFindAllRecords). This method will return the Collection Primary Keys. Such a method in Bean will have a corresponsing findAllRecords in the home interface, that returns the collection of Remote Interfaces. On the client side, one needs to call the findAllRecords method from the home interface. Then iterate over the Collection returned that contains refernce to rhe Remote interface. You can get the Primary keys from the individual items in the Collections. One can pass this Primary key to a Session bean to get the list of all the records. Is this way OK. I have not tried this myself, but I am sure this can work... [I'm confused: are you talking about returning a list of primary keys, or a list of remote references? -Alex] In weblogic... Author: samson su (http://www.jguru.com/guru/viewbio.jsp?EID=232778), Apr 7, 2001 I don't know how this works in other environment... but in weblogic, when you declare the return type of findXXX() as "Enumeration", the deployer tool will auto generate an implementation that returns a couple of records. For example: public interface IBookHome extends EJBHome { public IBook findByPrimaryKey(CBookPK key) throws RemoteException, FinderException; public Enumeration findByAuthor(String name) throws RemoteException, FinderException; } ... in your client code: for (Enumeration en = home.findByAuthor("John"); en.hasMoreElements() ;) { book = (IBook) en.nextElement(); System.out.println("Name: " + book.get_name()); ......
}
JDBC 2 alternatives Author: ian pojman (http://www.jguru.com/guru/viewbio.jsp?EID=383696), Apr 20, 2001 Now that JDBC 2 is out, why create a CustomerData class? You can just use a connectionless ResultSet (RowSet or CachedResultSet). This way you can access your SQL data just as if you had just gotten the ResultSet from a hard-coded SQL query! Re: JDBC 2 alternatives Author: Anders Ericsson (http://www.jguru.com/guru/viewbio.jsp?EID=414347), May 3, 2001 The advantage of a CustomerData class over a connection less ResultSet is that the the CustomerData class descripes itself at development time. You could check types with the compiler. A Vector of CustomerData is also less complex. But using a connectionless ResultSet a have other advantage. How to setup access control in an EJB such that different application clients have different rights to invoke different methods in one EJB? Location: http://www.jguru.com/faq/view.jsp?EID=74503 Created: Jun 17, 2000 Modified: 2000-08-24 18:58:32.114 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by Wai MOK (http://www.jguru.com/guru/viewbio.jsp?EID=51540 To set up EJB access control you should do the following: 1) Set up the different users/groups and the methods each can have access to in your deployment descriptor. Note: You don't have to specify different methods for each user, you could also just specify different users to your entire bean - for example if you only wanted another component of your application talking to your bean. 2) Inside your client code, whenever you make your connection to the EJB server (to look up the bean) you need to specify the user and password, in order to set the Identity of the client: ... Properties p = new Properties(); .. p.put(Context.SECURITY_PRINCIPAL, "user"); p.put(Context.SECURITY_CREDENTIALS, "password"); ... 3) Inside your bean, you can do "extra" security checks (if you used 'Role'-based security): (Assuming you have a 'manager' role defined in your deployment descriptor and a user assigned to this role)
public int getAccountBalance(accountId) { if (ejbContext.isCallerInRole("manager")) return balance; } You could also enforce security to your EJB server. Using Weblogic, you could add the following to your weblogic.properties file: ... weblogic.password.user=password ... where "user" is the username you grant access for and "password" (after '=') is the password for this username. Much more detailed information on this topic can be found by reading the SUN specification of EJB at: http://www.java.sun.com/products/ejb/docs.html Where can I find ejb-jar.xml file templates? Location: http://www.jguru.com/faq/view.jsp?EID=77549 Created: Jun 17, 2000 Modified: 2000-06-17 16:40:19.925 Author: Luis F. Canals Samaniego (http://www.jguru.com/guru/viewbio.jsp?EID=66172) Question originally posed by Ming-fang Wang (http://www.jguru.com/guru/viewbio.jsp?EID=67927 There are examples of ejb-jar.xml files in Enterprise JavaBeans Specificiation v1.1. You can download it from http://java.sun.com/products/ejb/docs.html What's new in the EJB 2.0 specification? Location: http://www.jguru.com/faq/view.jsp?EID=80572 Created: Jun 20, 2000 Modified: 2000-06-20 11:43:25.782 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Read this article by Richard Monson-Haefel and find out! Comments and alternative answers
Following are the main features supported in EJB 2.0 *... Author: Mad Man (http://www.jguru.com/guru/viewbio.jsp?EID=311964), Feb 14, 2001 Following are the main features supported in EJB 2.0 * Integration of EJB with JMS * Message Driven Beans * Implement additional Business methods in Home interface which are not specific for bean instance. * EJB QL. How is persistence implemented in enterprise beans? Location: http://www.jguru.com/faq/view.jsp?EID=79536 Created: Jun 20, 2000 Modified: 2000-06-20 11:50:49.968 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by Dallas Dreyer (http://www.jguru.com/guru/viewbio.jsp?EID=58484 Persistence in EJB is taken care of in two ways, depending on how you implement your beans: container managed persistence (CMP) or bean managed persistence (BMP).
For CMP, the EJB container which your beans run under takes care of the persistence of the fields you have declared to be persisted with the database - this declaration is in the deployment descriptor. So, anytime you modify a field in a CMP bean, as soon as the method you have executed is finished, the new data is persisted to the database by the container. For BMP, the EJB bean developer is responsible for defining the persistence routines in the proper places in the bean, for instance, the ejbCreate(), ejbStore(), ejbRemove() methods would be developed by the bean developer to make calls to the database. The container is responsible, in BMP, to call the appropriate method on the bean. So, if the bean is being looked up, when the create() method is called on the Home interface, then the container is responsible for calling the ejbCreate() method in the bean, which should have functionality inside for going to the database and looking up the data. See the following FAQs, and the appropriate topics (listed on the main EJB FAQ page): • • •
What is a CMP bean? What is a BMP bean? When does the container call my bean's ejbCreate / ejbPostCreate / ejbStore / ejbPassivate / ejbActivate / ejbLoad / ejbPassivate method?
Can the primary key in the entity bean be a Java primitive type such as int? Location: http://www.jguru.com/faq/view.jsp?EID=81676 Created: Jun 20, 2000 Modified: 2000-08-15 06:31:10.893 Author: Keith Schwartz (http://www.jguru.com/guru/viewbio.jsp?EID=27189) Question originally posed by Steven Lau (http://www.jguru.com/guru/viewbio.jsp?EID=72026 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). Comments and alternative answers
A primary key is a class which provides a pointer into... Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243), Jun 21, 2000 A primary key is a class which provides a pointer into the database. It is used to obtain a remote reference to some entity bean. The only requirement for the primary key class is that it implements the java.io.Serializable interface. The value fields inside the primary key class can be of the Java primitive type, such as int, long, etc., as well as the type String. An example primary key class is below: import java.io.Serializable; public class UnknownPK implements Serializable { public int id; public String name = "";
public UnknownPK() {} public UnknonwPK(int id) { this.id = id; } public UnknownPK(int id, String name) { this.id = id; this.name = name; } public boolean equals(Object obj) { if (obj == null || !(ojb instanceof UnknownPK)) return false; else if ((((UnknownPK)obj).id == id) && (((UnknownPK)obj).name.equals(name)) return true; else return false; } public int hashCode() { return id + name.hashCode(); } public String toString() { return String.valueOf(id) + name; } } In the EJB 1.1 specification, primary keys have been... Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243), Jul 6, 2000 In the EJB 1.1 specification, primary keys have been defined as either simple or compound keys. Simple keys use a single field in the underlying datastore as a primary key, while compound keys use multiple fields. For simple primary keys, you don't need to wrap the field in a primary key class. This type of simple key is defined in the ejb-jar.xml deployment descriptor file: <entity> ... <prim-key-class>java.lang.String ... <primkey-field>userName
... For primary keys which map to primitive types, like int, the specification requires a primary key wrapper class. You can define these primay key types as compound primary keys. Note: Compound primary keys are used for multiple primary key fields as well as single primary key fields of primitive types. With compound primary keys, the EJB bean developer still has to define the primary key class. Compound primary keys are defined in the ejb-jar.xml file as follows: <entity> ... <prim-key-class>com.mypath.MyBeanPK ...
Are EJBs the best solution to make a component which have to manage a hardware device (modem, fax...) and provide access to them? Location: http://www.jguru.com/faq/view.jsp?EID=81868 Created: Jun 21, 2000 Modified: 2000-06-21 11:14:30.996 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Luis F. Canals Samaniego (http://www.jguru.com/guru/viewbio.jsp?EID=66172 I would suggest not, because these devices would probably be served best by Singleton Objects which could control the access to the device, and EJB does not support Singletons (in a standard way). A suggestion is to delegate the call from an EJB to another Object, possibily an RMI or CORBA object or even an a Java object implementing the Singleton pattern, possibly using JNI to use OS-dependent device access libraries. Comments and alternative answers
What is meant by a "Java Object"? Doesn't... Author: Benjamin McCartney (http://www.jguru.com/guru/viewbio.jsp?EID=109357), Aug 16, 2000 What is meant by a "Java Object"? Doesn't this need to be located outside the container? If so, what other objects beside RMI and CORBA are supported? How do I map a Date/Time field to an Oracle database with CMP? Location: http://www.jguru.com/faq/view.jsp?EID=82581 Created: Jun 21, 2000 Modified: 2000-06-21 11:15:54.741 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by Nilesh Bhattad (http://www.jguru.com/guru/viewbio.jsp?EID=62514 [Question continues: (I have written a wrapper class with the help of java.util.GregorianCalendar but it doesn't store time in Oracle database, whereas it stores Date without any problem.)]
Use the java.sql.Timestamp field to store your Date/Time in your entity bean, and then declare the corresponding field as 'Date' type in the Oracle database and it will work fine. You will have the "date" value and the "time" value preserved. Comments and alternative answers
DATE field in Oracle Author: Chetan Desai (http://www.jguru.com/guru/viewbio.jsp?EID=497154), Sep 14, 2001 Just a note that the DATE field in Oracle has a precision of only upto 1 second. So if you are working in milliseconds arena = beaware, precision will be lost !!! Re: DATE field in Oracle Author: V Shah (http://www.jguru.com/guru/viewbio.jsp?EID=226807), Dec 7, 2001 How would you compare two dates then ? I'm interested only in comparing "date" portion, not "Time" one. When I create two date objects at the same time and then store 'em in Oracle database, retrieve 'em back and compare , my comparision always false. What could be going wrong here ? Re[2]: DATE field in Oracle Author: Chetan Desai (http://www.jguru.com/guru/viewbio.jsp?EID=497154), Dec 8, 2001 How are you creating your two date objects? using the clone() method ? What criteria are you using to compare the date objects ? -Chetan. What is the difference between a Server, a Container, and a Connector? Location: http://www.jguru.com/faq/view.jsp?EID=82650 Created: Jun 21, 2000 Modified: 2000-06-21 12:34:13.769 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by Alex Chaffee PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=3 To keep things (very) simple: An EJB server is an application, usually a product such as BEA WebLogic, that provides (or should provide) for concurrent client connections and manages system resources such as threads, processes, memory, database connections, network connections, etc. An EJB container runs inside (or within) an EJB server, and provides deployed EJB beans with transaction and security management, etc. The EJB container insulates an EJB bean from the specifics of an underlying EJB server by providing a simple, standard API between the EJB bean and its container.
(Note: The EJB 1.1 specification makes it clear that it does not architect the interface between the EJB container and EJB server, which it says it left up to the vendor on how to split the implementation of the required functionality between the two. Thus there is no clear distinction between server and container.) A Connector provides the ability for any Enterprise Information System (EIS) to plug into any EJB server which supports the Connector architecture. See http://java.sun.com/j2ee/connector/ for more indepth information on Connectors. Does the J2EE reference implementation support the JMS? Location: http://www.jguru.com/faq/view.jsp?EID=82204 Created: Jun 21, 2000 Modified: 2000-07-11 22:37:14.122 Author: Andrea Pompili (http://www.jguru.com/guru/viewbio.jsp?EID=51802) Question originally posed by Richard Landon (http://www.jguru.com/guru/viewbio.jsp?EID=57892 The current release of J2EE (1.2.1) support EJB 1.1 specification so it doesn't implements JMS over EJB. This kind of EJB appears only in the EJB 2.0 specifications (available at http://java.sun.com/products/ejb/docs.html). At this time only BEA and Silverstream support this specification. Probably in the future more Vendors will follow this new specification, so wait... Comments and alternative answers
The current release of J2EE reference implementation... Author: Prasad Thammineni (http://www.jguru.com/guru/viewbio.jsp?EID=36479), Jun 22, 2000 The current release of J2EE reference implementation supports the JMS API only and does not come with a reference implementation of JMS. Thus, you can write EJB and non-EJB components to run in the J2EE reference implementation which access a 3rd-party JMS server using the JMS API. Orion supports JMS now, as well. Author: Joseph Ottinger (http://www.jguru.com/guru/viewbio.jsp?EID=37791), Jul 6, 2000 Orion supports JMS now, as well. JRun 3.0 also has started supporting the JMS featu... Author: Anoop Sehdev (http://www.jguru.com/guru/viewbio.jsp?EID=208040), Sep 17, 2000 JRun 3.0 also has started supporting the JMS feature. My client's connection times out when trying to retrieve a huge number of records (1000+) from an EJB server that uses CMP to a database. How can I resolve this? Location: http://www.jguru.com/faq/view.jsp?EID=83822
Created: Jun 25, 2000 Modified: 2000-08-24 18:57:16.711 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by Siva Busa (http://www.jguru.com/guru/viewbio.jsp?EID=60533 You need to make some adjustments to your EJB bean through the deployment descriptor. Modify the 'maxBeansInFreePool', 'maxBeansInCache' and 'idleTimeoutSeconds' fields until you get the results desired. The more you increase the value of 'maxBeansInFreePool' and 'maxBeansInCache', the less you should have to adjust the 'idleTimeoutSeconds' field. Comments and alternative answers
But if I increase these two numbers -- i.e. if I i... Author: Sanjeev Dhupkar (http://www.jguru.com/guru/viewbio.jsp?EID=8389), Jul 6, 2000 But if I increase these two numbers -- i.e. if I increase the value of the maxBeansInFreePool and maxBeansInCache --won't it hamper the performance of the application server i.e. wont the load on the application server be high? Yes, the load will be heavier on the server as it now... Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243), Jul 30, 2000 Yes, the load will be heavier on the server as it now has to manager additional references in the pool. However, everything is a tradeoff. Suppose, for example, if you are currently running maxBeansInCache=100 and maxBeansInFreePool=250, isn't this placing more load on the EJB server/container than if you used 50 and 150 respectively for these fields? You have to consider what is relevant to your application. On the other hand, depending on your server, you might not even notice the difference. For example, if your EJB server is executing SQL queries with your database and looking up 10,000 accounts in 0.043 seconds, is it much of a performance issue to have this value increase to say 0.32 seconds? Re: Yes, the load will be heavier on the server as it now... Author: manish jain (http://www.jguru.com/guru/viewbio.jsp?EID=525616), Oct 20, 2001 hiya.. Instead of doing all this changes in properties of app server. we can make small modification in the CMP bean itself. Try to use findInRange method this will fetch limited no of records from the database so ur application wont get blocked/timedout. i hope this will help u. regards manish jain Re[2]: Yes, the load will be heavier on the server as it now... Author: RAJEESHA np (http://www.jguru.com/guru/viewbio.jsp?EID=1036504), Dec 11, 2002 Wht is this findInRange method?Can i use it in ejb2.0 entity bean? What is "clustering" in EJB? Location: http://www.jguru.com/faq/view.jsp?EID=97603 Created: Jul 6, 2000 Modified: 2000-07-06 12:16:02.049
Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by surendrakumar ganta (http://www.jguru.com/guru/viewbio.jsp?EID=88738 Clustering refers to the ability of multiple load-balanced web servers to share session and entity data. It is a major feature of web application servers. Standardized support for clustering was one of the primary motivations behind the EJB spec. Clustering also applies to Servlet containers sharing HttpSession data (similar to EJB Session Beans). For more information, see the following questions on the Servlet FAQ: •
What servlet engines support clustering -- that is, sharing of session data across multiple load-balanced web servers?
Comments and alternative answers
what is clustering in EJB Author: K Sunitha (http://www.jguru.com/guru/viewbio.jsp?EID=464102), Jul 29, 2001 I thought clustering was only available in Weblogic, is it part of the ejb specification...? Re: what is clustering in EJB Author: Gaurav Sharma (http://www.jguru.com/guru/viewbio.jsp?EID=66767), Oct 31, 2001 No clustering is not specified in EJB specifications. It is a value added feature which most of the application server vendors provide. Different vendors may implement clustering in different ways. What is "hot deployment" in WebLogic? Location: http://www.jguru.com/faq/view.jsp?EID=97622 Created: Jul 6, 2000 Modified: 2000-07-06 12:37:25.632 Author: Keith Schwartz (http://www.jguru.com/guru/viewbio.jsp?EID=27189) Question originally posed by rajasekhar pokuri (http://www.jguru.com/guru/viewbio.jsp?EID=81912 "Hot Deployment" in weblogic is the act of deploying, re-depolying, and un-deploying EJBs while the server is still running (you don't have to shutdown the server to deploy an EJB). see: http://www.weblogic.com/docs51/classdocs/API_ejb/EJB_deployover.html#1054622 Comments and alternative answers
Also, the beans that are "Hot Deployed" are...
Author: Anoop Sehdev (http://www.jguru.com/guru/viewbio.jsp?EID=208040), Sep 17, 2000 Also, the beans that are "Hot Deployed" are not retained when the server is restarted. To retain the bean, it's entry has to be made in the weblogic.properties file. Regards Anoop Sehdev What is meant by the term "business logic"? Location: http://www.jguru.com/faq/view.jsp?EID=97696 Created: Jul 6, 2000 Modified: 2000-07-06 13:17:00.956 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Ramkumar Krishnamurthy (http://www.jguru.com/guru/viewbio.jsp?EID=89709 "Business logic" is just a fancy way of saying "code." :-) More precisely, in a three-tier architecture, business logic is any code that is not specifically related to storing and retrieving data (that's "data storage code"), or to formatting data for display to the user (that's "presentation logic"). It makes sense, for many reasons, to store this business logic in separate objects; the middle tier comprises these objects. However, the divisions between the three layers are often blurry, and business logic is more of an ideal than a reality in most programs. The main point of the term is, you want somewhere to store the logic and "business rules" (another buzzword) of your application, while keeping the division between tiers clear and clean. What are the deprecated EJB 1.0 conventions with respect to EJB 1.1? Location: http://www.jguru.com/faq/view.jsp?EID=97827 Created: Jul 6, 2000 Modified: 2000-07-09 06:32:26.732 Author: sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437) Question originally posed by Angus Mezick (http://www.jguru.com/guru/viewbio.jsp?EID=81798 This are the list of changes which can be found in Chapter 1 of EJB 1.1 specification It is as follows:EJB 1.1 attempts to provide a high degree of application compatibility for enterprise beans that were written for the EJB 1.0 specification. Principally, the deployment descriptor of EJB 1.0 based enterprise beans must be converted to the EJB 1.1 XML format. However, the EJB 1.0 enterprise bean code does not have to be changed or re-compiled to run in an EJB 1.1 Container, except in the following situations: •
•
The bean uses the javax.jts.UserTransaction interface. The package name of the javax.jts interface has changed to javax.transaction, and there have been minor changes to the exceptions thrown by the methods of this interface. An enterprise bean that uses the javax.jts.UserTransaction interface needs to be modified to use the new name javax.transaction.UserTransaction. The bean uses the getCallerIdentity() or isCallerInRole(Identity iden-tity) methods of the javax.ejb.EJBContext interface. These method were depre-
•
• • • •
cated in EJB 1.1 because the class java.security.Identity is deprecated in Java 2 platform. While a Container Provider may choose to provide a backward compatible imple-mentation of these two methods, the Container Provider is not required to do so. An enterprise bean written to the EJB 1.0 specification needs to be modified to use the new methods to work in all EJB 1.1. Containers. The bean is an entity bean with container-managed persistence. The required return value of ejbCreate(...) is different in EJB 1.1 than in EJB 1.0. An enterprise bean with con-tainer- managed persistence written to the EJB 1.0 specification needs to be recompiled to work with all EJB 1.1 compliant Containers. The bean is an entity bean whose finders do not define the FinderException in the meth-ods’ throws clauses. EJB 1.1 requires that all finders define the FinderException. The bean is an entity bean that uses the UserTransaction interface. In EJB 1.1, an entity bean must not use the UserTransaction interface. The bean uses the UserTransaction interface and implements the SessionSynchro-nization interface at the same time. This is disallowed in EJB 1.1. The bean violates any of the additional semantic restrictions defined in EJB 1.1 but which were not defined in EJB 1.0.
Are there any good hands-on EJB programming tutorials for WebLogic? Location: http://www.jguru.com/faq/view.jsp?EID=97780 Created: Jul 6, 2000 Modified: 2000-10-06 22:44:31.497 Author: santosh chakrapani (http://www.jguru.com/guru/viewbio.jsp?EID=97772) Question originally posed by zhuogang li (http://www.jguru.com/guru/viewbio.jsp?EID=88190 You can find very cool hands-on tutorial on EJB on WebLogic at http://www.weblogic.com/docs51. Here you can also find extensive documentation on how weblogic supports the complete J2EE family. Can I specify specific WHERE clauses for a find method in a CMP Entity Bean? Location: http://www.jguru.com/faq/view.jsp?EID=97806 Created: Jul 6, 2000 Modified: 2000-07-07 06:57:18.246 Author: sachin mahishi (http://www.jguru.com/guru/viewbio.jsp?EID=4437) Question originally posed by Vijay Anand (http://www.jguru.com/guru/viewbio.jsp?EID=91574 The EJB query language is totally vendor specific in EJB1.1. It is being standardized in 1.2. Yes, you can specify the where clause for a find method. This is the example for EJB's deployed on weblogic:
findBigAccounts(double balanceGreaterThan): "(> balance $balanceGreaterThan)" where balance maps to some field in the table. Comments and alternative answers
Where should this line appear? Author: samson su (http://www.jguru.com/guru/viewbio.jsp?EID=232778), Apr 7, 2001 Would you tell me in detail where this line should appear? I always think WLQL is too powerless... I spent several hours to find a way to do a case-insensitive "LIKE" operation but finally give up (I can convert @0 to uppercase with @0.toUpperCase(), but no way to wrap the SQL field name with SQL UPPER() function). The document is very short and there are even errors in it. Is there any way in weblogic ejb tool to specify customized standard SQL statement? It's more flexible. Thanks Yes, in EJB 2.0 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Dec 12, 2001 EJB 2.0 standardizes EJB-QL, which looks remarkably like SQL, for use inside the DD for CMP entity beans. That way you can have finder methods in the home interface that get the SQL automatically generated based on the content of the EJBQL. Can an EJB handle (RMI remote reference) be stored in an HttpSession? Location: http://www.jguru.com/faq/view.jsp?EID=97963 Created: Jul 7, 2000 Modified: 2000-07-09 06:39:45.243 Author: David Garcia (http://www.jguru.com/guru/viewbio.jsp?EID=17915) Question originally posed by David Garcia (http://www.jguru.com/guru/viewbio.jsp?EID=17915 [Note: My HttpSessions are persistent (disk swap), so if the handle is not serializable I will have troubles when the HttpSession is restored. ] Test result: I have used the handle for locating local and remote EJB. I have no problem about storing the handle inside the HttpSession and swapping the HttpSession. However if some problem arise about the swap of the HttpSession, you may could keep the HttpSession in memory. Test conditions: BEA Weblogic 4.5.1 (uses EJB 1.0 and allow keep HttpSessions in memory). Windows NT 4.0 Observations: I'm a little surprised about the test since I keep in mind that handles could only be used for locating local EJB's not remote ones (wrong?). Comments and alternative answers
You can refer to the url below for more info and a... Author: kishore_k_v k (http://www.jguru.com/guru/viewbio.jsp?EID=202022), Sep 11, 2000 You can refer to the url below for more info and a clear picture on this topic although
i think you know the answers. http://www.weblogic.com/docs51/classdocs/API_ejb/EJB_design.html#1022000 What is the initial context factory for sun's EJB reference implementation, and how is the initial context url specified? I always see the code fragment "InitialContext ctx = new InitialContext();" but where are the initial properties specified for this to work? Location: http://www.jguru.com/faq/view.jsp?EID=98374 Created: Jul 7, 2000 Modified: 2000-07-09 06:27:55.491 Author: K J (http://www.jguru.com/guru/viewbio.jsp?EID=98373) Question originally posed by Juan Rodriguez (http://www.jguru.com/guru/viewbio.jsp?EID=18476 When you are getting an initial context from outside of the EJB Container, you must specify the properties for the initial context. These properties include the InitialContextFactory class, the url of the server, and possibly authentication parameters. These properties can either by created programatically using a java.util.Properties object, or can be loaded at runtime from the jndi.properties file in the classpath. If you are using Sun's J2EE reference implementation in developing and deploying EJBs, you are most likely including the J2EE.jar file in your classpath, which is located in %J2EE_HOME%\lib\. If you look inside of this jar file, you will notice that in the root of the jar file there is a jndi.properties file. This file sets up the initial context properties for the Sun J2EE reference implementation. This is why you can just make a call such as: Context ctx = new InitialContext(); without setting up the initial context properties, when using the Sun reference platform. If you use any other J2EE Application server, you will be required to set up those properties. Comments and alternative answers
It'd be nice to have an example of how to set the ... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Jul 9, 2000 It'd be nice to have an example of how to set the properties from the command line... (hint hint) How can I write EJBs that will run (unmodified) in any EJB-Container? What do I have to pay attention to? Location: http://www.jguru.com/faq/view.jsp?EID=99739 Created: Jul 10, 2000 Modified: 2000-07-11 14:57:21.311 Author: Archana Karnik (http://www.jguru.com/guru/viewbio.jsp?EID=68139) Question originally posed by Aladin Sindbad (http://www.jguru.com/guru/viewbio.jsp?EID=83931
EJB containers are provided by App servers like Weblogic, Websphere etc. EJB specification does not assure any interoperability between different App servers , in turn between containers generated by app servers. When writing EJBs, do not use any vendor specific packages. Stick to javax packages (as per EJB spects). If you observe this rule, your EJB s should run on any App server. Also, check EJB 2.0 spects. They define minimum interoperability standards between app servers using RMI - IIOP. But I did not find whether it's mandatory for the vendors or not. I am waiting for the final EJB 2.0 spec to be released. Comments and alternative answers
I'm not sure why the answer to this question dwells... Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644), Jul 14, 2000 I'm not sure why the answer to this question dwells on interoperability, as my reading of the question is purely portability. At any rate: other things to be carefull of for portability: 1. With CMP entity beans, be careful of how you map SQL types to Java types: WebLogic, at least, is pretty touchy here. 2. If you're lucky enough to be using a container whose CMP can handle dependant ('value') objects, don't use that feature - it's not at all portable in EJB 1.1 (2.0 is much better, but much different) 3. As the above points imply, BMP might tend to be much more portable. Make sure that you do datasource lookups by the spec, though, and you might want to think about making the datasource JNDI name (the whole shot: "java:/comp/env/jdbc/DataSourceName") an environment entry (I've run into bugs where containers weren't putting datasources in the spec-ordained "java:/comp/env/jdbc" namespace 4. Make sure you use the ejb-reference deployment descriptor stuff, don't use a client-style lookup from an EJB 5. Stick with the spec, even if you're using a server that allows more fredom. Don't use threads, don't read the filesystem directly, etc. (Some containers will let you get away with some of these) I've got some CMP beans that will run in Weblogic and IAS, getting there was a bit of an adventure. Re: I'm not sure why the answer to this question dwells... Author: Arun Balaji (http://www.jguru.com/guru/viewbio.jsp?EID=119257), Aug 10, 2001 Just to add to Dan's post - you should also consider issues like concurrency which is not laid out in EJB 1.1. While containers like Weblogic5.1 use pessimistic concurrency, others like Websphere use optimistic. You may have to plug in
versioning in your code to do staleness checks. How can a EJB talk to legacy applications written in ILE/RPG without using the IBM java toolbox? Location: http://www.jguru.com/faq/view.jsp?EID=100504 Created: Jul 12, 2000 Modified: 2000-07-18 01:44:01.291 Author: Zack Li (http://www.jguru.com/guru/viewbio.jsp?EID=100500) Question originally posed by Revathy Subramani (http://www.jguru.com/guru/viewbio.jsp?EID=89892 The short answer would be waiting for the Connectors. See http://java.sun.com/j2ee/connector for details. Comments and alternative answers
I think EJB2.0 spec has a concept of Connector which... Author: Asit Padhi (http://www.jguru.com/guru/viewbio.jsp?EID=61648), Jul 18, 2000 I think EJB2.0 spec has a concept of Connector which allows EJB's to interface with Legacy Systems Re: I think EJB2.0 spec has a concept of Connector which... Author: Abhay Kulkarni (http://www.jguru.com/guru/viewbio.jsp?EID=469627), Aug 6, 2001 With J2EE Connector architecture one can write EJB that can interface with Legacy system, but on the other side it is the requirment that * the Legacy system must provide a J2EE Connector compliant Resource Adater * that is plugabble in EJB component. If there is a method in an Entity EJB that does not modify the bean's data (read only), can I specify that load() and store() methods should not be called before and after the call to this method? Location: http://www.jguru.com/faq/view.jsp?EID=101301 Created: Jul 13, 2000 Modified: 2000-07-18 03:24:40.017 Author: Prasad Thammineni (http://www.jguru.com/guru/viewbio.jsp?EID=36479) Question originally posed by Corneanu Dan (http://www.jguru.com/guru/viewbio.jsp?EID=41082 The EJB 1.1 specification does not define any such business method contracts that you can use as read-only methods (methods which do not call ejbLoad() and ejbStore()). Application servers like WebSphere provide you with an ability to specify beans as read-only. When flagged as read-only in the bean deployment descriptor, WebSphere optmizes the database access and the use of transaction control mechanisms. Comments and alternative answers
the load and store method is only called if the de... Author: Asit Padhi (http://www.jguru.com/guru/viewbio.jsp?EID=61648), Jul 18, 2000 the load and store method is only called if the declarative transaction attribute is attched with it.Thats where the container reads the transaction attributes from the deployment descripter and calls the call back method ejbload and ejbstore .Because EJB 1.1 spec only talks about declarative transaction attributes for Entity beans methods ,for read only method declare "Not supported" while defining the transaction attributes for this read only method.Then ejbLoad and ejbStore method will not be called by the container Unfortunately the answer is no - the state machine... Author: Siva Visveswaran (http://www.jguru.com/guru/viewbio.jsp?EID=46210), Jul 18, 2000 Unfortunately the answer is no - the state machine for the callback methods is not user configurable. However, some vendors make some extensions/optimizations. For example, in Weblogic provides a isModified method for CMP that is called before a store. If the method returns TRUE then ejbStore will be called. The bean provider assumes responsibility for data integrity in this situation. If unspecified (by bean provider) then the Weblogic container will always do ejbStore. In Weblogic there's an option that might help Author: samson su (http://www.jguru.com/guru/viewbio.jsp?EID=232778), Apr 7, 2001 In weblogic's ejb deployer tool, goto "optimization" page, clear "update at the end of each transaction" (not exactly... but very clear). Thus, when your entity bean is mapped to a readonly stuff (such as a VIEW), there should be no "view not updatable" exception when you perform readonly operations such as findByPK... (if you leave this option checked, this exception would occur even if you were performing readonly operations, because container will always try to ejbStore() after any transaction, including a simple SELECT) How do I decide between Enterprise Java Beans (EJB), Remote Method Invocations (RMI), and CORBA? Location: http://www.jguru.com/faq/view.jsp?EID=101761 Created: Jul 13, 2000 Modified: 2002-10-09 12:20:24.965 Author: Prasad Thammineni (http://www.jguru.com/guru/viewbio.jsp?EID=36479) Question originally posed by Srikanth Rao (http://www.jguru.com/guru/viewbio.jsp?EID=80613 The following article desribes RMI, EJB and compares them. Deciding whether to use RMI, CORBA or Enterprise JavaBeans
[Alex: the article isn't available at all, but it can still be found here. Big thanks to Peter Alzheimer] Comments and alternative answers
The article is not there Author: Roger White (http://www.jguru.com/guru/viewbio.jsp?EID=726964), Jan 19, 2002 the link to the article is dead Can you point to another source? Link is not working. Author: Muhammad Ahmed Khan (http://www.jguru.com/guru/viewbio.jsp?EID=903210), Jun 4, 2002 The link is dead for this question. Accessed on June 05, 2002. 02:41 am
Re: Link is not working. Author: Peter Alzheimer (http://www.jguru.com/guru/viewbio.jsp?EID=1009379), Oct 8, 2002 http://web.archive.org/web/20010817004120/www.csd.uu.se/~d96cgr/CarRentalServlet/ejb/RMIvsEJ Which, if any, of the automatically generated stub & skeleton class files does one need to include in a JAR file to be used when creating stand-alone clients? (I would like to create a client-side jar file which contains only the class files actually needed by the client.) Location: http://www.jguru.com/faq/view.jsp?EID=105016 Created: Jul 18, 2000 Modified: 2000-08-11 12:14:09.972 Author: Siva Visveswaran (http://www.jguru.com/guru/viewbio.jsp?EID=46210) Question originally posed by keith hawkins (http://www.jguru.com/guru/viewbio.jsp?EID=83055 The answer is really not that generic as one may like to believe! Basically what a client needs to invoke the services of an EJB layer are: • •
locate the home interface (using a JNDI SPI) & invoke methods of the bean instances (over IIOP). Depending on the vendor (e.g. IONA builds JNDI over CORBA) the actual files will vary. You have to check with your vendor. definitions of serializable objects that are returned to client due to network considerations (instead of object references).
[Can someone please provide examples, for a specific EJB server if need be?] See also: •
What classes does a client application need to access EJB? (hmm, kind of redundant, oops :-)
Comments and alternative answers
Dear friend For RMI clients (standalone) all you ...
Author: sharad chaudhary (http://www.jguru.com/guru/viewbio.jsp?EID=62937), Jul 24, 2000 Dear friend For RMI clients (standalone) all you require is to copy your stub (generated using rmic) and the remote interface (wherein you define the remotely invokable methods) to your client directory, or jar it along with the client implementation of your program. Thus you require 3 things only.. 1)stub 2)remote Interface 3)client implementation Hope this solves your problem.. Sharad Please show me an example of an Entity Bean that accesses more than one database table, using BMP. Location: http://www.jguru.com/faq/view.jsp?EID=105215 Created: Jul 18, 2000 Modified: 2000-08-09 20:09:15.717 Author: Asit Padhi (http://www.jguru.com/guru/viewbio.jsp?EID=61648) Question originally posed by Mohan Raj (http://www.jguru.com/guru/viewbio.jsp?EID=66168 here is the total code of an entity bean that uses multiple table using BMP
package com.orillion.india.nds.ejb.entity; /*Enterprise Bean instance can throw javax.ejb.EJBException or * java.lang.RuntimeException to its container to report that the invoked * business method or callback method could not be completed because of an * unexpected error (e.g. the instance failed to open a database connection). */ import java.rmi.RemoteException; import javax.ejb.*; import java.sql.*; import javax.sql.*; import java.util.*; import javax.naming.*; public class CableEntityBean implements javax.ejb.EntityBean { public public public public public public public
java.lang.Integer java.lang.String java.lang.String java.lang.String java.lang.Integer java.lang.String java.lang.String
cableId; cabName; cabType; cabLongName; vendorId; partNum; actualState;
public java.sql.Date actualStateDate; public java.lang.String actualSubState; public java.util.Vector conCat = new Vector(); private EntityContext entityContext = null; private Connection con = null; private String dbName = "java:comp/env/jdbc/NidDB3.0";
//Place your business methods here. public Integer getCableId(){ return cableId; } public java.lang.String getCabName(){ return cabName; } public java.lang.String getCabType(){ return cabType; } public java.lang.String getCabLongName(){ return cabLongName; } public java.lang.Integer getVendorId(){ return vendorId; } public java.lang.String getPartNum(){ return partNum; } public java.lang.String getActualState(){ return actualState; } public java.sql.Date getActualStateDate(){ return actualStateDate; } public java.lang.String getActualSubState(){ return actualSubState; } public java.util.Vector getConCat() { return conCat; } public void setAllValues(String cabName,String cabType,String cabLongName,
Integer vendorId,String partNum,String actualState, java.sql.Date actualStateDate,String actualSubState,Vector Concatenation){ this.cabName = cabName; this.cabType = cabType; this.cabLongName = cabLongName; this.vendorId = vendorId; this.partNum = partNum; this.actualState = actualState; this.actualStateDate = actualStateDate; this.actualSubState = actualSubState; if(Concatenation !=null){ this.conCat =Concatenation; } } public java.lang.Integer ejbCreate(java.lang.String cabName, java.lang.String cabType, java.lang.String cabLongName, java.lang.Integer vendorId, java.lang.String partNum, java.lang.String actualState, java.sql.Date actualStateDate, java.lang.String actualSubState,Vector conCatenation) throws javax.ejb.CreateException { this.cableId = getCableIdFromDB(); this.cabName = cabName; this.cabType = cabType; this.cabLongName = cabLongName; this.vendorId = vendorId; this.partNum = partNum; this.actualState = actualState; this.actualStateDate = actualStateDate; this.actualSubState = actualSubState; try { makeConnection(); insertRow(cableId, cabName, cabType, cabLongName, vendorId, partNum, actualState, actualStateDate, actualSubState);
if(conCatenation != null) { this.conCat =conCatenation; insertIntoConcatenation(cableId,conCatenation); } //System.out.println("able to ceate record" +this.cableId + this.cabType ); } catch (Exception ex) { throw new EJBException("ejbCreate: " + ex.getMessage()); } finally { closeConnection(); } return cableId ; } public void ejbPostCreate(java.lang.String cabName, java.lang.String cabType, java.lang.String cabLongName, java.lang.Integer vendorId, java.lang.String partNum, java.lang.String actualState, java.sql.Date actualStateDate, java.lang.String actualSubState, Vector conCatenation) throws javax.ejb.CreateException { } //FindByPK method public Integer ejbFindByPrimaryKey(Integer primaryKey) throws javax.ejb.FinderException { try { makeConnection(); if (selectByPrimaryKey(primaryKey)) { return primaryKey; } else { throw new ObjectNotFoundException ("Row for id " + primaryKey + " not found."); } } catch (Exception ex) {
throw new EJBException("ejbFindByPrimaryKey: " + ex.getMessage()); } finally { closeConnection(); } } //Implementing EntityBeanInterface methods..... public void setEntityContext(EntityContext entityContext) throws javax.ejb.EJBException, java.rmi.RemoteException { this.entityContext = entityContext; } public void unsetEntityContext() throws javax.ejb.EJBException, java.rmi.RemoteException { this.entityContext = null; } //Remove Methods.... public void ejbRemove() throws java.rmi.RemoteException, javax.ejb.EJBException, javax.ejb.RemoveException { try { makeConnection(); deleteRow(cableId); } catch (Exception ex) { throw new EJBException("ejbRemove: " + ex.getMessage()); } finally { closeConnection(); } } public void ejbActivate()
throws javax.ejb.EJBException, java.rmi.RemoteException { cableId = (Integer)entityContext.getPrimaryKey(); } public void ejbPassivate() throws javax.ejb.EJBException, java.rmi.RemoteException { closeConnection(); cableId =null; } public void ejbLoad() throws javax.ejb.EJBException, java.rmi.RemoteException { try { makeConnection(); loadRow(); } catch (Exception ex) { throw new EJBException("ejbLoad: " + ex.getMessage()); } finally { closeConnection(); } } public void ejbStore() throws javax.ejb.EJBException, java.rmi.RemoteException { try { makeConnection(); storeRow(); } catch (Exception ex) { throw new EJBException("ejbStore: " + ex.getMessage()); } finally { closeConnection(); } } //-----end of implementation-----------
//Serialization of BeanObject is to be done here.....// private void writeObject(java.io.ObjectOutputStream out) throws java.io.IOException { //write non-serializable attributes here... out.defaultWriteObject(); } private void readObject(java.io.ObjectInputStream in) throws java.io.IOException, ClassNotFoundException { //read non-serializable attributes here ... in.defaultReadObject(); } // serialization done /// /*********************** Database Routines *************************/ private void makeConnection() throws NamingException, SQLException { InitialContext ic = new InitialContext(); DataSource ds = (DataSource) ic.lookup(dbName); con = ds.getConnection(); } private void closeConnection() { try { con.close(); }catch(Exception e) { //e.printStackTrace(); } } private void insertRow (Integer cableId, String cabName, String cabType, String cabLongName, Integer vendorId,String partNum, String actualState, java.sql.Date actualStateDate, String actualSubState) throws SQLException {
String insertStatement = "insert into cable values ( ? , ? , ? , ?, ?, ?, ?, ?, ? )"; PreparedStatement prepStmt = con.prepareStatement(insertStatement); prepStmt.setInt(1, cableId.intValue()); prepStmt.setString(2, cabName); prepStmt.setString(3,cabType); if(cabLongName !=null) prepStmt.setString(4, cabLongName); else prepStmt.setNull(4,Types.VARCHAR); prepStmt.setInt(5, vendorId.intValue()); if(partNum !=null) prepStmt.setString(6, partNum); else prepStmt.setNull(6,Types.VARCHAR); prepStmt.setString(7, actualState); prepStmt.setDate(8, actualStateDate); prepStmt.setString(9, actualSubState); prepStmt.executeUpdate(); //System.out.println("created the record" + cableId); prepStmt.close(); } private void insertRowIntoConcat(int cabid, int cabConcatenate, int position) throws SQLException { String insertStatement = "insert into cableconcatenation values ( ? , ? , ? )"; PreparedStatement prepStmt = con.prepareStatement(insertStatement); prepStmt.setInt(1, cabid); prepStmt.setInt(2,cabConcatenate); prepStmt.setInt(3, position); prepStmt.executeUpdate(); prepStmt.close(); } private void deleteRow(Integer cableId) throws SQLException {
String deleteStatement = "delete from cable where cableId = ? "; PreparedStatement prepStmt = con.prepareStatement(deleteStatement); prepStmt.setInt(1, cableId.intValue()); prepStmt.executeUpdate(); prepStmt.close(); } private void deleteRowFromConcat(Integer cabConId) throws SQLException { String deleteStatement = "delete from cableconcatenation where cabconcatenate = ? "; PreparedStatement prepStmt = con.prepareStatement(deleteStatement); prepStmt.setInt(1, cabConId.intValue()); prepStmt.executeUpdate(); prepStmt.close(); } private boolean selectByPrimaryKey(Integer primaryKey) throws SQLException { String selectStatement = "select cableId " + "from cable where cableId = ? "; PreparedStatement prepStmt = con.prepareStatement(selectStatement); prepStmt.setInt(1, primaryKey.intValue()); ResultSet rs = prepStmt.executeQuery(); boolean result = rs.next(); prepStmt.close(); return result; } private void loadRow() throws SQLException { String selectStatement = "select cabName,cabType,cabLongName,vendorId,partNum,actualState,ac tualStateDate,actualSubState " +
"from cable where cableId = ? "; PreparedStatement prepStmt = con.prepareStatement(selectStatement); prepStmt.setInt(1,this.cableId.intValue()); ResultSet rs = prepStmt.executeQuery(); if (rs.next()) { this.cabName = rs.getString(1); this.cabType = rs.getString(2); this.cabLongName = rs.getString(3); this.vendorId = new Integer(rs.getInt(4)); this.partNum = rs.getString(5); this.actualState = rs.getString(6); this.actualStateDate = rs.getDate(7); this.actualSubState = rs.getString(8); prepStmt.close(); } else { prepStmt.close(); throw new NoSuchEntityException("Row for id " + cableId + " not found in database."); } String selectStatement1 = "select cabId from CableConcatenation where cabconcatenate = ? order by listposition "; PreparedStatement prepStmt1 = con.prepareStatement(selectStatement1); prepStmt1.setInt(1,this.cableId.intValue()); ResultSet rs1 = prepStmt1.executeQuery(); while (rs1.next()) { this.conCat.addElement(new Integer(rs1.getInt(1))); } if(!(conCat.size() > 0)) this.conCat =new Vector(); prepStmt1.close(); } private void storeRow() throws SQLException {
String updateStatement = "update cable set cabName = ? ,cabType = ? ,cabLongName = ?, " + "vendorId = ? , partNum =?, actualState = ?, actualStateDate=?, actualSubState=? " + "where cableId= ?"; PreparedStatement prepStmt = con.prepareStatement(updateStatement); prepStmt.setString(1, cabName); prepStmt.setString(2, cabType); if(cabLongName !=null) prepStmt.setString(3, cabLongName); else prepStmt.setNull(3,Types.VARCHAR); prepStmt.setInt(4, vendorId.intValue()); if(partNum !=null) prepStmt.setString(5, partNum); else prepStmt.setNull(5,Types.VARCHAR); prepStmt.setString(6, actualState); prepStmt.setDate(7, actualStateDate); prepStmt.setString(8, actualSubState); prepStmt.setInt(9, cableId.intValue()); int rowCount = 0; try { rowCount = prepStmt.executeUpdate(); if(conCat.size()> 0) { deleteRowFromConcat(cableId); insertIntoConcatenation(cableId,conCat); } } catch (SQLException e) { //e.printStackTrace(); } prepStmt.close(); if (rowCount == 0) { throw new EJBException("Storing row for id " + cableId + " failed."); } }
private void insertIntoConcatenation(Integer cabid,Vector concatenation) throws SQLException { for(int i=0; i < concatenation.size(); i++) { Integer id =(Integer) concatenation.elementAt(i); insertRowIntoConcat(id.intValue(),cabid.intValue(),i+1); } } public Integer getCableIdFromDB() { int cableId =0; String query = "select cable_seq.nextval from dual"; try { makeConnection(); Statement stmt = con.createStatement(); ResultSet rs = stmt.executeQuery(query); rs.next(); cableId = rs.getInt(1); }catch(Exception ex){ //System.out.println(ex.getMessage()); } finally { closeConnection(); } return (new Integer(cableId)); } } Comments and alternative answers
Any way to do that with CMP? Author: Julien Martin (http://www.jguru.com/guru/viewbio.jsp?EID=1165737), Apr 24, 2004 Hello, I have just read a post stating that one can't map several database tables to a single cmp entity ejb. This post was quite old. Has anything changed with the advent of ejb 2.1? Julien. How can we work with LDAP using EJB's? Location: http://www.jguru.com/faq/view.jsp?EID=110185
Created: Jul 24, 2000 Modified: 2000-07-24 22:00:50.636 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Guruprasad Pyati (http://www.jguru.com/guru/viewbio.jsp?EID=101356 See the JNDI FAQ and the LDAP Topic for information on using LDAP from J2EE. (There is nothing particularly special about using LDAP from EJB, as opposed to any other use of LDAP from Java.) Comments and alternative answers
I think there is more to your question than meets the... Author: Jim Gish (http://www.jguru.com/guru/viewbio.jsp?EID=119497), Aug 4, 2000 I think there is more to your question than meets the eye. If you mean can entity beans be persisted in an LDAP directory, the answer is "sort of". First of all, the obvious part - you have to use bean-managed persistence since at present no vendors offer container-managed persistence with LDAP. The harder question is one of transactional requirements. Although LDAPs are typically built on transactional systems, only statement level (implicit) transactions are available. If your entity beans are read-only, this may not be a problem. However, if you have other applications modifying your LDAP or your beans are not read-only, or they involve multiple hits to the LDAP to do an update, then you have a problem. Getting LDAPs to participate in a heterogeneous distributed transaction is currently not possible. However, given all the hoopla about LDAP these days, the need is emerging rapidly. Where can I find EJB components for retail, health care, and utility solutions? Location: http://www.jguru.com/faq/view.jsp?EID=111072 Created: Jul 25, 2000 Modified: 2000-07-27 06:41:34.894 Author: Siva Visveswaran (http://www.jguru.com/guru/viewbio.jsp?EID=46210) Question originally posed by sharon wahl (http://www.jguru.com/guru/viewbio.jsp?EID=101124 A starting point would be the Solutions Marketplace section under http://industry.java.sun.com/solutions/ . Another site is the http://www.mgmedv.de/ejbsig/ejbcomponents.html. Sure this is just a start and will require some research on the promised component packages. Since the rather tepid success of IBM's San Francisco, many have not ventured into productizing reusable components especially for verticals you have mentioned. Companies like BEA Systems (eBusiness Smart Components) and IBM (San Francisco) provide some foundation components to get jumpstarted. Others include TheortCenter (eBSC) and DigitalHarbor (Charisma) - unfortunately not for the verticals you have listed. When using a stateful session bean with an idle timeout set, how can the bean receive notification from the container that it is being removed due to timeout? Location: http://www.jguru.com/faq/view.jsp?EID=111811
Created: Jul 26, 2000 Modified: 2000-08-13 15:59:56.613 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by K J (http://www.jguru.com/guru/viewbio.jsp?EID=98373 [Question continues: ? (Through some tests, it looks like none of the standard EJB callback methods are called when a stateful session bean is removed due to idletimeout.)] According to the spec, ejbRemove need not (or must not) be called in this case. ejbPassivate is simply the Wrong Thing to be called (the bean is transitioning to the 'does not exist' state, not the 'passive' state). The EJB 1.1. spec says in section 6.6.3 Missed ejbRemove Calls: The application using the session bean should provide some clean up mechanism to periodically clean up the unreleased resources. For example, if a shopping cart component is implemented as a session bean, and the session bean stores the shopping cart content in a database, the application should provide a program that runs periodically and removes “abandoned” shopping carts from the database. Probably not the answer you're looking for, especially if you allocate some other resource (a Message Queue, for example) that you need to release. Although, if you're using a resource, you really should be getting it when you need it (via JNDI) and returning it back to the pool right away. Can I use the afterBegin, beforeCompletion, and afterCompletion methods in a BMP bean? (as these are the methods of the SessionSynchronization interface) Location: http://www.jguru.com/faq/view.jsp?EID=111818 Created: Jul 26, 2000 Modified: 2000-08-03 22:20:59.882 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by chamiraju raghavendra (http://www.jguru.com/guru/viewbio.jsp?EID=30402 The spec says no. Really, (IMHO) these don't translate well to the life of an entity bean for the following reasons: • • •
afterBegin might not mean much since the entity might join the transaction long (computerwise) after the transaction is started. Anything an entity bean needs to do 'beforeCompletion' should be done in ejbStore. An entity bean really can't do much 'afterCompletion' - by definition, the entity's state is already wherever it needs to be (database, queue, legacy system, etc.)
You might want to re-evaluate what you're actually trying to do: chances are you're missing a key abstraction in your model. Comments and alternative answers
Dan. Not Entity Bean but Session bean with BMP Author: Seetesh H (http://www.jguru.com/guru/viewbio.jsp?EID=1038574), Dec 17, 2002 Hi Dan The question out here refers to Session bean with BMP and not Entity bean. As BMP has full control over transactions, can I use the SessionSynchronization methods? Seetesh How can I access EJBs from JavaBeans Components? Location: http://www.jguru.com/faq/view.jsp?EID=112404 Created: Jul 27, 2000 Modified: 2000-07-27 06:45:12.19 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Roman Lukomski (http://www.jguru.com/guru/viewbio.jsp?EID=102185 In short, JavaBeans are not special; you access EJBs from JavaBeans the way you would from any other EJB client. However, JavaBeans can be useful as a 'wrapper' for EJBs that hide some of the complexities of EJBs and allow their use from other Java programs. A visual JavaBean, in particular, can be assembled in a GUI "bean builder" application, while an EJB often cannot. However, adapting an EJB to become a JavaBean can be very complicated and should not be undertaken lightly. Perhaps another Guru can give feedback to this response with an example and/or source code demonstrating this technique. I have created a remote reference to an EJB in FirstServlet. Can I put the reference in a servlet session and use that in SecondServlet? Location: http://www.jguru.com/faq/view.jsp?EID=114024 Created: Jul 29, 2000 Modified: 2000-07-29 05:59:08.95 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Nagaraj shyagale (http://www.jguru.com/guru/viewbio.jsp?EID=29160 Yes. The EJB client (in this case your servlet) acquires a remote reference to an EJB from the Home Interface; that reference is serializable and can be passed from servlet to servlet. If it is a session bean, then the EJB server will consider your web client's servlet session to correspond to a single EJB session, which is usually (but not always) what you want. Using Websphere for a small EJB application deployment, why do I get the message "The jar file you have created does not contain any beans.Please select a jar file with beans in it".
Location: http://www.jguru.com/faq/view.jsp?EID=114476 Created: Jul 30, 2000 Modified: 2000-07-31 03:29:06.125 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by Yogesh Beri (http://www.jguru.com/guru/viewbio.jsp?EID=99548 This isn't particularly due to the fact that you are using Websphere, although I won't rule that out here based on what you have described. The way to check this would be to try to deploy the same JAR file in Weblogic and see if you receive the same error message. More than likely, your problem is the fact that your manifest (serialized, in the JAR file) is pointing to a bean, say, com.mycompany.mybean.BigBean and inside the JAR file, the package structure for this bean does not match. In other words, you should see the exact folder structure of the BigBean in the JAR file as in the manifest file. So, your JAR file should display the file, BigBean, and then under the 'Path' section, you should have com/mycompany/mybean/. So, if this is your problem, look at how you are JARring up your files, the package structure in your classes and you might need to modify your manifest file. Comments and alternative answers
The jar file you have created may not have a Serialized... Author: Munish Pandhi (http://www.jguru.com/guru/viewbio.jsp?EID=270315), Dec 12, 2000 The jar file you have created may not have a Serialized Deployment Descriptor file contained within in it. 1. To prepare the jar file a file named manifest with no extension should be created in the same package as that of Remote Interface , Home Interface , Bean Class ,Key Class ( FinderHelper Interface ,FinderObject Class only in case of container managed persistence entity bean) . The following two lines should be added in the manifest file : Name : package/serialized deployment descriptor name.ser EnterpriseBean: True
(Here .ser is the extension of serialized deployment descriptor file) The directory tree of package should be separated by forward slashes(‘/’) . 2. The following command should be used on command line to create the jar file(Java Archive) C:\..\project>jar cmf package directory tree\manifest entitybean jar file name.jar package directory tree\*.class package directory tree\*.java package directory tree\*.ser
The project is the directory just above where directory tree of the package lies. In the manifest defined is depicting the path of serialized deployment descriptor and while using the JAR utility to create the jar file of entity bean we tell the JAR utility to use our manifest information to create the jar file of entity bean. If you don’t want to add .java files in the jar file then remove package directory\*.java from above command.
What is the difference between a Component Transaction Monitor (CTM) and an Application Server? Location: http://www.jguru.com/faq/view.jsp?EID=114746 Created: Jul 30, 2000 Modified: 2000-08-03 22:20:06.412 Author: Doug Bell (http://www.jguru.com/guru/viewbio.jsp?EID=113602) Question originally posed by Nagaraj shyagale (http://www.jguru.com/guru/viewbio.jsp?EID=29160 A Component Transaction Monitor (CTM) is an application server that uses a serverside component model. Since a CTM is a Transaction Processing monitor (TP), it is expected to provide services for managing transactions, security, and concurrency. In addition, CTMs also facilitate distributed object architectures and provide facilities for object persistence. In short, a CTM is a specific type of application server. [Can someone give feedback with examples of a CTM? Also, is this different from a TP Monitor? -Alex] Comments and alternative answers
BEA WebLogic Application Server is an example of a... Author: Doug Bell (http://www.jguru.com/guru/viewbio.jsp?EID=113602), Jul 31, 2000 BEA WebLogic Application Server is an example of a CTM (as is any EJB Application Server). A CTM is essentially a TP monitor combined with a distributed component architecture, such as EJB. A CTM provides a richer set of services than a TP monitor since it also manages the components.
Example of a TP monitor is BEA TUXEDO, IBM CICS...... Author: Anoop Sehdev (http://www.jguru.com/guru/viewbio.jsp?EID=208040), Sep 17, 2000 Example of a TP monitor is BEA TUXEDO, IBM CICS... Example of CTM is MTS, and various other Application servers... A CTM is a hybrid Technology between a TP monitor and the ORB. Correct me if I am wrong. These are the words from the famous Enterprise JavaBeans from O'Reilly. Regards Anoop Sehdev
How can I call one EJB from inside of another EJB? Location: http://www.jguru.com/faq/view.jsp?EID=114944 Created: Jul 31, 2000 Modified: 2000-07-31 05:01:34.042 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by biju mathew (http://www.jguru.com/guru/viewbio.jsp?EID=90463 Just do it! EJBs can be clients of other EJBs. It just works. Really. Use JNDI to locate the Home Interface of the other bean, then acquire an instance reference, and so forth. How good is the performance of EJB systems? Are there any benchmarks? Location: http://www.jguru.com/faq/view.jsp?EID=115140 Created: Jul 31, 2000 Modified: 2000-07-31 05:27:47.907 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Lee Fuller (http://www.jguru.com/guru/viewbio.jsp?EID=109421 EJB systems are designed to perform very poorly. Very provocative, no? :-) What I mean is this: EJBs allow you to make an application distributed and scalable. This can have a huge positive impact on performance -- if your application really is running in a cluster, on dozens of host machines simultaneously, with hundreds of simultaneous clients. However, the performance of each individual machine will usually be much slower than the same application running on a single app server. This is because of the overhead introduced by the EJB server managing your persistence and transactions for you. However, like I said, this is by design. As a simple illustration of this, think about session data. In a simple web server environment, the session data is stored in RAM, and stays resident for the life of the client session. Access to this session data is very fast. In a distributed, EJB server environment, the session data may get swapped to disk between client requests, and the client may connect to a different host for the second request. This requires more work to save and load the data for each request, so performance must suffer. However, it also allows many more client sessions to be active simultaneously, and to make use of the same (limited) amount of RAM per machine, and to use many many many machines in your cluster. EJB performance is a classic "hockey stick" curve: the performance suffers in the short term (small number of hosts), then improves greatly in the long term (large number of hosts). Another way to look at it is that it enables the "just throw money at it" solution (i.e. more servers) to actually have a chance of success. As for benchmarking: as far as I know, nobody has done any benchmarks comparing different EJB servers, or comparing EJB with other similar technologies. And once they do, everyone will find problems with it, as usual.
Flame on! Please feel free to object violently to any of the above assertions. That's what the "feedback" function is for! :-) Comments and alternative answers
For comparison between the IPlanet App Server, Web... Author: Anoop Sehdev (http://www.jguru.com/guru/viewbio.jsp?EID=208040), Sep 17, 2000 For comparison between the IPlanet App Server, WebSphere and WebLogic go to the following site : http://www.iplanet.com/products/infrastructure/app_servers/wp_dhbrown.html For complete Report from DH Brown go to http://www.iplanet.com/products/infrastructure/app_servers/wp_dhbrown.pdf See also a thread on the Threads FAQ Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Dec 11, 2001 The following thread -- Thread Execution: static methods vs. instance methods. -contains some interesting points about performance, including the paragraph The claims that EJBs are high-performance are total nonsense. On a single machine, EJBs will perform worse than servlets or any other custom solution. The reason they say they're "high-performance" is because they're scalable. It's just doublespeak. It's like saying a car is faster because it has a bigger gas tank, which means it doesn't have to stop as often to refuel on long trips -- but on short trips, speed is speed. (Written by me :-)) How do I insert or update 2 different Entity Beans within the same transaction? Location: http://www.jguru.com/faq/view.jsp?EID=116652 Created: Aug 1, 2000 Modified: 2000-08-03 21:54:24.393 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by James Hr (http://www.jguru.com/guru/viewbio.jsp?EID=106189 To easily achieve this, you can call both inserts from another bean, for example a Session Bean (if you are using the standard Session wraps Entity design pattern). Lets say that both Entity Beans have defined create methods, and that the Session Bean has a method called insertEntities(). Inside the insertEntities() method, you would obtain handles to the approriate home interfaces and call create on each one. The trick here is on how you set up the transaction attributes. You would like both of your Entity Beans to share the same transaction, and in this example, we can have the Session Bean as the initiator of the transaction.
If we set the insertEntites() method to have a Transaction Attribute of REQUIRED or REQUIRES_NEW, then we assure that a transaction will be present. (REQUIRED is generally more robust, since it allows this insertEntities() call to be part of an ongoing, larger transaction, but if one is not in progress, a new one will be created.) If we then set the Transaction Attributes for each of the Entity Beans to REQUIRED, then the same Transaction Context will be propagated from the Session Bean to both Entity Beans, achieving the result you are after. [Note that this works no matter which Persistence method (CMP or BMP) the Entity Beans use.] How do I use JNDI to locate the home interface of an EJB running on a different host? My client's InitialContext doesn't seem to know where the server is. Location: http://www.jguru.com/faq/view.jsp?EID=116655 Created: Aug 1, 2000 Modified: 2001-10-09 23:26:36.597 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Puneet Sachdeva (http://www.jguru.com/guru/viewbio.jsp?EID=28785 This depends on which EJB container / JNDI implementation that you are using. For example, in WebLogic, you set the javax.naming.Context.PROVIDER_URL property to be the host and port, for example "t3://hostname:7001" Using the Inprise Application Server, it will do this automatically if you are within the same subnet using the Smart Agent, or you can pass a command-line parameter into the virtual machine. You should refer to the documentation for the implementation that you are using for the exact specifics. Comments and alternative answers
How do I use JNDI to locate the home interface of an EJB running on a different host? Author: Sribha Jain (http://www.jguru.com/guru/viewbio.jsp?EID=484436), Aug 27, 2001 How do we do this using J2EE server and where is this property specified? Re: How do I use JNDI to locate the home interface of an EJB running on a different host? Author: James Chiang (http://www.jguru.com/guru/viewbio.jsp?EID=341533), Aug 29, 2001 Setting the following env. when instantiating InitialContext: Properties env = new Properties(); env.put("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory"); env.put("java.naming.provider.url", "iiop://hostname:1050");
InitialContext jndiCtx = new InitialContext(env);
Re: Re: How do I use JNDI to locate the home interface of an EJB running on a different host? Author: Sribha Jain (http://www.jguru.com/guru/viewbio.jsp?EID=484436), Aug 29, 2001 Thanks, James...but will this work for all application servers...i am using J2EE server currently. And how do we know whether our iiop port is 1050(as u have given in code). Re: Re: How do I use JNDI to locate the home interface of an EJB running on a different host? Author: Sribha Jain (http://www.jguru.com/guru/viewbio.jsp?EID=484436), Aug 29, 2001 I tried it out but it gives following error on running the client. javax.naming.NameNotFoundException. Root exception is org.omg.CosNaming.NamingC ontextPackage.NotFound at org.omg.CosNaming.NamingContextPackage.NotFoundHelper.read(Unknown So urce) at org.omg.CosNaming.NamingContextPackage.NotFoundHelper.extract(Unknown Source) at org.omg.CosNaming._NamingContextStub.resolve(Unknown Source) at com.sun.jndi.cosnaming.CNCtx.callResolve(Unknown Source) at com.sun.jndi.cosnaming.CNCtx.lookup(Unknown Source) at com.sun.jndi.cosnaming.CNCtx.lookup(Unknown Source) at javax.naming.InitialContext.lookup(Unknown Source) at ConverterClient.main(ConverterClient.java:27) Re: Re: Re: How do I use JNDI to locate the home interface of an EJB running on a different host? Author: James Chiang (http://www.jguru.com/guru/viewbio.jsp?EID=341533), Aug 29, 2001 It's indeed port 1050 for SUN's j2ee RI server. You can type "j2ee -verbose" to find the naming service port. As to solve NotFoundException, just copy j2ee.jar (located at %J2EE_HOME%\lib) to the client end and set into classpath. Re: Re: Re: Re: How do I use JNDI to locate the home interface of an EJB running on a different host? Author: Sribha Jain (http://www.jguru.com/guru/viewbio.jsp?EID=484436), Aug 29, 2001 I have already done that, but the problem persists... Re: Re: Re: Re: Re: How do I use JNDI to locate the home interface of an EJB running on a different host? Author: moiroux matthieu
(http://www.jguru.com/guru/viewbio.jsp?EID=540275), Nov 6, 2001 i've just try it and it work tx ! Re[2]: How do I use JNDI to locate the home interface of an EJB running on a different host? Author: Vassilis Mokas (http://www.jguru.com/guru/viewbio.jsp?EID=855498), Apr 26, 2002 Can you please tell me the corresponding code for Borland Application Server 4.5 or 5 ? I just want to locate an EJB in BAS using a servlet in Tomcat. Re[3]: How do I use JNDI to locate the home interface of an EJB running on a different host? Author: Laurent Mihalkovic (http://www.jguru.com/guru/viewbio.jsp?EID=407112), Jul 17, 2002 Hi I was just going through the same discovery process with the Borland AppServer, and found myself at the same place you must have been a while ago... I found the following document in the Google search cache. I found it very interesting as it explains some of the basic mechanisms of the Borland Naming service. One thing for sure, Borland uses Corba/IIOP as its underlying communication layer. And unlike LDAP for example, or ven the SUN reference j2ee server, there does not seem to be syntax for specifying a Context.PROVIDER_URL property. However, I found the following bit of code that shows some of the other properties that can be used: javax.naming.Context context; // get a JNDI context using the Naming service Hashtable env = new Hashtable(); env.put(javax.naming.Context.INITIAL_CONTEXT_FACTORY, "com.inprise.j2ee.jndi.CtxFactory"); env.put(javax.naming.Context.URL_PKG_PREFIXES, "com.inprise.j2ee"); context = new javax.naming.InitialContext(env); The documentation states that URL_PKG_PREFIXES is necessary to support the standard java:comp namespace.
Borland uses a runtime discovery mechanism to identify the servers, and in all of the examples, a simple ctx = new InitialContext() does the job of identifying the server dynamically at run-time. My understanding is that there must be a command line parameter for specifying a specific server
when more than one is present on the network. Cheers, laurent Re[2]: How do I use JNDI to locate the home interface of an EJB running on a different host? Author: test sherchan (http://www.jguru.com/guru/viewbio.jsp?EID=962675), Jul 24, 2002 I am getting the same problem and i am using J2EE server. Can u tell me plz how to set that env.
Re[3]: How do I use JNDI to locate the home interface of an EJB running on a different host?
Author: frank xing (http://www.jguru.com/guru/viewbio.jsp?EID=918691), Oct 23, 2002
The way to use JNDI to locate a home interface of an EJB on remote host differs among different application servers. As I am using WebLogic6.1, the steps are as follows: 1. at the client side, set the weblogic.jar in your classpath. 2. You have to prepare a Properties object for initialContext, that is: Properties p = new Properties(); //weblogic's JNDI driver(provider) p.put(Context.INITIAL_CONTEXT_FACTORY,"weblogic.jndi.WLInitialContextFactory //URL which located the remote server p.put(Context.PROVIDER_URL,"t3://192.168.153.101:7001"); whereas 192.168.153.101 is my remote server's IP address. 3.Then you construct the InitialContext object Context ctx = new InitialContext(p); 4.lookup your EJBHome interface: Object objref = ctx.lookup("com.***.ejb.session.User"); whereas "com.***.ejb.session.User" is your EJB Home interface's JNDI name 5. narrow to the EJBHome return PortableRemoteObject.narrow(objref, UserHome.class); that's all you need to do on WebLogic.
And for other application servers, you need to obtain the corresponding JNDI provider(driver) as step1, set the INITIAL_CONTEXT_FACTORY and PROVIDER_URL step2 and then follow step 3, 4, 5. Hope this will be help.
Re: Re[3]: How do I use JNDI to locate the home interface of an EJB running on a different host?
Author: Srinivas Tati (http://www.jguru.com/guru/viewbio.jsp?EID=1022849), Nov 7, 2002 how can I achieve the same result if i dont want to hard code the hostname . Is there some way of passing the hostname as a parameter ? Re: Re[3]: How do I use JNDI to locate the home interface
of an EJB running on a different host?
Author: leena sharma (http://www.jguru.com/guru/viewbio.jsp?EID=1030690), Nov 26, 2002 But if my client application is not using weblogic then also I have to include weblogic.jar. Is there some other way to lookup the bean deployed under weblogic server. Re: How do I use JNDI to locate the home interface of an EJB running on a different host? [JBoss] Author: Edison Wang (http://www.jguru.com/guru/viewbio.jsp?EID=1149288), Feb 25, 2004 I was about to post a new thread on the forums when I see this one... I sort of understood how the looking up to another host is now, but which namespace should I put in for this line? I'm also not sure whether the IIOP for JBoss is on port 1050. env.put("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
Lookup for jndi resources on different app/ldap servers Author: Java Developer (http://www.jguru.com/guru/viewbio.jsp?EID=1042536), Jan 2, 2003 Take this scenario: I am using iPlanet's app server. My jndi provider is using LDAP in the background. Now I have multiple ejbs each on a different appsever say EJB1 is deployed on AppServer1 EJB2 is deployed on AppServer2 (and essentially different ldap server) EJB1 uses EJB2 and so does a lookup of EJB2. In the implementation how do I seamlessly lookup EJB2 on AppServer2 ? By seamlessly I mean, is there a configuration in jndi, which does the lookup on a primary server for a resource and not finding it there does a lookup on a secondary ldap server ? What is the best way to do a standard logging/tracking mechanism for a distributed architecture? We're using J2EE, EJB, load balancing, and multiple tiers. Location: http://www.jguru.com/faq/view.jsp?EID=116656 Created: Aug 1, 2000 Modified: 2000-08-04 04:09:57.164 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by priya Vasudevan (http://www.jguru.com/guru/viewbio.jsp?EID=60815 Most application servers provide an api to do logging, however if you want maximum portability, I would recommend using a third party package, that you can take with you. An open source libarary such as log4java http://www.log4j.org/ can be used and fits well with a variety of technologies including EJB and CORBA. [Does log4j really have support for multitier architectures? That is, so log messages generated on different hosts end up in the same place? -Alex]
Comments and alternative answers
Hello, Yes. Log4j supports remote logging with the... Author: Ceki Gulcu (http://www.jguru.com/guru/viewbio.jsp?EID=36306), Sep 4, 2000 Hello, Yes. Log4j supports remote logging with the SocketAppender. A client can send its log records to a remote server which can log it according to local server policy. This includes the ability to log the incoming record on multiple output targets and even to send the log record to a second log server. A JMSAppender is on the works by the way. Ceki Gulcu Should I use Entity Beans for all database tables, even though they may have complicated relations and joins? Or should I just use them for frequently-used and simple tables such as account info? Location: http://www.jguru.com/faq/view.jsp?EID=116658 Created: Aug 1, 2000 Modified: 2000-08-04 04:12:44.822 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Kim Wang (http://www.jguru.com/guru/viewbio.jsp?EID=99794 This is a question for which there is no "yes-or-no" answer for and depends on the functionality of the product(s) that you are using, and the requirement of the system. An example of this is the ability to support dependant objects, which is coming in EJB 2.0, Inprise Application Server 4.1 supports this feature, where you can have nonEJB Java objects inside your Entity Beans, which map to different tables in the database. Giving you one entity bean covering multiple tables. As a general note, I like to use Entity Beans which wrap a table and its dependants, so that other programmers do not have to remodel simple relationships such as Orders/OrderLines if there was an Entity Bean per table. Comments and alternative answers
Does that mean that you make an OrderEJB only? Author: neal ravindran (http://www.jguru.com/guru/viewbio.jsp?EID=17737), Nov 24, 2002 Does that mean that you make an OrderEJB and in it have an array of orderLineIds as an attribute? In short you (personally, that is) make the parent table as the EJB and don't make the child tables into entity beans, right? I guess you have a getter with DB calls in it to get the array of orderLineIds for a particular order_id. True?
How do the six transaction attributes map to isolation levels like "dirty read"? Will an attribute like "Required" lock out other readers until I'm finished updating? Location: http://www.jguru.com/faq/view.jsp?EID=116659 Created: Aug 1, 2000 Modified: 2000-08-03 22:36:36.532 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by ralph swick (http://www.jguru.com/guru/viewbio.jsp?EID=108754 The Transaction Attributes in EJB do not map to the Transaction Isolation levels used in JDBC. This is a common misconception. Transaction Attributes specify to the container when a Transaction should be started, suspended(paused) and committed between method invocations on Enterprise JavaBeans. For more details and a summary of Transaction Attributes refer to section 11.6 of the EJB 1.1 specification. [Now, how would we actually set JDBC attributes from inside or outside an EJB method? -Alex] Is there a way to dynamically lookup EJB interfaces, comparable to CORBA's dynamic invocation interface (DII)? Location: http://www.jguru.com/faq/view.jsp?EID=116661 Created: Aug 1, 2000 Modified: 2000-08-04 04:05:50.021 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Archana Karnik (http://www.jguru.com/guru/viewbio.jsp?EID=68139 Each EJB class has an associated EJBMetaData class that can be retrieved from the Home interface of the bean. Home interfaces are published in JNDI, so they can also be discovered. In particular, the javax.ejb.EJBMetaData interface provides methods such as getHomeInterfaceClass() and getRemoteInterfaceClass() One thing that you will have to consider is using an EJB server that support dynamic stub downloading, so that you can make remote calls to the EJB. When using Primary Keys, why do I have to implement the hashCode() and equals() method in my bean? Location: http://www.jguru.com/faq/view.jsp?EID=118541 Created: Aug 3, 2000 Modified: 2000-08-15 06:29:09.591 Author: Ryan Lynch (http://www.jguru.com/guru/viewbio.jsp?EID=118538) Question originally posed by lyndon mendoza (http://www.jguru.com/guru/viewbio.jsp?EID=8369
Implementing the hashCode() and equals() functions ensure that the primary key object works properly when used with hash tables. Hash tables are the preferred way EJB servers use to store and quickly retrieve instantiated entity beans. If session #1 uses widget "A" (which is an entity bean) then the server needs to do some work to instantiate and initialize the object. If session #2 then requests the same widget "A", the EJB server will look in its hash table of existing entity beans of type widget to see if widget "A" has already been instantiated. Comments and alternative answers
The equals() method needs to compare two primary keys... Author: Doug Bell (http://www.jguru.com/guru/viewbio.jsp?EID=113602), Aug 4, 2000 The equals() method needs to compare two primary keys to determine if they are equal, which is to say that they refer to the same element in the database. The default implemention of Object.equals() uses object identity, so it only returns true if the objects are the same object. You need to provide an implementation of equals() that is based on the content of the primary keys. Whenever you override equals() you have to override hashCode() in order to maintain the relationship:
if a.equals(b) then a.hashCode() == b.hashCode() it will be great if you can explain this by an example.... Author: Purushottam Nagtode (http://www.jguru.com/guru/viewbio.jsp?EID=24655), Aug 15, 2000 it will be great if you can explain this by an example. For ex: If my primarykey class is UserPK(int userid , String username), how do I implememnt hachCode() and equals() function? A really neat example is in the recent Book of Ent... Author: shoban babu (http://www.jguru.com/guru/viewbio.jsp?EID=87955), Sep 18, 2000 A really neat example is in the recent Book of Enterprise Java Beans of O'Reilly publications - In Chapter 9 Are there any good books that cover EJB (and related topics like LDAP and so on)? Location: http://www.jguru.com/faq/view.jsp?EID=119643
Created: Aug 4, 2000 Modified: 2000-08-04 13:18:39.763 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by mathew koshy (http://www.jguru.com/guru/viewbio.jsp?EID=110668 Check out Enterprise JavaBeans from O'Reilly by our pal Richard Monson-Haefel. The O'Reilly series also has good books on Security, Distributed Computing, and so on. See also •
What books cover JNDI (Java Naming and Directory Interface)?
Comments and alternative answers
there's also a very comprehensive site covering J2EE... Author: Peter Kua (http://www.jguru.com/guru/viewbio.jsp?EID=32290), Aug 7, 2000 there's also a very comprehensive site covering J2EE stuff, and you can also download the complete Mastering Enterprise JavaBeans by Ed Roman. the site is http://www.theserverside.com If Client C calls EJB A, and EJB A calls EJB B, then will the methods in B be invoked with the same security context of Client C? Location: http://www.jguru.com/faq/view.jsp?EID=119676 Created: Aug 4, 2000 Modified: 2000-08-08 01:06:38.194 Author: Prasad Thammineni (http://www.jguru.com/guru/viewbio.jsp?EID=36479) Question originally posed by tirumala kumar (http://www.jguru.com/guru/viewbio.jsp?EID=94613 It depends on how you configure the EJBs. If you set the EJB A and B's run-asmodes to CLIENT_IDENITY in the deployment descriptor, all methods in A and methods in B will execute within the security context of Client C. Comments and alternative answers
ok this works in version 1.0, but could you please... Author: tirumala kumar (http://www.jguru.com/guru/viewbio.jsp?EID=94613), Aug 8, 2000 ok this works in version 1.0, but could you please give me info for version 1.1 Can I deploy two beans in a single jar file? If so, how? Location: http://www.jguru.com/faq/view.jsp?EID=120786 Created: Aug 7, 2000 Modified: 2000-08-24 18:57:48.486 Author: Doug Bell (http://www.jguru.com/guru/viewbio.jsp?EID=113602) Question originally posed by tirumala kumar (http://www.jguru.com/guru/viewbio.jsp?EID=94613 Yes, multiple EJBs can be deployed in a single jar file. The deployment is somewhat different between EJB 1.0 and EJB 1.1.
In EJB 1.0 each bean has a separate serialized deployment descriptor. All of the bean classes and deployment descriptors are placed in the jar file along with the manifest file named META-INF/MANIFEST.MF. The manifest file must contain an entry for each bean that names the bean's deployment descriptor. For example, the following manifest is for a jar file that contains two deployment descriptors: Name: BeanADD.ser Enterprise-Bean: True Name: dirname/BeanBDD.ser Enterprise-Bean: True Note that a blank line is required between the entries in the manifest file. In EJB 1.1 and in the draft EJB 2.0 specification, instead of a manifest and serialized deployment descriptors there is a single shared XML deployment descriptor named META-INF/ejb-jar.xml. Within ejb-jar.xml there must be either a <session> or <entity> element for each bean in the jar file. For example, the following XML fragment is for a jar file that contains one entity and one session bean: <ejb-jar> <enterprise-beans> <session> <ejb-name>MySessionBean ... other xml elements describing the bean's deployment properties ... <entity> <ejb-name>MyEntityBean ... other xml elements describing the bean's deployment properties ... The EJB 2.0 draft specification for deployment descriptors differs from EJB 1.1 only in the addition of XML elements for describing additional bean properties. Comments and alternative answers
deploying two beans in a single jar file Author: lalitha yellapragada (http://www.jguru.com/guru/viewbio.jsp?EID=390717), Jun 4, 2001 In ejb1.1, we will change accordingly in ejb-jar file.. it is fine...But what changes has to be made in weblogic-ejb-jar? Where shall we specify the 2 jndi Re: deploying two beans in a single jar file Author: mahesh kumar (http://www.jguru.com/guru/viewbio.jsp?EID=472441), Aug 9, 2001 what ever the code is written in the weblogic-ejb-jar file for one jndi name just copy and paste for the second bean with different jndi name .
Does Tomcat support EJB? Location: http://www.jguru.com/faq/view.jsp?EID=123221 Created: Aug 9, 2000 Modified: 2001-10-23 15:04:24.61 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Stella Fredo (http://www.jguru.com/guru/viewbio.jsp?EID=112519 No, Tomcat does not support EJB. It is a Servlet/JSP container, not an EJB container. The Jakarta Project provides an implementation of the Servlets API called Tomcat, and an implementation of JavaServer Pages called Jasper. These are bundled together in the Tomcat release. However, the J2EE Reference Implementation, which supports EJB, is bundled with an old version of Tomcat. This adds Tomcat's support for Servlets and JSP to the J2EE product. See also • •
Can I use the latest version of Tomcat inside Sun's J2EE implementation? Can I use the Apache Web Server with the Sun J2EE Reference Implementation?
Comments and alternative answers
There is a open source project for EJB called jboss... Author: gunjan doshi (http://www.jguru.com/guru/viewbio.jsp?EID=65610), Aug 9, 2000 There is a open source project for EJB called jboss from www.jboss.org which intergrates very well with Tomcat. The site even has step by step instructions for intergrating the two. You could also try, as an alternative to the reference... Author: Eoghan O'Donnell (http://www.jguru.com/guru/viewbio.jsp?EID=74622), Aug 9, 2000 You could also try, as an alternative to the reference implementation, the JBOSS (http://www.jboss.org) EJB server, which has integrates nicely w/ Tomcat. It supports EJB1.1. It's a snap to set up and configure Tomcat w/ it, if you follow the advice given on their site. What are the viable alternatives for calling EJBs from non-Java programs? Specifically, I'm interested in calling EJBs (probably indirectly) from plain old C language. Location: http://www.jguru.com/faq/view.jsp?EID=124198 Created: Aug 10, 2000 Modified: 2000-08-10 10:29:51.64 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question
originally posed by Marty Hill (http://www.jguru.com/guru/viewbio.jsp?EID=115510 Short answer: JNI See also How can I access my EJBs from COM environments such as VB? Comments and alternative answers
I understand that JNI allows Java code to call non-Java... Author: Marty Hill (http://www.jguru.com/guru/viewbio.jsp?EID=115510), Aug 10, 2000 I understand that JNI allows Java code to call non-Java code (typically OS services), but that's not what I'm asking. I need to call EJB methods from C code. I'm looking for answers that do not involve COM or CORBA. You can call Java methods from C using JNI, you can... Author: Jim Coker (http://www.jguru.com/guru/viewbio.jsp?EID=2), Aug 10, 2000 You can call Java methods from C using JNI, you can also access Java data structures directly. maybe via this way : C -> HTTP -> SERVLET ->... Author: Gilles Philippart (http://www.jguru.com/guru/viewbio.jsp?EID=83422), Aug 11, 2000 maybe via this way : C -> HTTP -> SERVLET -> JavaBean (optional) -> EJB. correct me if i'm wrong. Sybase Enterprise Server allows EJBs to be called as... Author: Ludovic Claude (http://www.jguru.com/guru/viewbio.jsp?EID=2782), Aug 11, 2000 Sybase Enterprise Server allows EJBs to be called as stored procedures, but this functionality is very limited. An other solution would be to have servlets calling the EJBs, and your C code makes HTTP request to the servlet and parse the result. Ugly and inefficiant at best... Maybe you can use : C<-->corba<-->java... Author: liu coolx (http://www.jguru.com/guru/viewbio.jsp?EID=69763), Aug 13, 2000 Maybe you can use : C<-->corba<-->java<-->ejb it works well. You should check out our JunC++ion product at http... Author: Alexander Krapf (http://www.jguru.com/guru/viewbio.jsp?EID=221775), Oct 4, 2000 You should check out our JunC++ion product at http://www.codemesh.com. It is currently generally available on Wintel, but ports to various Unices are underway. Its codegenerator accepts compiled Java classes as input and generates C++ proxy
classes for them. These proxy classes can be used like normal C++ classes, but totally transparently to the developer a JVM gets launched when they are used the first time. All operations on these classes result in the execution of the underlying Java code. The connection is made through JNI, but you're totally insulated from it by the generated code. Once you're in C++, it's very easy to hook the code up to a C program. One nice benefit of this solution is that all Java types are available to the C++ program. In CORBA you are limited to primitive and IDL-declared types. Another benefit is that you can use complex Java datatypes in your C++ program without having to convert the data. Take for example the java.util.Date type. If your EJB server tries to return a date to a client, how do you have to do this for a C client? In Java you just return the Date instance but for a C/C++ client you would have to convert it to some kind of "seconds since" value or extract integers for the C/C++ client to be able to make sense of it. That's code that you have to write just to accommodate a language choice on the client. Using JunC++ion on the other hand, you just use the C++ Date proxy class on the client side and have full access to its rich call interface. EJB-IDL-C++ Author: parul dholakia (http://www.jguru.com/guru/viewbio.jsp?EID=451179), Jul 26, 2001 You can convert EJB to IDL and then IDL to c++ which is ofcourse a CORBA solution.
When I want to add/remove a record from database, should I use the methods directly from Entity Bean or I should use a Session Bean to create some methods which will call the methods in the Entity Bean? Location: http://www.jguru.com/faq/view.jsp?EID=124213 Created: Aug 10, 2000 Modified: 2000-08-10 10:58:57.514 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by eddie chui (http://www.jguru.com/guru/viewbio.jsp?EID=115751 It depends :-) Usually you're fine just calling the EB methods (actually, create, and sometimes remove, would be called on the EJBHome). Use the SB if you have other things you want to do at the same time, like adding/removing other dependent entity beans, or logging the action, or performing additional validation.
See also Should I use Entity Beans for all database tables, even though they may have complicated relations and joins? Or should I just use them for frequently-used and simple tables such as account info? Comments and alternative answers
In a larger application (with a larger team), you may... Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644), Aug 14, 2000 In a larger application (with a larger team), you may want to madnate that all client calls go through session beans: This way you know that every interaction has a well defined unit of work, there won't be as much temptation to add a call to an entity from the client, and you'll have an extra level of indirection should you need to make major changes for performance reasons. Remember that every call to an EJB is a transaction (unless your client is managing the transaction itself, which is probably more than you really want to do). Can someone explain in detail the different steps involved in adding 'finder' methods other than 'findByPrimaryKey' in IBM's VisualAge for Java? Location: http://www.jguru.com/faq/view.jsp?EID=124806 Created: Aug 11, 2000 Modified: 2000-08-11 13:12:28.152 Author: Badri Kuppa (http://www.jguru.com/guru/viewbio.jsp?EID=98194) Question originally posed by shyla rajeev (http://www.jguru.com/guru/viewbio.jsp?EID=111902 You can create finder methods in the Home Interface and give an SQL hint in the finderHelper class. For example if you want to create a finder method for userId then the method in the home interface would be like this. ObjectToBeReturned findByUserId(String userId) throws java.rmi.RemoteException, javax.ejb.FinderException; then in the finder helper class you can put this line.. public final static String findByUserIdWhereClause = "USERID = ?"; Remember, the String declaration in finderHelper class should be as above, i.e., findBy+toBeFound+whereClause you can replace the where clause by a select statement too! I hope this helps you! --Badri [email protected] What is a three-tier architecture? Location: http://www.jguru.com/faq/view.jsp?EID=125072 Created: Aug 11, 2000 Modified: 2000-08-11 14:55:10.431 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question
originally posed by joy choudhury (http://www.jguru.com/guru/viewbio.jsp?EID=104345 A three-tier architecture is any system which enforces a general separation between the following three parts:
1. Client Tier or user interface 2. Middle Tier or business logic 3. Data Storage Tier Applied to web applications and distributed programming, the three logical tiers usually correspond to the physical separation between three types of devices or hosts:
1. Browser or GUI Application 2. Web Server or Application Server 3. Database Server (often an RDBMS or Relational Database) However, inside of the application server, there is a further division of program code into three logical tiers. This is kind of fractal: the part (app server object design) resembles the whole (physical system architecture). In a classic JSP/Servlet system, these objects are usually implemented as:
1. JSPs or Servlets responsible for creating HTML or WML user interface pages 2. Servlets or JavaBeans responsible for business logic 3. Servlets, JavaBeans, or Java classes responsible for data access. These objects usually use JDBC to query the database.
In an EJB system, the three logical tiers are usually implemented somewhat differently:
1. JSPs, Servlets, or Java client applications responsible for user interface 2. Session Beans or Entity Beans whose methods implement business logic and business rules
3. Entity Beans whose fields represent data; these fields are "persisted"
(stored and retrieved) either by the EJB server (for container-managed persistence) or by the Entity Beans themselves (for bean-managed persistence)
As you can see, the precise definition of "tiers" can vary widely depending on the particular needs and choices of an application designer. However, they all maintain the general division of client-logic-storage. If the architecture contains more than three logical tiers -- for instance, multiple data feeds, multiple transactional data sources, multiple client applications -- then it is typically called an "N-tier" or "Distributed" architecture. See also:
• • • • •
What seperates one tier from another in the context of n-tiered architecture? In distributed architecture (typical three tier consisting of thin client, middleware & database) which type of JDBC driver should be used and why? What is meant by the term "business logic"? Are the following schemes 3 tiered architecture? What is the recommended, "best" architecture for JSP applications?
Comments and alternative answers
NEED SOME HELP WITH THE FOLLOWING QUESTIONS Author: hapz happy (http://www.jguru.com/guru/viewbio.jsp?EID=1239371), Apr 18, 2005 hi, just need some answers to some questions about XML coz i dont hav a clue. 1) how to identify a website that is using XML? 2) in which way can you identify a website is using XML and not xhtml? 3) what is server-side XML, what is client-side XML? 4) how to identify a website that is using a Three-Tier Architecture Re: NEED SOME HELP WITH THE FOLLOWING QUESTIONS Author: hapz happy (http://www.jguru.com/guru/viewbio.jsp?EID=1239371), Apr 18, 2005 reply to [email protected] thanx Re[2]: NEED SOME HELP WITH THE FOLLOWING QUESTIONS Author: Felix Zhu (http://www.jguru.com/guru/viewbio.jsp?EID=1241528), Apr 28, 2005 You should think twice about your post on this website. There are many other methods of gaining knowledge. See me in class. I can help. Re[2]: NEED SOME HELP WITH THE FOLLOWING QUESTIONS Author: Leonardo DaVinci (http://www.jguru.com/guru/viewbio.jsp?EID=1245556), May 24, 2005 Meow :) How can I use JDO with EJB? Location: http://www.jguru.com/faq/view.jsp?EID=125704 Created: Aug 13, 2000 Modified: 2000-08-13 15:51:33.693 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Corneanu Dan (http://www.jguru.com/guru/viewbio.jsp?EID=41082 JDO and EJB are different and incompatible persistence models. While there may in the future be an EJB server that uses JDO, no such thing currently exists, and IMHO never should. Comments and alternative answers
Sun's site states that JDO could be used to implement... Author: John Francis (http://www.jguru.com/guru/viewbio.jsp?EID=296576), Jan 8, 2001 Sun's site states that JDO could be used to implement persistence for a bean using bean managed persistence. JDO is an object to relational mapping layer, so can live inside the implementation of the bean. ejb and jdo answer unsatisfactory Author: chris mountford (http://www.jguru.com/guru/viewbio.jsp?EID=528277), Mar 7, 2004 I think EJB would better be described as a component model with CMP its stock persistence model. BMP is an alternate persistence model that delegates and this could easily delegate to JDO. Of course some people disprefer CMP. JDO is not a component model at all so I can't see the incompatibility you cite. How can I invoke an EJB from a servlet? Location: http://www.jguru.com/faq/view.jsp?EID=126254 Created: Aug 14, 2000 Modified: 2000-08-14 08:57:21.382 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by prakash patel (http://www.jguru.com/guru/viewbio.jsp?EID=102421 You invoke an EJB from a servlet or JSP the same way you invoke one from any other Java code. Just read the EJB docs and FAQ and have fun! Comments and alternative answers
first create the home object, then using home, access... Author: raghavendra ghorpade (http://www.jguru.com/guru/viewbio.jsp?EID=344479), Mar 5, 2001 first create the home object, then using home, access the method. for example:
try { Context c=new InitialContext(); Object o=c.lookup("gor"); first.ABCHome home=(first.ABCHome)PortableRemoteObject.narrow(o,first.ABCHome.class); abc=home.create(); (abc.yourmethod(with paramaters) } catch(Exception ex) { ex.printStackTrace(); }
Re: first create the home object, then using home, access... Author: J C (http://www.jguru.com/guru/viewbio.jsp?EID=756527), Feb 12, 2002 This seems to be lots of details missing. When you run J2EE client with Sun's J2EE reference implementation server, you use runclient command which sets a number of properties. How do you set these within servlet/JSP? I guess that you
have to set these properties when starting web server (e.g., servlet), right? Why use EJB when we can do the same thing with servlets? Location: http://www.jguru.com/faq/view.jsp?EID=126400 Created: Aug 14, 2000 Modified: 2001-11-09 06:08:03.377 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by sreenivasulu kadirimangalam (http://www.jguru.com/guru/viewbio.jsp?EID=123964 Actually, servlets/JSPs and EJB are complementary, not competing technologies: Servlets provide support for writing web based applications whereas EJBs provide support for writing transactional objects. In larger web systems that require scalability, servlet and JSP or XML/XSL technologies provide support for the front end (UI, client) code, where EJB provides support for the back end (database connection pooling, declaritive transactions, declaritive security, standardized parameterization...) The most significant difference between a web application using only servlets and one using servlets with EJBs is that the EJB model mandates a separation between display and business logic. This is generally considered a Good Thing in non-trivial applications because it allows for internal reuse, allows flexibility by providing a separation of concerns, gives a logical separation for work, and allows the business logic to be tested separately from the UI (among others). Some of the hings that servlets and JSPs can do that EJBs cannot are: • • •
Respond to http/https protocol requests. (With JSP) provide an easy way to format HTML output. Easily associate a web user with session information
Some of the things that EJBs enable you to do that servlets/JSPs do not are: •
•
Declaritively manage transactions. In EJB, you merely specify whether a bean's methods require, disallow, or can be used in the context of a transaction. The EJB container will manage your transaction boundaries appropriately. In a purely servlet architecture, you'll have to write code to manage the transaction, which is difficult if a logical transaction must access multiple datasources. Declaritively manage security. The EJB model allows you to indicate a security role that the user must be assigned to in order to invoke a method on a bean. In Servlets/JSPs you must write code to do this. Note, however that the security model in EJB is sufficient for only 90% to 95% of application code there are always security scenarios that require reference to values of an entity, etc.
What restrictions are imposed on an EJB? That is, what can't an EJB do? Location: http://www.jguru.com/faq/view.jsp?EID=127037 Created: Aug 15, 2000 Modified: 2000-08-16 00:19:27.196 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3)
From the spec: • • • • • •
•
• •
• • • • • • • •
An enterprise Bean must not use read/write static fields. Using read-only static fields is allowed. Therefore, it is recommended that all static fields in the enterprise bean class be declared as final. An enterprise Bean must not use thread synchronization primitives to synchronize execution of multiple instances. An enterprise Bean must not use the AWT functionality to attempt to output information to a display, or to input information from a keyboard. An enterprise bean must not use the java.io package to attempt to access files and directories in the file system. An enterprise bean must not attempt to listen on a socket, accept connections on a socket, or use a socket for multicast. The enterprise bean must not attempt to query a class to obtain information about the declared members that are not otherwise accessible to the enterprise bean because of the security rules of the Java language. The enterprise bean must not attempt to use the Reflection API to access information that the security rules of the Java programming language make unavailable. The enterprise bean must not attempt to create a class loader; obtain the current class loader; set the context class loader; set security manager; create a new security manager; stop the JVM; or change the input, output, and error streams. The enterprise bean must not attempt to set the socket factory used by ServerSocket, Socket, or the stream handler factory used by URL. The enterprise bean must not attempt to manage threads. The enterprise bean must not attempt to start, stop, suspend, or resume a thread; or to change a thread's priority or name. The enterprise bean must not attempt to manage thread groups. The enterprise bean must not attempt to directly read or write a file descriptor. The enterprise bean must not attempt to obtain the security policy information for a particular code source. The enterprise bean must not attempt to load a native library. The enterprise bean must not attempt to gain access to packages and classes that the usual rules of the Java programming language make unavailable to the enterprise bean. The enterprise bean must not attempt to define a class in a package. The enterprise bean must not attempt to access or modify the security configuration objects (Policy, Security, Provider, Signer, and Identity). The enterprise bean must not attempt to use the subclass and object substitution features of the Java Serialization Protocol. The enterprise bean must not attempt to pass this as an argument or method result. The enterprise bean must pass the result of SessionContext.getEJBObject() or EntityContext. getEJBObject() instead.
Why do we have a remove method in both EJBHome and EJBObject? Location: http://www.jguru.com/faq/view.jsp?EID=127823 Created: Aug 15, 2000 Modified: 2000-08-16 07:27:14.72 Author: Wayne Kidd (http://www.jguru.com/guru/viewbio.jsp?EID=18969) Question
originally posed by kathir_75_mk resan (http://www.jguru.com/guru/viewbio.jsp?EID=117079 With the EJBHome version of the remove, you are able to delete an entity bean without first instantiating it (you can provide a PrimaryKey object as a parameter to the remove method). The home version only works for entity beans. On the other hand, the Remote interface version works on an entity bean that you have already instantiated. In addition, the remote version also works on session beans (stateless and statefull) to inform the container of your loss of interest in this bean. Is there a guarantee of uniqueness for entity beans? Location: http://www.jguru.com/faq/view.jsp?EID=128741 Created: Aug 16, 2000 Modified: 2000-08-16 22:17:23.973 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Dennis Dupont (http://www.jguru.com/guru/viewbio.jsp?EID=38842 [ I have looked through the EJB 1.1 spec for a requirement that containers guarantee that entity beans in the ready state are unique (i.e. that there is never more than one instance of a bean with a given primary key value). I cannot find such a guarantee, but I would expect one. Does anyone know if this is indeed the case? ] There is no such guarantee. The server (or servers) can instantiate as many instances of the same underlying Entity Bean (with the same PK) as it wants. However, each instance is guaranteed to have up-to-date data values, and be transactionally consistent, so uniqueness is not required. This allows the server to scale the system to support multiple threads, multiple concurrent requests, and multiple hosts. Comments and alternative answers
Though it may not be guaranteing the uniqeness, I... Author: ranak ranak (http://www.jguru.com/guru/viewbio.jsp?EID=129458), Aug 17, 2000 Though it may not be guaranteing the uniqeness, I feel the designer should make each primarykey unique. As a special case I wanted to create a dummy obect with a dummy primarykey in weblogic4.5. When I was trying to create two Objects with the same primarykey, it threw an Exception, as the other object was alreday in the Pool. Which is expected. So I used findByprimarykey to retrive the object instead. That's correct, but "unique" here meant ... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Aug 18, 2000 That's correct, but "unique" here meant "unique instance in memory" not "unique record in database." There must indeed be only one unique data representation corresponding to a primary key; however, the server may have multiple bean instances, in one or more servers, referring to that record (or set of records).
How can I call an EJB via an oracle stored procedure? Location: http://www.jguru.com/faq/view.jsp?EID=129099 Created: Aug 17, 2000 Modified: 2000-08-18 19:31:30.752 Author: Nicholas Whitehead (http://www.jguru.com/guru/viewbio.jsp?EID=1260) Question originally posed by Ramesh K (http://www.jguru.com/guru/viewbio.jsp?EID=118618 [My EJB is deployed on JRUN server and my bean's url is ejipt://rams.com:2323. ] There are a couple of ways you could potentially do this. You will need to select the one[s] which suit your environment best. The first is the time tested legacy method of calling any external routine from within an Oracle database, whcih is to have an external process running in the OS which is connected to the database. You then communicate with this process via DBMS_PIPEs and the external process becomes your agent by listening for commands, executing the call to your EJB, confirming the call and returning any applicable results. The other possible way to do this is to create an EJB client in the Oracle JVM. I think this is possible as of Oracle 8.1.6. The third way would be to use an external library call. I think you can still only do these in C, but you will probably be able to find a way to invoke an EJB from C. Why is it that business methods should not be declared final? Location: http://www.jguru.com/faq/view.jsp?EID=129282 Created: Aug 17, 2000 Modified: 2000-08-18 19:34:20.993 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by kathir_75_mk resan (http://www.jguru.com/guru/viewbio.jsp?EID=117079 I believe that the basic reason is that mandating non-final business methods allows container developers to implement their EJB container via inheritence. They can generate a class that extends your bean, with methods that perform transactional housekeeping, then call the inherited method (which is the one you wrote in your bean), then perform more housekeeping. That said, I know of no major container that does things this way (although some of the OODBMS vendors may) Why is ejbFindByPrimaryKey mandatory? Location: http://www.jguru.com/faq/view.jsp?EID=131680 Created: Aug 21, 2000 Modified: 2000-08-21 19:02:07.0 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by kathir_75_mk resan (http://www.jguru.com/guru/viewbio.jsp?EID=117079 An Entity Bean represents persistent data that is stored outside of the EJB Container/Server.
The ejbFindByPrimaryKey is a method used to locate and load an Entity Bean into the container, similar to a SELECT statement in SQL. By making this method mandatory, the client programmer can be assured that if they have the primary key of the Entity Bean, then they can retrieve the bean without having to create a new bean each time - which would mean creating duplications of persistent data and break the integrity of EJB. Is it safe to pass EJBObjects as parameters to remote objects that may be on another machine, or must you use the handle instead? Location: http://www.jguru.com/faq/view.jsp?EID=131683 Created: Aug 21, 2000 Modified: 2000-08-21 19:04:14.921 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Alex McManus (http://www.jguru.com/guru/viewbio.jsp?EID=117866 Yes, it is valid to pass references to remote objects as parameters to methods. The references that you are passing are actually RMI stubs to the remote objects. Generally, you should use the Handle when holding a reference to an EJB beyond the life of a client process. Comments and alternative answers
EJBObject and Handle Author: Stefano De Giorgi (http://www.jguru.com/guru/viewbio.jsp?EID=533178), Oct 29, 2001 What is the difference between serialize the EJBObject to disk and serialize Handle to disk? I look at WLS 6.0 code and I found that getHandle() instantiate an Handle that simply store in an instance variable a reference to the EJBObject. Thanks Re: EJBObject and Handle Author: John Quinn (http://www.jguru.com/guru/viewbio.jsp?EID=29646), Dec 11, 2001 I haven't looked at the WLS code, but if you look at the J2EE SDK source, you'll see that the essential idea of a Handle is that the information necessary to look-up the bean via JNDI is stored in the instance implementing Handle. Thus, when getEJBObject() is invoked on a Handle, the JNDI lookup is performed, and the container returns the RMI stub class necessary to instantiate the RMI stub implementing the remote interface. If you only serialize the remote, then the remote process that deserializes it may not have the RMI stub class in its classpath, and you'll get a ClassNotFoundException when deserialization is attempted. Re: EJBObject and Handle Author: Seetesh H (http://www.jguru.com/guru/viewbio.jsp?EID=1038574), Dec 17, 2002 Hi, With this u can achieve Activation and Passivation ie the state of the Session bean
can be stored using Object Serialization as it doesnt contain the ejbLoad and ejbStore methods contained in the Entity Bean only. Session bean uses object serialization and stores the handle to an external file say if the session bean is moved from ready to pooled state and again if the business methods on the pooled Session bean is called then the state of that object (in this case the handle ) can be recalled from the external file media. Hope this helps, Seetesh Is there a way that a Stateful Session Bean can remove itself when a transaction commits? Without this, the remove must be performed by the client that starts the transaction, which can be difficult when there may be non-stateful beans in-between. Location: http://www.jguru.com/faq/view.jsp?EID=131690 Created: Aug 21, 2000 Modified: 2000-08-21 19:05:49.861 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Alex McManus (http://www.jguru.com/guru/viewbio.jsp?EID=117866 You could leave this to the Container or do it yourself. Container - A solution would be to set a timeout value for the stateful session bean so that it will be removed after a shorter idle duration. Developer - If the above is not sufficient and you need to explicitly clean up the bean, you could try posting the Stateful Session Bean's handle in a JNDI context and have another object check the context, obtain the handle and then call remove on the home interface, passing in the handle as an argument. Remember that the Handle is Serializable, so there could be many variations on this strategy. Comments and alternative answers
Explicit remove versus timeout? Author: Jirka Hanika (http://www.jguru.com/guru/viewbio.jsp?EID=1189077), Jun 28, 2005 Why can't I simply call remove just after the last call to the stateful session bean returns to its (presumably stateless) caller, not relying on timeouts? I've verified that the container (Jboss 4) will still duly call beforeCompletion and afterCompletion on the stateful session bean. It seems to me that calling remove explicitly is a cleaner solution, as long as you can tell which call to the bean has been the last one in a transaction. I haven't checked what the spec says about this, however. Re: Explicit remove versus timeout? Author: Jirka Hanika (http://www.jguru.com/guru/viewbio.jsp?EID=1189077),
Jun 29, 2005 OK, I have checked. Apparently this Jboss 4 behavior is a bug. The remove call should have thrown RemoveException if called during the transaction. Is there an example of a shopping cart using Stateful Session Beans and a JSP client? Location: http://www.jguru.com/faq/view.jsp?EID=131697 Created: Aug 21, 2000 Modified: 2000-08-21 18:57:42.892 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by srikanth thati (http://www.jguru.com/guru/viewbio.jsp?EID=115168 You should download the sample Java Pet Store sample application, It's part of the J2EE Blueprints. http://java.sun.com/j2ee/download.html I've read that the Primary Key field can be a wrapper class. But, no where has it been mentioned if it can be any Java API class. To be specific, can java.util.Vector be a Primary Key class for my bean? Location: http://www.jguru.com/faq/view.jsp?EID=131699 Created: Aug 21, 2000 Modified: 2000-08-21 19:08:27.141 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by SRI NAGESH NAYUDU (http://www.jguru.com/guru/viewbio.jsp?EID=122079 I am not aware of any application Server that would allow a Vector to be specified as a primary key type for an Entity Bean. Logically when you think about it, there is no clear database type[s] that you would map it to in a relational database. If you are trying to make a compound Primary Key, then you should use a wrapper class that contains simple types. How can I pass init parameters to enterprise beans? Location: http://www.jguru.com/faq/view.jsp?EID=131729 Created: Aug 21, 2000 Modified: 2000-08-24 16:15:49.452 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Ivan Stoyanov (http://www.jguru.com/guru/viewbio.jsp?EID=102920 You can specify Environment Entries that are accesssible by your EJB's. Inside your ejb-jar.xml you define the environment entries. <env-entry> <env-entry-name>theParameter <env-entry-type>java.lang.String <env-entry-value>theValue
You can access the variable inside your EJB using the Environment Naming Context (in EJB 1.1) Context ctx = new InitialContext(); String val = (String)ctx.lookup("java:comp/env/theParameter"); How can I make a clone or duplicate of an entity bean? Also, can I do so within another EJB which does not have any knowledge about the entity bean it is referring to? I need to build an EJB which will take an(y) entity bean as input, make a copy and return the copy. Location: http://www.jguru.com/faq/view.jsp?EID=131733 Created: Aug 21, 2000 Modified: 2000-08-24 16:15:12.811 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Mathivanan Elangovan (http://www.jguru.com/guru/viewbio.jsp?EID=21981 You cannot make a clone of an Entity Bean. This is like inserting the same row into a database twice. What you may want to do is to make a copy of the values inside an Entity Bean, using the Details Object design pattern. See the pattern Description for more details. How can I access EJB from ASP? Location: http://www.jguru.com/faq/view.jsp?EID=131737 Created: Aug 21, 2000 Modified: 2000-08-24 16:34:53.634 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Chandramouli Srinivasan (http://www.jguru.com/guru/viewbio.jsp?EID=41323 You can use the Java 2 Platform, Enterprise Edition Client Access Services (J2EETM CAS) COM Bridge 1.0, currently downloadable from http://developer.java.sun.com/developer/earlyAccess/j2eecas/ Or, you can rewrite the ASPs as JSPs... :-) Is it possible to get notified somehow if a certain amount of time elapses during (within) a transaction or method call? I want to react if e.g. an EJBmethod doesn't react after a few seconds. Location: http://www.jguru.com/faq/view.jsp?EID=131988 Created: Aug 22, 2000 Modified: 2000-08-24 16:25:31.74 Author: Nicholas Whitehead (http://www.jguru.com/guru/viewbio.jsp?EID=1260) Question originally posed by Christoph Moser (http://www.jguru.com/guru/viewbio.jsp?EID=124776 The EJB descriptor defined session timeout (sessionTimeout in the WebLogic descriptor) will cause the remote call to throw an exception if the operation runs over that time. This will cause the operation to be rolled back if it is running in a transaction, but the caller will be notified by the exception so you can react accordingly. [Source code for ejb.xml, anyone? -Alex]
Comments and alternative answers
I think you mean: ... Author: Christoph Moser (http://www.jguru.com/guru/viewbio.jsp?EID=124776), Aug 24, 2000 I think you mean: 2
I only know session-timeout in web.xml regarding a http connection. The problem is that a rollback occurs AFTER the timeout, but the exception is thrown at the END of the transaction. The other problem is - I want to set the timeout value manually, during runtime. Re: I think you mean: ... Author: Venkata Chaganti (http://www.jguru.com/guru/viewbio.jsp?EID=996780), Sep 9, 2002 The timer option in EJB2.1 could provide you with what you need. My database has a column of type DATETIME. What type of Java variable do I use in the EJB? Location: http://www.jguru.com/faq/view.jsp?EID=132002 Created: Aug 22, 2000 Modified: 2000-08-24 16:22:39.892 Author: Nicholas Whitehead (http://www.jguru.com/guru/viewbio.jsp?EID=1260) Question originally posed by hemanth venkataraman (http://www.jguru.com/guru/viewbio.jsp?EID=117257 Question continues: [util.Date didn't work so i tried sql.Date and eventually java.sql.Timestamp. But timestamp needs to be formatted in ejbStore to be put in DB and also upon creation of the bean, timestamp must be formatted to be inserted in the db. But i can't format within the ejbCreate method itself. Where is such formatting to take place so that a java variable can be passed to a column of type DATETIME?] I am not sure why you cannot format in ejbCreate. I assume this is some sort of CMP issue. However, we experienced a similar issue where we needed to reference a database generated sequence in the creation of the entity bean, and the CMP process did not give us access to the generated number in ejbCreate. In this case, we used the ejbPostCreate method which is called directly after ejbCreate and I believe is specifically intended to support operations like yours. [OK, but the proper type is java.sql.Timestamp, right? -Alex] See also How do I map a Date/Time field to an Oracle database with CMP?
When (manually) deploying an EJB where do you specify the JNDI name that the bean is bound to in the JNDI tree? Location: http://www.jguru.com/faq/view.jsp?EID=132923 Created: Aug 23, 2000 Modified: 2000-08-24 18:56:25.582 Author: satyanarayana sairam (http://www.jguru.com/guru/viewbio.jsp?EID=132906) Question originally posed by Henrik Buch (http://www.jguru.com/guru/viewbio.jsp?EID=121686 [Questioner continues: According to the EJB1.1 spec there is no relation between the <ejb-name> tag in the deployment descriptor (or assembly descriptor) and the JNDI name. I can see that a client can use a "logical" name that can be mapped via vendor specific deployment info (e.g. orion-application-client.xml).] When you are deploying the application in using Web Logic 4.5.1 server, in the deployment wizard you can specify the JNDI name and using the same name you can look up from the client. [Is there any standard way to do it? If not, can someone give feedback with info for other servers? -Alex] Where can I find the API documentation for Enterprise JavaBeans (EJB)? Location: http://www.jguru.com/faq/view.jsp?EID=134139 Created: Aug 24, 2000 Modified: 2000-08-24 16:08:30.543 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) The EJB API documentation is available from Sun's J2EE API documentation page. When is the best time to use <ejb-link>? Do I have to use it everytime I want to make a reference from an EJB to another EJB? Location: http://www.jguru.com/faq/view.jsp?EID=136512 Created: Aug 28, 2000 Modified: 2000-08-30 13:03:42.154 Author: Siva Visveswaran (http://www.jguru.com/guru/viewbio.jsp?EID=46210) Question originally posed by TH Lim (http://www.jguru.com/guru/viewbio.jsp?EID=95720 [Questioner also submitted the following DD snippet: <session> ... <ejb-ref> <ejb-ref-name>ejbAddress <ejb-ref-type>Entity AddressHome Address <ejb-link>AddressEJB ... <entity> <ejb-name>AddressEJB <ejb-class>AddressBean AddressHome Address
... ] No - you don't have to use ejb-link every time you reference an enterprise bean component. It allows an Application Assembler to reference an EJB by name without the need to have unique names for all beans by constantly renaming them for the J2EE application. And, ofcourse, such cannot be guaranteed if one buys third-party bean components. The example you have shown is one way that assumes the reference's EJB is in the same ejb-jar file as the referencing bean. The other way is to use a path-name <ejb-link>../customers/customer.jar#AddressEJB where the referenced bean is in a different jar file. The Deployer is then responsible for binding the ejb-link references to the home of the target bean. Comments and alternative answers
What if the ejb we want to use/refer to is in another EAR? Author: neal ravindran (http://www.jguru.com/guru/viewbio.jsp?EID=17737), Aug 7, 2002 How do you reference an ejb in another EAR? (mind you not in a different jar in the SAME EAR, but an ejb in a DIFFERENT EAR altogether) My answer is that(referencing or using an ejb in another EAR) is impossible because another EAR will always have its own jndi tree. So we would be forced to have duplicate classes in different EARs if we had to use a common ejb? Re: What if the ejb we want to use/refer to is in another EAR? Author: Vishal T (http://www.jguru.com/guru/viewbio.jsp?EID=1095449), Jul 21, 2003 Neal did you find out the answer to this question. I'm trying to write an EJB called CommonMethods which is in another EAR as well and I wanted to know how I can include it in all my EJB. Thanks for your help, Vishal T Re[2]: What if the ejb we want to use/refer to is in another EAR? Author: Kirill Fakhroutdinov (http://www.jguru.com/guru/viewbio.jsp?EID=501201), Aug 27, 2003 J2EE 1.2, 1.3 specifications [see 5.3] clearly say: "allows to link an EJB reference ... to an enterprise bean ... in the same J2EE application". So it is clearly against J2EE specs to have EJB reference linked somehow to an EJB in another EAR file. Re[3]: What if the ejb we want to use/refer to is in another EAR? Author: Kirill Fakhroutdinov (http://www.jguru.com/guru/viewbio.jsp?EID=501201), Aug 27, 2003 But you still can use the global JNDI name of your EJB to locate and use it
from another application... Re[4]: What if the ejb we want to use/refer to is in another EAR? Author: Dirk Hogan (http://www.jguru.com/guru/viewbio.jsp?EID=1168604), May 5, 2004 Yes, and I believe that this is the motivation for the <ejb-link> entry in the first place: it allows ejb a to refer to ejb b (both in same .ear) even if ejb b is not bound to the global JNDI tree (i.e. not available for general consumption) via the app-server-specific deployment file. Re[2]: What if the ejb we want to use/refer to is in another EAR? Author: Sergey Manukyan (http://www.jguru.com/guru/viewbio.jsp?EID=1151410), Mar 4, 2004 Folks, how about using service locator pattern in this case? As EJB link is a kinda locates an EJB by some name for you, you can do it yourself in an independent way through some config file. Re: What if the ejb we want to use/refer to is in another EAR? Author: Guru Radhakrishnan (http://www.jguru.com/guru/viewbio.jsp?EID=1237197), Apr 7, 2005 Hi Friends, I was able to sucessfully call the EJB in another EAR from a Different EAR in websphere. I created a ejb Client JAR from the called EJB Project in WSAD( Or you can package the stubs manually if you are not using WSAD). I added the Client JAR to the maifest class path in Calling EAR and Dropped it under Calling EAR. I was able to access the EJB's services. That way you dont have to rebuild the code when every time called EAR Changes due to reasons anything apart from your interfaces. I have not tested this under clustered environment. I deployed both the ears in the same node. From R. Monson-Haefel's book on EJB I understand, that EJB clients that are EJB's themselves, use a somewhat different (namingcontext-)lookup method than 'regular' clients. But why ? Why the <ejb-ref> tag in the deployment descriptor and why the 'java:comp/env' namespace ? Location: http://www.jguru.com/faq/view.jsp?EID=136600 Created: Aug 28, 2000 Modified: 2001-01-25 20:45:47.599 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by murali krishna (http://www.jguru.com/guru/viewbio.jsp?EID=89398 The short answer is that the extra layer of indirection gives flexibility. Remember that the container is supposed to give you the ability to map each bean into a fairly arbitrary place in the JNDI namespace. Since the ejb-ref tag allows you to indicate the interface you're interested in and the JNDI name that its home will be bound to, the Deployer can make different decisions about these things than the Bean Developer did. As an example, suppose an industry group defined a set of standard EJB interfaces for, say, HR applications. Different vendors would implement EJB suites that
implemented these interfaces, and J2EE applications that used them. If the beans were written using the <ejb-ref> tag, rather than 'knowing' one another's JNDI names (which can be done, by the way), you could, theoretically, mix and match EJBs and applications to build a solution that best fits your company, simply by changing mappings. Of course, this is theoretical: at this stage of the technology, I'd be really surprised if everyone involved actually did things 'right'. The java:comp/env namespace was put into the 1.1 spec to simplify this and a couple of other things. Putting all of these mappable elements under a consistent JNDI context helps to ensure interoperability by encouraging consistency. Note that this can also be used for things like global settings for a bean (say a threshold of change to a salary that may only be done by someone in the 'HR Manager' role). This all makes the most sense when you remember that EJB (and J2EE as a whole) is a Component specification: since each of these things is a component, it should be configurable to work with other components without code changes. Note also that recent J2EE specs have implied that the client should be getting references in much the same way. In fact, the 1.3 spec (available from javasoft.com as a public draft) indicates that the application client deployment descriptor can include <ejb-ref> stanzas Comments and alternative answers
ejb reference Author: pramod talesara (http://www.jguru.com/guru/viewbio.jsp?EID=1067448), Mar 18, 2003 I am still not clear about ejb reference.Can any one explan me with some example. Is there any default cache management system with Entity beans ? In other words whether a cache of the data in database will be maintained in EJB ? Location: http://www.jguru.com/faq/view.jsp?EID=136858 Created: Aug 28, 2000 Modified: 2000-11-05 16:12:24.651 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Karthikeyan Natarajan (http://www.jguru.com/guru/viewbio.jsp?EID=129334 Caching data from a database inside the Application Server are what Entity EJB's are used for. The ejbLoad() and ejbStore() methods are used to synchronize the Entity Bean state with the persistent storage(database). Transactions also play an important role in this scenario. If data is removed from the database, via an external application - your Entity Bean can still be "alive" the EJB container. When the transaction commits, ejbStore() is called and the row will not be found, and the transcation rolled back. Comments and alternative answers
I wrote a simple CMP entity bean that maps to one... Author: steven liu (http://www.jguru.com/guru/viewbio.jsp?EID=120740), Sep 1, 2000 I wrote a simple CMP entity bean that maps to one table in MSSQL7. I find that it (EJB , ias ? ) will access the database everytime when I call any methods of that EJB. I think that is because of transaction. But I can only choose 'Required', 'RequiresNew' or 'Mandatory' for the transaction attribute. If I try to select others, the verify will fail. My question is that: my CMP entity bean seems to work without any cache , what is wrong ? ( My environment is IAS on windows and SQL7.0 . Thanks .) Architecturally speaking, under what circumstances must I consider adding EJB into the mix when building web-based applications using servlets and JSP? Location: http://www.jguru.com/faq/view.jsp?EID=137169 Created: Aug 28, 2000 Modified: 2000-08-28 21:39:26.129 Author: Govind Seshadri (http://www.jguru.com/guru/viewbio.jsp?EID=14) The following thread within the Server-side discussion forum at Javaworld offers some concrete guidelines as to when to add EJB into the mix when designing large web-based applications. Can I use the latest version of Tomcat inside Sun's J2EE implementation? Location: http://www.jguru.com/faq/view.jsp?EID=140438 Created: Sep 1, 2000 Modified: 2000-09-06 13:47:18.86 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Alex Chaffee PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=3 The J2EE reference implementation ships with Tomcat. The classes for Tomcat are located inside the \lib\j2ee.jar. If you wanted to use the latest version of Tomcat you would have to replace the classes in this archive. This would of course not be supported. [Does anyone have experience/advice about updating this JAR? -Alex] Does the EJB specification allow for such products as the Java Cryptography Architecture (JCA) and other security APIs, to be used from within session beans? What are the potential issues that would need to be addressed from doing this? Location: http://www.jguru.com/faq/view.jsp?EID=201418 Created: Sep 8, 2000 Modified: 2000-09-11 09:21:33.378 Author: Ron Kurr (http://www.jguru.com/guru/viewbio.jsp?EID=132270) Question originally posed by Benjamin McCartney (http://www.jguru.com/guru/viewbio.jsp?EID=109357 I don't believe the specification talks about using any of the crypto APIs or frameworks. The spec talks about restricting access to particular methods on a bean
and that is handled by the container using information encoded in the deployment descriptor. If you are just talking calling some crypto APIs, I can't think of anything that would prevent you from doing cryto work from inside a session bean. Once you are inside a bean, you can pretty do whatever you want, with just a few exceptions. Comments and alternative answers
The 'exceptions' mentioned above are listed in section... Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362), Sep 12, 2000 The 'exceptions' mentioned above are listed in section 18.1.2 of the EJB 1.1 specification under the heading - 'Programming Restrictions' Can the bean class which implements either javax.ejb.EntityBean or javax.ejb.SessionBean be inherited from any other class? Location: http://www.jguru.com/faq/view.jsp?EID=201831 Created: Sep 10, 2000 Modified: 2000-09-11 09:24:29.398 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Harpreet Bakshi (http://www.jguru.com/guru/viewbio.jsp?EID=104226 Yes it can, refer to the following sections of the EJB 1.1 specification: Session Beans (Section 6.10.2) The session bean class may have superclasses and/or superinterfaces. If the session bean has superclasses, then the business methods, the ejbCreate methods, the methods of the SessionBean interface, and the methods of the optional SessionSynchronization interface may be defined in the session bean class, or in any of its superclasses. Entity Beans (Section 9.2.2) The entity bean class may have superclasses and/or superinterfaces. If the entity bean has superclasses, the business methods, the ejbCreate and ejbPostCreate methods, the finder methods, and the methods of the EntityBean interface may be implemented in the enterprise bean class or in any of its superclasses. Keep in mind that the superclass must adhere to the rules and restrictions set out in section 18.1.2 of the specification. Is there a profiler application that runs with BEA Weblogic App Server (v4.51) so that I can monitor my EJB's and server-side Java classes? Location: http://www.jguru.com/faq/view.jsp?EID=201936 Created: Sep 10, 2000 Modified: 2000-09-11 09:28:25.547 Author: shilpa Tiwari (http://www.jguru.com/guru/viewbio.jsp?EID=138841) Question originally posed by Ashok Nair (http://www.jguru.com/guru/viewbio.jsp?EID=12502 Intuitive Systems Inc 's OptimizeIt is a profiler application that integrates with many application servers including WebLogic 4.5.1.
OptimizeIt basically has an audit program running within WebLogic's VM once it is integrated with WebLogic (this integration involves changes to the weblogic's policy file and the weblogic's start script). The OptimizeIt client ( user interface) then attches to this audit system which is tracking the weblogic VM. This way you can attach to the weblogic server and see the profiling information through the GUI. OptimizeIt also provides for distributed profiling wherein you can attach to optimize its audit system running in a remote machine's Virtual Machine (VM). You can find the details and download the product from http://www.optimizeit.com Is there any reason why value objects cannot have set methods? Location: http://www.jguru.com/faq/view.jsp?EID=204044 Created: Sep 12, 2000 Modified: 2000-09-12 18:47:36.947 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Alan Josephson (http://www.jguru.com/guru/viewbio.jsp?EID=19134 Alan's original question (in full) was: The J2EE spec strongly recommends the use of Value Objects (simple, structure-like classes) for passing data back and forth between EJBs and EJB clients. These objects are characterized by get methods for accessing class variables and the use of wholesale constructors. Is there a technical reason why these objects cannot have set methods? Or is it purely to reinforce the notion that I am not directly interacting with an EJB object? Specifically, I would like to get a value object from an EJB method, update some of the data, and ship it back. Of course, value objects are necessarily serializable. In my opinion, he answered his own question: value objects may contain any methods you like, including setters. It's just Java. In fact, I usually provide setters for mine. If anyone knows of a reason not to, please submit feedback. Comments and alternative answers
We are currently doing a big EJB development and all... Author: chris hunter (http://www.jguru.com/guru/viewbio.jsp?EID=16315), Sep 13, 2000 We are currently doing a big EJB development and all our value objects (models) have setters as well as sets in the constructor. We also provide an empty constructor that creates an empty value object which we can then use the setters to populate. Where a value object has a large number of properties but only a few need to be set, this keep the code cleaner - its easier than haveing 20-30 nulls in the constructor. Chris Hunter System Dynamics Ltd www.System-Dynamics.co.uk Re: We are currently doing a big EJB development and all... Author: Arun Balaji (http://www.jguru.com/guru/viewbio.jsp?EID=119257), Aug 10, 2001 Chris wrote: "this keep the code cleaner - its easier than haveing 20-30 nulls in the constructor"
You could have overloaded versions of the constructors : - A protected version to be used by the engine - and a public one to be used by the client. Value objects are recommended when data has to be ... Author: Paul Done (http://www.jguru.com/guru/viewbio.jsp?EID=94469), Sep 14, 2000 Value objects are recommended when data has to be returned from an EJB server to the EJB client, if none of the data has to be updated. ie. The value objects are used to transport read-only data. It is the equivalent of the client requesting XML from the server tier, except you get the tighter compile time binding and control, and you don't have to parse the returned XML. If, instead, an equivalent EJB reference with the same 'getter' methods is returned, then each time the client calls a getter method on the reference EJB, this results in a remote method call to the server tier. This is an uneccessary round trip, when the object could have held the data locally itself. So basically, value objects are recommended to enable your multi-tier application to be more performant. If you do need to update data, then you may need to use an EJB reference instead. However, this fine grained querying/updating of data could become a severe performance bottleneck, if lots of it is performed. The traffic between different tiers needs to be minimised. Instead, EJBs should be used by clients for more coarse granied method invocations. For example, the client could call a session bean on the server to get a complex data set (encapsulated in a value object), instead of just 1 row of data from 1 table. The server session bean may have used many entity beans or jdbc directly, behind the scenes on the server tier, however, this is hidden from the client. Once the client recieves the complex value object, it can do as many local method calls, as it likes on it to get the data. Then a new (or the same) object could then be constructed with all the updated data. The client would then pass this object back to the server, to perform the update, by calling the appropriate method on the remote session bean, passing the new value object as the parameter. EJB/RMI is sometimes touted as a way to write a multi-tier application, as if it is a single tier application , without having to architect your design to cope with cross-tier communications. In reality, though, any design has to compromise to take account of these cross-tier performance issues.
See http://www.monson-haefel.com/ejbtips/ejbtip_2.... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Sep 28, 2000 See http://www.monson-haefel.com/ejbtips/ejbtip_2.html Can an EJB send asynchronous notifications to its clients? Location: http://www.jguru.com/faq/view.jsp?EID=206459 Created: Sep 14, 2000 Modified: 2000-09-14 19:43:44.527 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Paul Chuang (http://www.jguru.com/guru/viewbio.jsp?EID=132238 [. e.g. the client displays alarm status of devices. If I use EJB to periodically check the database for alarm status change, how to program the EJB to forward notification to clients when the status is changed? ] Asynchronous notification is a known hole in the first versions of the EJB spec. The recommended solution to this is to use JMS, which is becoming available in J2EEcompliant servers. The other option, of course, is to use client-side threads and polling. This is not an ideal solution, but it's workable for many scenarios. See also OK, so EJB doesn't support user-created threads. So how do I perform tasks asynchronously? . Is it better to use JRUN Connection Pooling or native Connection Pooling? Location: http://www.jguru.com/faq/view.jsp?EID=207119 Created: Sep 15, 2000 Modified: 2000-09-17 14:14:23.557 Author: Siva Visveswaran (http://www.jguru.com/guru/viewbio.jsp?EID=46210) Question originally posed by chuck lyons (http://www.jguru.com/guru/viewbio.jsp?EID=136859 As quoted by Allaire: When Not to Use JRun Connection Pooling If the JDBC driver that you are using already supports the JDBC 2.0 Connection Pooling, Allaire recommends not using the JRun Connection Pooling mechanism for that driver. The vendor is probably able to leverage database-specific features when pooling that are much more efficient and/or robust than a generic connection pool could provide." See this link: http://www.allaire.com/handlers/index.cfm?ID=17266&Method=Full&Title=JRun%20 3%2E0%20Connection%20Pooling&Cache=False Should I use CMP or BMP for an application with complex data manipulation & relations? Location: http://www.jguru.com/faq/view.jsp?EID=208299 Created: Sep 17, 2000 Modified: 2000-09-17 15:44:33.499 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question
originally posed by srinivasa rao (http://www.jguru.com/guru/viewbio.jsp?EID=139339 Generally, you should use CMP unless you're forced to use BMP due to limitations of the mapping tools. Also, "complex" is relative; some relatively complex data models can be captured with mapping tools, but some cannot. (Please submit feedback if you disagree :-) ) Comments and alternative answers
I'd be cautious about CMP at this point (EJB 1.1 spec):... Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644), Sep 20, 2000 I'd be cautious about CMP at this point (EJB 1.1 spec): different containers have vastly different capabilities and make vastly different assumptions. If you know that you're going to stay with a particular container for the forseeable future, and you know that it will support your level of complexity, you should be mostly safe. Container CMP implementation will still throw you for a loop or two, but if you don't need portability between containers you should be able to work around these things. Can I combine two or more finder functions with AND or OR operator to get one result collection? Location: http://www.jguru.com/faq/view.jsp?EID=208328 Created: Sep 17, 2000 Modified: 2000-09-17 15:56:16.053 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) Question originally posed by Seong Jin Cho (http://www.jguru.com/guru/viewbio.jsp?EID=141453 You'd have to do that sort of thing on the client side. Naturally, since find* methods can return many different types of Java objects, you'd have to write custom code based on the signature of the particular methods you used. Easiest would be if your find methods returned java.util.Set or java.util.List; you could then addAll() them both to a java.util.Set for OR, and write a simple loop for AND, like List result1 = bean.findBySomething(); List result2 = bean.findBySomethingElse(); Set resultAnd = new HashSet(); for (Iterator i = result1.iterator(); i.hasNext(); ) { Object x = i.next(); if (result2.contains(x)) { resultAnd.add(x); } } For session beans, we can use the SessionSynchronization interface. For entity beans, how do we have control over a transaction? Location: http://www.jguru.com/faq/view.jsp?EID=208599 Created: Sep 17, 2000 Modified: 2000-09-18 00:18:03.278 Author: Anoop Sehdev (http://www.jguru.com/guru/viewbio.jsp?EID=208040)
Question originally posed by Parag Bhagwat (http://www.jguru.com/guru/viewbio.jsp?EID=52244 The SessionSynchronization interface is used by the Session beans to Synchronize the Instance variables after a rollback or after a commit operation, because container does not have any other way to inform the bean of these operations. With Entity beans, this is not a problem as the Container automatically calls the ejbLoad method that refreshed the values from the database. I hope it clarifies the doubt. Can I set the data represented by the BMP Entity Bean to null in ejbStore, once it's updated in the database? Location: http://www.jguru.com/faq/view.jsp?EID=211129 Created: Sep 20, 2000 Modified: 2000-09-20 11:12:03.969 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by Prashant Altekar (http://www.jguru.com/guru/viewbio.jsp?EID=207066 [Question continues: Every business method is always called after an ejbLoad. Therefore the bean has no reason to hold on to the memory for the data between an ejbStore and subsequent ejbLoad. This becomes important when such data is huge and the bean is accessed infrequently. ] Theoretically, you could set your data to null after ejbStore, unless your container implements a caching optimization that skips ejbLoad in some cases (even then you could turn it off) However, the purpose of the EJB specification is to allow application programmers (Bean Providers, in your case) to operate in blissful ignorance of resource and transaction management concerns. A well-written container will swap unused beans out if neccessary. In fact one instance of your entity bean implementation class might be used to represent one logical entity (say with primary key value '1234') in one transaction and another logical entity (primary key value '5678') in the next transaction a couple milliseconds later. Because of this, it is rather important that your ejbLoad method initialize all fields, to avoid side-effects. Having said this, the real answer is "Go ahead, but don't worry about it unless 'huge data' means multi-megabyte stuff" Which application server is best for EJB deployment? [Go crazy, folks: I expect a nice flame war on this one :-) -A] Location: http://www.jguru.com/faq/view.jsp?EID=211362 Created: Sep 20, 2000 Modified: 2000-09-21 10:13:57.496 Author: Ravi kalidindi (http://www.jguru.com/guru/viewbio.jsp?EID=41528) Question originally posed by Tariq Mahmood Gill (http://www.jguru.com/guru/viewbio.jsp?EID=29492
Weblogic is definitely better among other servers.i worked on weblogic and websphere.weblogic is best for deployment.i am hearing that Iplanet server too giving lot of troubles. ravi kalidindi Comments and alternative answers
Gemstone J is the premiere application server. We have... Author: Ike Kotlyarsky (http://www.jguru.com/guru/viewbio.jsp?EID=46599), Sep 22, 2000 Gemstone J is the premiere application server. We have evaluated numerous application servers, including WebLogic, Inprise and WebShpere. When it comes to deploying enterprise applications and when scalability , fault tolerance and high availability are the issues Gemstone by far is the winner. It's a shame an IBM can call their product an Application server. It is nothing more than a Servlet engine which you have to bring down every 8 hours dew to the Naming services failures. No wonder they giving it away for free. Well it is not for free. The big blue still finds the way to back stab their client by charging consulting fees for a failure of a product. Re: Gemstone J is the premiere application server. We have... Author: me x (http://www.jguru.com/guru/viewbio.jsp?EID=505632), Sep 27, 2001 Gemstone is year(s) behind the J2EE specification, deployment and development are painfully slow, bugs take a long time to be fixed, and the app server (for Java at least) is no longer supported. But other than that.... it sucks. http://www.jboss.org, nuff said. Author: Bruce Durling (http://www.jguru.com/guru/viewbio.jsp?EID=4932), Sep 22, 2000 http://www.jboss.org, nuff said. My vote is for BEA Weblogic server. I am working with... Author: girish bhatia (http://www.jguru.com/guru/viewbio.jsp?EID=27703), Sep 27, 2000 My vote is for BEA Weblogic server. I am working with weblogic since last 2 years and have pretty much developed a preference for this server. with release 5.1, it support the xml deployment descriptor and provides a nice way of hot deploying the beans without restarting the server. Webgain has added another plus with this app server. I have not yet much worked with webgain, but seems that webgain and weblogic combination is a wining combination for web development. -Girish Bhatia Yeh i also prefer Weblogic server for deployement ... Author: rama mohan gupta (http://www.jguru.com/guru/viewbio.jsp?EID=123355), Sep 28, 2000 Yeh i also prefer Weblogic server for deployement purpose that other present
application servers available in the market. But according to me Websphere is also good for serverside transactions. I would use anything BUT Websphere. Websphere (3.02)... Author: Peter Abelsson (http://www.jguru.com/guru/viewbio.jsp?EID=49686), Oct 2, 2000 I would use anything BUT Websphere. Websphere (3.02) administration is a mess, everything you do in the administration interface is painfully slow. I can't understand how IBM actually charges money for such an imature and buggy product, they should be ashamed. If people complain about Microsoft releasing buggy products they should give Websphere a try and they will consider Micorosft products virtually buggfree. The only reason you would use Websphere is if higher management was fooled into buying it by IBM-sales. Use Weblogic, Orion (www.orionserver.com), Allaire Jrun, jBoss or anything else. Don't be fooled by big blue. Which application server is best for EJB deployment?... Author: Michael Taylor (http://www.jguru.com/guru/viewbio.jsp?EID=19453), Nov 3, 2000 Which application server is best for EJB deployment? Not JRUN3.0. I've been evaluating this Application Server for a week. It is absolutely impossible. Being entirely html based, you are completely left with editting property files and xml by hand (if you know which ones to edit). The documentation does not help much either. You have to browse through their example codes to discover required vender specific property file settings. JRUN3.0 doesn't even have a simple xml deployment descriptor tool. Even JBOSS gives you that and its free! In conclusion, this is a cheap, you get what you pay for, application server. Use anything else... Cretainly IBM WebSphere is not the right server for... Author: SivaKumar Parthasarathy (http://www.jguru.com/guru/viewbio.jsp?EID=269373), Dec 6, 2000 Cretainly IBM WebSphere is not the right server for deploying EJB's. I am having troubles locating correct documentation on deployment in WebSphere. Java:API:EJB:Products Best Application Server Author: Anand Gopal (http://www.jguru.com/guru/viewbio.jsp?EID=429707), May 28, 2001 Weblogic & Websphere both are good for deployment ..I worked on these servers & NAS (Netscape Application Server ) also .. If u want only good deployment then Weblogic is slightly better than Websphere ., If u want good deployment plus good debugger then choose Websphere .... NAS is pretty slow compare to these above servers ... for LDAP, NDS is better .. for Web sever also Netscape product NES is better ... Re: Java:API:EJB:Products Best Application Server Author: Praveen AB (http://www.jguru.com/guru/viewbio.jsp?EID=1120460), Oct 8, 2003
I have been working on WEBLOGIC since 3 years. I have worked on weblogic version 5.1 onwards. According to me no other application server till today can beat weblogic. Its deployment and performance are wonderful. The latest weblogic workshop is also good. I have worked on IBM Websphere as well as JBoss. They are ok only. Re[2]: Java:API:EJB:Products Best Application Server Author: sudhakar p R (http://www.jguru.com/guru/viewbio.jsp?EID=1224404), Jan 31, 2005 I think deployment on Weblogic 6.1 is extremely easier compared to websphere.websphere admin console is certainly crap..weblogic is way ahead of websphere in admin console..its pretty fast,eeasy and more important, intuitive!Well, Jrun asfar asi know , its doedesont qualify to be called an app server.it sucks!! I want to access a session EJB deployed on a Websphere 3.02 from the web container of a Weblogic 4.51 Server. Both servers are running on machines behind the firewalls of two different corporate networks. What are the viable solutions here? Location: http://www.jguru.com/faq/view.jsp?EID=215121 Created: Sep 25, 2000 Modified: 2000-09-28 19:26:28.397 Author: Shyam L (http://www.jguru.com/guru/viewbio.jsp?EID=29689) Question originally posed by Peter Makumbi (http://www.jguru.com/guru/viewbio.jsp?EID=57706 You deploy the EJB on the Websphere server and include the deployed EJB jar file in the classpath of the client on the Weblogic server. All other things remain the same. Comments and alternative answers
I want to comment on the answer by Shyam L. Syham... Author: Peter Makumbi (http://www.jguru.com/guru/viewbio.jsp?EID=57706), Oct 2, 2000 I want to comment on the answer by Shyam L. Syham says that you simply deploy on Websphere (WS) and access from Weblogic (WL). It is simple to see that this won't work. WS 3.02 and WL 4.5.1 use different JNDI RMI SPI impelementations. WS uses an IBM implementation based on IIOP, whereas WL uses the propriatary T3 Protocol. So this can only work if you use the IBM JNDI implementation on the WL server. But once again you will later have problems with getting RMI over IIOP through the corporate firewalls. So My original question actually poses two questions. Pemak Re:I want to comment on the answer by Shyam L. .. Author: rajesh kohir (http://www.jguru.com/guru/viewbio.jsp?EID=470184), Sep
19, 2001 Hi Peter, Have u got the solution for ur problem?. i am also facing samr problem. My Servlets sits on iPlanet Web Server and EJB on Web Logic. Now i have to call EJB fuctions from servlet. it is failling at lookup() function and saying class not found Exception. Kindly Please Provide Answer as soon as possible. my email id :[email protected] -Rajesh Kohir To Peter Makumbi Author: Rajesh S (http://www.jguru.com/guru/viewbio.jsp?EID=460704), Jul 24, 2001 I am facing the same problem as described by you. Did you find any answers for the question. If so could you please provide me the solution in this forum. You can also email be at [email protected]. You can't access EJB's across firewall Author: Raees Uzhunnan (http://www.jguru.com/guru/viewbio.jsp?EID=281081), Feb 14, 2002 You can't access EJB's across firewall, They work on IIOP protocol. You may have to introduce SOAP to your architecture to facilitate object access across firewalls When I try to run J2EE SDK Deploytool.bat it doesn't start and gives: Exception in thread "main" java.lang.NullpointerExcception. How can I fix this? Location: http://www.jguru.com/faq/view.jsp?EID=217722 Created: Sep 28, 2000 Modified: 2000-09-28 19:20:31.021 Author: raviprolu pavan kumar (http://www.jguru.com/guru/viewbio.jsp?EID=217700) Question originally posed by Vicky Jain (http://www.jguru.com/guru/viewbio.jsp?EID=134906 Maybe I can tell you some points which you have to remember while using deploytool. These steps maybe helpful to anybody using the tool. 1. When first running the deploytool set the JAVA_HOME and J2EE_HOME. Maybe you have done this. In case you did not do then you have to set the Homes. 2. If you get 'out of environment space' then adjust the environment space in the DOS window 3. Once you have opened the UI and used it, and you are about to close it, make sure that 'No applications are open'. All applications should be closed. Otherwise if you close the UI with some applications open, next time you cannot open the tool. I think this is your problem. If in case this is your problem follow these steps, i) cleanup all the deployed applications ii) uninstall J2EE iii)remove the directory after backing up your work
iv) install J2EE again v) copy back your backup into j2ee The process is cumbersome. So avoid any open applications on the deploytool UI before exiting deploytool. I hope Sun will correct this bug soon. Comments and alternative answers
You may like to try and rename the folder where you... Author: Munusamy Shanmugavelu (http://www.jguru.com/guru/viewbio.jsp?EID=228254), Oct 13, 2000 You may like to try and rename the folder where you have saved the application .ear files and start the deploytool again What is an intermediate data access object and what are the advantages and disadvantages of using it? Location: http://www.jguru.com/faq/view.jsp?EID=217790 Created: Sep 28, 2000 Modified: 2000-09-28 19:29:19.386 Author: WEICONG WANG (http://www.jguru.com/guru/viewbio.jsp?EID=217785) Question originally posed by pradeep patra (http://www.jguru.com/guru/viewbio.jsp?EID=40386 Check http://www.monson-haefel.com/ejbtips/ejbtip_2.html Comments and alternative answers
Um, that's describing a "value object" or... Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Sep 28, 2000 Um, that's describing a "value object" or "bulk accessor," which *might* be the same thing as an intermediate data access object. I'd also think that an object that contains JDBC calls (for example) would also fit that term. Re: Um, that's describing a "value object" or... Author: Arun Balaji (http://www.jguru.com/guru/viewbio.jsp?EID=119257), Aug 10, 2001 I am not sure why WEICONG WANG has posted the link for a Bulk Accessor a.k.a Value Object Value Object (VO) and Data access object (DAO) are two distinct patterns - they serve different purposes. A VO is a simple wrapper to send coarse grained data across the network efficiently (instead of many fine grained getters which are costly.) A DAO is designed to remove SQL logic from a BMP to a stand alone class to abstract different data sources. You could also reuse this DAO class to access it from a Session bean ;-) See the J2EE design Pattern catalog for details:
http://java.sun.com/j2ee/blueprints/design_patterns/index.html What happens when a client calls an entity bean's home interface create() method and an entity bean already exists with that primary key, created previously by another client ? Also what happens when a client calls an entity bean's home interface findByPrimaryKey() method and an entity bean does not already exist with that primary key ? Location: http://www.jguru.com/faq/view.jsp?EID=218876 Created: Sep 29, 2000 Modified: 2000-10-03 10:27:35.489 Author: Anil Datt (http://www.jguru.com/guru/viewbio.jsp?EID=20887) Question originally posed by paul martin (http://www.jguru.com/guru/viewbio.jsp?EID=200835 If the primary key already exists DuplicateKeyException is thrown, i.e if your Create method is defined to throw a CreateException, CreateException is thrown. DuplicateKeyException is the sub class of CreateException. For findByPrimarykey ObjectNotFoundException is thrown, i.e if your findByPrimarykey method is defined to throw a FinderException, FinderException is thrown. ObjectNotFoundException is the sub class of FinderException. What is the difference between session and entity beans? When should I use one or the other? Location: http://www.jguru.com/faq/view.jsp?EID=221545 Created: Oct 3, 2000 Modified: 2000-10-03 10:09:38.175 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) An entity bean represents persistent global data from the database; a session bean represents transient user-specific data that will die when the user disconnects (ends his session). Generally, the session beans implement business methods (e.g. Bank.transferFunds) that call entity beans (e.g. Account.deposit, Account.withdraw). Please see What is an entity bean? and What is a session bean? for more information. Is it possible to use EJB in architecting a multi-user collaborative application? If so, how might it work, and what are some pitfalls to avoid? Location: http://www.jguru.com/faq/view.jsp?EID=221563 Created: Oct 3, 2000 Modified: 2000-10-03 10:40:23.059 Author: Ron Kurr (http://www.jguru.com/guru/viewbio.jsp?EID=132270) Question originally posed by Troy Echols (http://www.jguru.com/guru/viewbio.jsp?EID=56375 EJBs are useful in a variety of situations. If you wish to build your application using components, require transactions, or don't wish to manage some of the basic
infrastructure needed for a server (such as thread and connection pooling), then an EJB container may be the way to go. I think the first step is to decide which EJB spec you want to design against. EJB 1.0 and EJB 1.1 have some differences that you might want to account for in your design. Collaboration implies to me that some database persistence is needed. You'll need to decide if you should use entity beans to fill that role. If you need pub-sub notification or point-to-point message queues, you'll need to verify that the JMS and EJB vendors can operate together transactionally. Although the EJB spec does "gurantee" a certain amount of standarization between vendors, you'll still find differences between containers. You might want to build an abstraction that can help isolate you from those differences. Your build process will also need to account for the different EJB tools that each vendor supplies. If you are sure that you'll never switch EJB vendors, you can probably ignore the previous advice. If you try to be vendor agnostic, however, be aware of some of the neat things that vendors give you that isn't part of the spec, such as clustering. If scaling is an issue, try to be as stateless a possible. Using Stateless Session beans is helpful in that area. Finally, your developers must be fully aware that their EJBs will be operating in a multi-threaded environment and code accordingly. Too much synchronization will slow down the system and not enough may corrupt it. Developer education and debugging/analysis tools can help in that area. Threading is hard to get right and it doesn't help that each platform's thread scheduling can behave differently (such as NT vs. Solaris). Is it possible to use container-managed persistence and take advantage of database triggers and sequences to populate the primary key? If so are there any good examples? Location: http://www.jguru.com/faq/view.jsp?EID=221605 Created: Oct 3, 2000 Modified: 2000-10-03 10:41:24.739 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by Paul Osborne (http://www.jguru.com/guru/viewbio.jsp?EID=126223 I'll talk about sequence type mechanisms first: triggers probably won't work for reasons I'll discuss later. The technique you'd want to use would be to retrieve your new key value in your ejbCreate method(s) and assign it to the appropriate field in your bean. That way the CMP mechanism in the container can pick it up and will have an identity for your bean. Note that your ejbCreate method needs to return an instance of your primary key class (in EJB 1.1 - if you're still at 1.0, consider a different container) You should be able to get your value with a little bit of BMP looking code: get the DataSource from JNDI (ctx.lookup("java:comp/env/jdbc/MyConnection") type things), get a Connection from the DataSource, then execute the SQL ("SELECT myseq.nextval from dual" if i remember Oracle correctly). Remember to close the connection to ensure taht it is re-pooled properly. Triggers probably won't work (assuming you were going to use them to assign values to the primary key columns directly). This is because most containers really, really
think they need to know the value of your primary key ahead of time, largely (I believe) to make sure that their cache is right, but also because they really need to explicitely check for key-violations themselves so that they can throw DuplicateKeyException (catching and interpreting the SQLException from the JDBC driver would be vendor dependent and would also have to assume that the primary key columns are actually defined as primary keys - not a safe assumption for a container to make, unfortunately) By the same token, you'll not be able to get your CMP container to emit SQL that hits your sequence within the insert statement: it requires assumptions that container developers just can't make (like the existence and syntax of your RDBMS' sequence feature, as well as all of the above). Comments and alternative answers
Are you sure ? Author: Jeff Halleux (http://www.jguru.com/guru/viewbio.jsp?EID=443307), Jul 24, 2001 Section 9.4.2 of the EJB Spec states : ...the implementation of the ejbCreate(...) methods should be coded to return null. The returned value is IGNORED by the Container. JFH Can my ejbFind methods have return types like RowSet or Vector, or should it be only of type Enumeration? Location: http://www.jguru.com/faq/view.jsp?EID=222462 Created: Oct 4, 2000 Modified: 2000-10-06 22:06:36.259 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by Prashanthi Pokala (http://www.jguru.com/guru/viewbio.jsp?EID=215308 The 1.1 spec. says that ejbFindXXX methods must return either a primary key or a collection of primary keys, and refers to the section (9.1.8) where the return types of home interface finder methods is defined. This specifies either Enumeration or Collection. Since, in Java 2, Vector implements Collection, you should be able to return a vector, but given the restriction in section 9.1.8, you will probably have to declare your return type as Collection. Declaring Vector as your return type might work in some containers, but I wouldn't expect it to be portable. Returning RowSet will just not work. as the container will not know what to do with it. Comments and alternative answers
Can my ejbFind methods have return types like RowSet or Vector, or should it be only of type Enumeration? Author: Parag Bharambe (http://www.jguru.com/guru/viewbio.jsp?EID=741714), Feb
6, 2002 Suppose I have an option of using vector and Enumerator for finder query which return me multiple queries? Which one will give me better performance? Suppose multiple records are retrived from Database. Is it Application server cache the retrived data , or each record is fetched from Oracle database cache?
Is there any performance problem with calling one EJB from another EJB running in the same container? Location: http://www.jguru.com/faq/view.jsp?EID=222470 Created: Oct 4, 2000 Modified: 2000-10-06 22:24:36.278 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by gurdeep singh (http://www.jguru.com/guru/viewbio.jsp?EID=215882 There are two potential performance issues here, one of which has been eliminated by most (if not all) container vendors, and the other of which many container vendors have optional optimization for. The first issue is that given naive implementations of the JNDI context objects that the beans use to look each other up, the calls might go through RMI, which involves quite a bit of overhead even within a process. Again, though most if not all container vendors optimize this right out of your way. Don't worry about this one. The second potential issue, though, comes from the spec. The EJB specification dictates that the container copy all method parameters and return values on these calls. Here is the quote from section 18.2.3: Specifically, the EJB Container is not allowed to pass non-remote objects by reference on inter-EJB invocations when the calling and called enterprise beans are collocated in the same JVM. Doing so could result in the multiple beans sharing the state of a Java object, which would break the enterprise bean’s semantics.
All this copying has obvious performance implications. However, most container vendors allow this behavior to be overridden for performance reasons. Is it possible to have a Container Managed Persistent Entity Bean which refers to a view rather than a table. Location: http://www.jguru.com/faq/view.jsp?EID=224680 Created: Oct 8, 2000 Modified: 2000-10-11 20:02:28.088 Author: Damien Bootsma (http://www.jguru.com/guru/viewbio.jsp?EID=222870) Question originally posed by Madhu Menon (http://www.jguru.com/guru/viewbio.jsp?EID=29982 Yes it is possible. Using Views is a good way of mapping multiple tables to one Entity Bean. Remember that you will also need to write a Primary Key class for your Entity Bean. Refer to http://www.jguru.com/jguru/faq/view.jsp?EID=20875 for details.
Comments and alternative answers
if it is possible to create a bean for multiple tables... Author: Banda Srinivas (http://www.jguru.com/guru/viewbio.jsp?EID=389958), Apr 5, 2001 if it is possible to create a bean for multiple tables, then, is it possible to do dml (delete/insert/update) operations on this entity bean for multiple tables?? please clarify ? Re: if it is possible to create a bean for multiple tables... Author: samson su (http://www.jguru.com/guru/viewbio.jsp?EID=232778), Apr 6, 2001 I think this depends, some database products allow you to update the underlying data thru updating the view, but most not. I always use weblogic & cloudscape (pooled by weblogic) to work. I found that i must clear the "update at the end of each transaction" option in the "optimization" page in weblogic's EJB DeployerTool. Otherwise I can do nothing, any operation, even a readonly one such as findByPrimaryKey(), will generate an error saying "view is not updatable". After clearing this option, readonly operations work well as I expected. What is a value object? Why would I use one? What are some problems with them? Location: http://www.jguru.com/faq/view.jsp?EID=224988 Created: Oct 9, 2000 Modified: 2000-10-11 19:47:53.853 Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3) A Value Object, aka a Bulk Accessor or Bulk Data Class, is a lightweight Java class, separate from your EJB class, that contains properties or instance variables corresponding to each of your EJB's properties. Paul Done, in feedback to Is there any reason why value objects cannot have set methods?, defined value objects very well: Value objects are recommended when data has to be returned from an EJB server to the EJB client, if none of the data has to be updated. ie. The value objects are used to transport read-only data. It is the equivalent of the client requesting XML from the server tier, except you get the tighter compile time binding and control, and you don't have to parse the returned XML. If, instead, an equivalent EJB reference with the same 'getter' methods is returned, then each time the client calls a getter method on the reference EJB, this results in a remote method call to the server tier. This is an uneccessary round trip, when the object could have held the data locally itself.
So basically, value objects are recommended to enable your multi-tier application to be more performant. If you do need to update data, then you may need to use an EJB reference instead. However, this fine-grained querying/updating of data could become a severe performance bottleneck, if lots of it is performed. The traffic between different tiers needs to be minimised. Instead, EJBs should be used by clients for more coarsegranied method invocations. For example, the client could call a session bean on the server to get a complex data set (encapsulated in a value object), instead of just 1 row of data from 1 table. The server session bean may have used many entity beans or jdbc directly, behind the scenes on the server tier; however, this is hidden from the client. Once the client recieves the complex value object, it can do as many local method calls as it likes on it to get the data. Then a new (or the same) object could then be constructed with all the updated data. The client would then pass this object back to the server, to perform the update, by calling the appropriate method on the remote session bean, passing the new value object as the parameter. EJB/RMI is sometimes touted as a way to write a multi-tier application, as if it is a single tier application , without having to architect your design to cope with cross-tier communications. In reality, though, any design has to compromise to take account of these cross-tier performance issues. One problem with using Value Objects is that they are indeed passed by value, not by reference. If the data are updated on the server, a client may be accessing an out-of-date value stored in his local copy of the value object. Furthermore, if you use value objects to *store* data back on the server, you may inadvertently be reverting changes to fields that you did not set, but that a different client changed in the meantime. Another is that it is simply annoying to write one! It's like, I just wrote all these accessor methods on the *real* bean, and now I have to write them again on this fake one! Also, as you upgrade your bean code, you need to remember to update your value object code as well, leading to possible subtle migration bugs. EJBDoclet is an open-source product from DreamBean Software than allows you to generate various EJB-files from a commented bean source-file, including a bulk data class. This somewhat mitigates the previous complaint. See also: • • •
Is there any reason why value objects cannot have set methods? Tip 2 - Bulk Accessors in Entity Beans EJBDoclet
Can I use a Java 1.1 client to access an EJB? Location: http://www.jguru.com/faq/view.jsp?EID=227355 Created: Oct 12, 2000 Modified: 2000-10-18 18:14:41.027 Author: Ryan Breidenbach (http://www.jguru.com/guru/viewbio.jsp?EID=45212)
Question originally posed by Matze Schroeder (http://www.jguru.com/guru/viewbio.jsp?EID=142150 This is dependant on the EJB Container that you are using. All the EJB interfaces are Java 1.1 compatible. EJB's that are written to be used by both JDK 1.1 and 1.2 should be aware of the differences between the two versions. These are listed inside section 18 of the EJB 1.1 specification. [RC - If you know of a container that can support JDK 1.1 clients, please submit as feedback] Comments and alternative answers
I know that WebLogic 4.51 will work with Java 1.1.... Author: Ryan Breidenbach (http://www.jguru.com/guru/viewbio.jsp?EID=45212), Oct 19, 2000 I know that WebLogic 4.51 will work with Java 1.1. I have deployed an EJB application with WebLogic 4.51 running as the EJB and Servlet container using Java 1.1.8b. I am developing a BMP Entity bean. I have noticed that whenever I the create method is invoked, the ejbLoad() and the ejbStore() methods are also invoked. I feel that once my database insert is done, having to do a select and update SQL queries is major overhead. is this behavior typical of all EJB containers? Is there any way to suppress these invocations? Location: http://www.jguru.com/faq/view.jsp?EID=228576 Created: Oct 14, 2000 Modified: 2000-10-17 15:40:36.652 Author: Parag Bhagwat (http://www.jguru.com/guru/viewbio.jsp?EID=52244) Question originally posed by manikandan chandrasekaran (http://www.jguru.com/guru/viewbio.jsp?EID=1532 This is the default behaviour for EJB. The specification states that ejbLoad() will be called before every transaction and ejbStore() after every transaction. Each Vendor has optimizations, which are proprietary for this scenario. We will outline the properties for the popular servers below: WebLogic 5.1
1. The db-is-shared option, which is set in the weblogic-ejb-jar.xml file.
2.
This option by default set to true, but can be overridden. This option can be used if the WebLogic Server has exclusive access to the database. Using this option ejbLoad()will be called only once when the user obtains remote interface and then after any transaction rollback. This cannot be used in a cluster The Cache Strategy option can be set to read-only. Using this strategy the Container will never invoke ejbStore() and will limit calls to ejbLoad() as
3.
specified by the read-timeout-seconds options. Both options are also set in the weblogic-ejb-jar.xml file. The is-modified-method-name option, which is set in the weblogic-ejbjar.xml file and is used to specify a method that the container will invoke before ejbStore(). If this method returns true then ejbStore() will be called, if it returns false, then it will not invoke ejbStore().
[RC - Please submit answers for other containers as feedback so we can provide a complete list] Comments and alternative answers
Passivate goes the same way Author: Geraldo Xexeo (http://www.jguru.com/guru/viewbio.jsp?EID=524001), Jan 14, 2002 It seems to me that this happens also when passivating an BMP. CMP Only Author: Jeff Davenport (http://www.jguru.com/guru/viewbio.jsp?EID=842956), Apr 17, 2002 In WebLogic 6.x, the is-modified-method-name option only applies for CMP. It is not allowed for BMP. I do not know if this is the case in WebLogic 5.1 as well. Is it possible to derive my EJB class from a standard Java class? Location: http://www.jguru.com/faq/view.jsp?EID=228911 Created: Oct 15, 2000 Modified: 2000-10-18 18:31:16.237 Author: Damien Bootsma (http://www.jguru.com/guru/viewbio.jsp?EID=222870) Question originally posed by Amar Gadkari (http://www.jguru.com/guru/viewbio.jsp?EID=142811 Yes it is possible. Although, naturally you must make sure that the methods of the EntityBean or SessionBean interfaces (depending on which type of EJB you are writing) are implemented either in the Bean class or its' superclasses. When descending from an existing class, you should be aware of the EJB programming restrictions outlined in section 18.1.2 of the EJB 1.1 specification. For example, You must be careful not to extend from any of the java.io.* classes or java.lang.Thread. When are stubs & skeletons created for my EJB components? is it at development time, deployment time or run time? Location: http://www.jguru.com/faq/view.jsp?EID=230549 Created: Oct 17, 2000 Modified: 2000-10-17 15:57:57.913 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by Naveen Ajjampur (http://www.jguru.com/guru/viewbio.jsp?EID=127318 The time of creation of stubs and skeletions for EJB components varies from server to server. The creation of stubs and skeletons for the popular servers is outlined below:
Inprise Application Server 4.x The stubs and skeletons can be created during development time, for development and testing with the command line utility of with JBuilder. The stubs and skeletons for the EJB can also be created during deployment using the IAS Console. There is also an option to create a Client Jar file. The Client Jar file contains the necessary stubs and interfaces for the EJB which a client requires to invoke the EJB. WebLogic Server 4.5.x, 5.x The stubs and skeletons are created at deployment time using the command line utility called weblogic.ejbc. In WebLogic 5.x, there is also a Deployer Tool available that will invoke the ejbc utility automatically. jBoss Server In jBoss, the stubs and skeletons are not required to be generated by the developer or deployer. The Server takes care of the creation and downloading of stubs. [RC- Please submit info for other servers as feedback] Comments and alternative answers
No stubs and skeleton found in Weblogic 6.1 Author: Seetesh H (http://www.jguru.com/guru/viewbio.jsp?EID=1038574), Dec 17, 2002 Hi, How are the stub and skeleton files created in Weblogic 6.1 at deployment/compile time? Seetesh Creation of stubs and skeletons - WebSphere Author: Dror Fries (http://www.jguru.com/guru/viewbio.jsp?EID=1234390), Mar 23, 2005 Hi, Can someone describe what happens for WebSphere ? Is there a way for the stubs and skeletons to be created when deploying - automatically (by some setting or else) ? or must I create them at development stage ? Thanks DrorF Are there any online EJB tutorials? Location: http://www.jguru.com/faq/view.jsp?EID=231621 Created: Oct 18, 2000 Modified: 2000-10-18 19:00:00.767 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by Ambika Palta (http://www.jguru.com/guru/viewbio.jsp?EID=227461 Take the jGuru Enterprise JavaBeans Technology Fundamentals short course at http://developer.java.sun.com/developer/onlineTraining/EJBIntro What is the default transaction attribute for an EJB? Location: http://www.jguru.com/faq/view.jsp?EID=232149 Created: Oct 19, 2000 Modified: 2000-10-26 06:47:01.737 Author: sailaja nadella (http://www.jguru.com/guru/viewbio.jsp?EID=225889)
Question originally posed by WEICONG WANG (http://www.jguru.com/guru/viewbio.jsp?EID=217785 There is no default transaction attribute for an EJB. Section 11.5 of EJB v1.1 spec says that the deployer must specify a value for the transaction attribute for those methods having container managed transaction. Comments and alternative answers
Default transaction attribute for Enterprise java bean Author: surya navi (http://www.jguru.com/guru/viewbio.jsp?EID=388862), Mar 27, 2001 In weblogic, the default transaction attribute for EJB is SUPPORTS. Re: Default transaction attribute for Enterprise java bean Author: Seetesh H (http://www.jguru.com/guru/viewbio.jsp?EID=1038574), Dec 17, 2002 Hi, Weblogic 6.1 has Required by default. Seetesh Re[2]: Default transaction attribute for Enterprise java bean Author: reji mohamed (http://www.jguru.com/guru/viewbio.jsp?EID=1138612), Jan 12, 2004 for weblogic 8 it's SUPPORTS...i think it's the same with weblogic 7 Default transaction attribute for was 5.1.x Author: Rakesh Sharma (http://www.jguru.com/guru/viewbio.jsp?EID=1256795), Aug 5, 2005 Can somebudy provide me the supporting doc or link for default transaction attribute in Websphere 5.1.x .In WAS6.0 its "Required". Is there any way to force an Entity Bean to store itself to the db? I don't wanna wait for the container to update the db, I want to do it NOW! Is it possible? Location: http://www.jguru.com/faq/view.jsp?EID=232157 Created: Oct 19, 2000 Modified: 2000-10-26 06:35:49.787 Author: sailaja nadella (http://www.jguru.com/guru/viewbio.jsp?EID=225889) Question originally posed by Stéphane Félix (http://www.jguru.com/guru/viewbio.jsp?EID=210800 Specify the transaction attribute of the bean as RequiresNew. Then as per section 11.6.2.4 of the EJB v 1.1 spec EJB container automatically starts a new transaction before the method call. The container also performs the commit protocol before the method result is sent to the client. What is the Session wraps Entity Pattern? What are the motivations behind it? Location: http://www.jguru.com/faq/view.jsp?EID=232943 Created: Oct 20, 2000 Modified: 2000-10-23 21:40:01.55 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644)
Question originally posed by nadella srikanth (http://www.jguru.com/guru/viewbio.jsp?EID=72838 This pattern is really just a quick way of saying "Clients access the system only through Session Beans, which encapsulate all details of the system's Entity Beans." From my perspective, there are two primary motivations for this: to provide good transactional definition and improve performance, and to hide implementation details by providing a coarse-grained interface to the system. As far as transaction definition and implementation goes, this pattern helps by allowing each call into the session beans to be a complete unit of work (AKA transaction). In J2EE based systems where the client calls entity beans directly either the client has to manage the transaction explicitely, or each call to an entity runs in its own transaction. In the first case (client managed transactions) we wind up with a lot of low-level exception handling code than we really want in application code. It becomes difficult to ensure that these exceptions are being handled correctly everywhere in an application (although good architecture can mitigate this risk). In the second case (each call running in its own transaction) performance will suffer greatly - most application servers will (by default) call ejbLoad at the beginning of each transaction and ejbStore at the end of each transaction. If you have 10 getter methods that must be called in a unit of work, that leads an incredibly slow system. Another reason that this 'naive' design is bad is that if you are modifying data, there is probably some set of data that the user expects to be modified as a unit (a unit of work). If you do not have some way of controlling transaction scope, and take the default of one transaction per call, you do not provide this ensurance to your users. The second motivation is to hide implementation details and keep the system interface relatively narrow. In systems where this is important (and that's really any system with a projected lifetime of over 2 weeks 8^}) ), data that is displayed is usually extracted from the entity beans and put into 'View' classes by session beans. This gives you a narrow system interface (the session interfaces and View classes) while allowing you the modularity and cohesion benefits of a fine-grained implementation, as well as (possibly) the development time savings of CMP. Comments and alternative answers
Facade Pattern Author: prajakt samant (http://www.jguru.com/guru/viewbio.jsp?EID=272793), Mar 22, 2001 The above scenario is also known as Facade Pattern wherein the stateless Session beans form a "facade" to Entity Beans ,which actually reduces network traffic as stateless beans could be swapped in between clients,eventually improving the performance. Re: Facade Pattern Author: Samir satam (http://www.jguru.com/guru/viewbio.jsp?EID=337041), Apr 8, 2001 How does it reduce network traffic?
Java:API:EJB Author: hua lu (http://www.jguru.com/guru/viewbio.jsp?EID=419440), May 10, 2001 1. suppose you call the session bean (SB)once, and the session bean calls multiple entity beans (EB). If your SB and EB are located in the same machine, then many application servers would allow (optimize) the communications between the SB and the EBs to carry less overhead than usual remote access (though that's slightly against the EJB specification). So you practically end up with one real remote access. 2. suppose you don't use SB as facade, then each call from the client to each one of the EBs is a remote access. Then you end up with multiple remote accesses. That's the reason why using SB as facade reduces traffic. Who offers hosting of EJBs? Location: http://www.jguru.com/faq/view.jsp?EID=234267 Created: Oct 23, 2000 Modified: 2000-10-23 21:50:14.146 Author: Badri Kuppa (http://www.jguru.com/guru/viewbio.jsp?EID=98194) Question originally posed by rainer wasserfuhr (http://www.jguru.com/guru/viewbio.jsp?EID=224279 The following sites host EJB applications • •
Digex - http://www.digex.com ejip.net - http://www.ejip.net
Comments and alternative answers
Also check out http://www.webappcabaret.com They offer free hosting. Author: Ian Beaumont (http://www.jguru.com/guru/viewbio.jsp?EID=45887), Jun 12, 2001 Also check out http://www.webappcabaret.com They offer free hosting. When using Stateful Session Beans, What will happen if an EJB client program terminates without calling the Stateful Sesson Bean's remove() method? Location: http://www.jguru.com/faq/view.jsp?EID=234431 Created: Oct 23, 2000 Modified: 2000-10-23 22:10:22.223 Author: manish sethi (http://www.jguru.com/guru/viewbio.jsp?EID=233027) Question originally posed by Yongfeng Xiao (http://www.jguru.com/guru/viewbio.jsp?EID=216776 Referring to page 57 of the EJB 1.1 specification. A stateful session bean would come into Doesn't Exist state if one of the following happens:
1. Call remove() on the EJBObjects's stub from the Client 2. Call remove(handleToEJBObject) on EJBHome's stub from client. 3. System Exception in bean 4. Bean timeout 5. Container crash
As in your question you have ruled out the possibility of 1, 2, and 3 so bean will be in Exists state until one of 4 or 5 happens. Most likely 4. Comments and alternative answers
good Author: sravan reddy (http://www.jguru.com/guru/viewbio.jsp?EID=962689), Jul 24, 2002 its a nice explanation Is necessary to use the remove method? Author: alex herrera (http://www.jguru.com/guru/viewbio.jsp?EID=989751), Aug 27, 2002 Im using stateful session beans with helpers and when i use then in JSP, the helper doesnt use the remove method. I just equals the object (bean) to null. Is that allright? Re: Is necessary to use the remove method? Author: Saurabh Banerjee (http://www.jguru.com/guru/viewbio.jsp?EID=1093180), Jun 11, 2003 You should invoke the remove(). Refer to EJB specs section 7.1 figure 3. Your bean will be in "Exists and Not Referenced" state until a server crash or bean timeout. So if you store a handle and call handle.getEJBObject() you will be able to get the reference before the server crash or timeout. In EJB 2.0, What are dependent value classes? Location: http://www.jguru.com/faq/view.jsp?EID=238463 Created: Oct 27, 2000 Modified: 2000-11-01 23:01:44.356 Author: Siva Visveswaran (http://www.jguru.com/guru/viewbio.jsp?EID=46210) Question originally posed by vikash mall (http://www.jguru.com/guru/viewbio.jsp?EID=214765 Value classes basically are a "happy" compromise between die-hard object encapsulation on the server-side and make-easy performance considerations on the client side. For example, consider an EJB client requesting a customer addrees from a Customer EJB. Assume the customer address is a serializable object containing Street address, State, Zip, etc. You have 2 options - either pass the serializable object asis to the client over IIOP or provide individual methods on the Customer EJB that return each piece of information. While the first breaks encapsulation the second will be shot down by your architect for performance reasons! Also the scenario makes sense for inter-EJB calls as well to preserve encapsulation. Enter value objects in EJB 2.0. Value objects are basically a client view of your persistent object. The Customer bean provider creates this view from the persistent representation. In order for the container to be able to create these instances, the appropriate IDL stubs must be deployed on the container when the bean is deployed.
Optionally containers may download them on demand - the spec doesn't impose either alternative. For more details & examples, refer to the EJB 2.0 specification! Comments and alternative answers
performance ok...but sync-ing probs pop up, right? Author: neal ravindran (http://www.jguru.com/guru/viewbio.jsp?EID=17737), Nov 30, 2001 You will have sync-ing probs with this approach. Different clients can "set" things differently and hence result in inconsistent state of object. Dependent Value Classes Author: Ted Barbusinski (http://www.jguru.com/guru/viewbio.jsp?EID=352014), Jul 17, 2002 The author of this FAQ seems to have confused the "Value Object" design pattern with EJB 2.0 Dependent Value Objects. EJB 2.0 Dependent Value Objects are not client view "value objects" offering a client view of your persistent object. They are actual fields within your CMP ejb that are comprised of more than one java primitive data type. They can be persisted as serialized objects with your ejb and recovered at any time. They are accessed using accessor and mutator methods just like your CMP field methods. :-) Author: george varghese (http://www.jguru.com/guru/viewbio.jsp?EID=1143700), Feb 4, 2004 Dependent value class A dependent value class is a concrete class that is the value of a cmp-field. A dependent value class may be a class that the Bean Provider wishes to use internally within an entity bean with container-managed persistence, and/or it may be a class that the Bean Provider chooses to expose through the remote (or local) interface of the entity bean. A dependent value class can be the value of a cmp-field; it cannot be the value of a cmr-field. The get accessor method for a cmp-field that corresponds to a dependent value class returns a copy of the dependent value class instance. The assignment of a dependent value class value to a cmp-field using the set accessor method causes the value to be copied to the target cmp-field. A dependent value class must be serializable. The internal structure of a dependent value class is not described in the EJB deployment descriptor. Is there anything special about sending mail with JavaMail when using EJB? Location: http://www.jguru.com/faq/view.jsp?EID=240549 Created: Oct 30, 2000 Modified: 2002-03-30 19:49:27.279 Author: Tim Rohaly (http://www.jguru.com/guru/viewbio.jsp?EID=10) Question originally posed by vini vipin (http://www.jguru.com/guru/viewbio.jsp?EID=239441 The javax.mail libraries are a standard part of of J2EE, so the whole API is there. Even the JavaBeans Activation Framework is there, which is required by JavaMail. However, you're only allowed to send mail, not receive.
With J2EE, you are required to obtain the javax.mail.Session instance from a JNDI lookup rather than creating it yourself, but other than that it's the same as sending mail using JavaMail from a standalone app. You can look at the Java Pet Store example, which does this. Also, see What does this messaging exception mean: javax.mail.NoSuchProviderException: No provider for Address type: rfc822 I am running a Weblogic on a Sun... Comments and alternative answers
With Weblogic Server 5.1, I have seen an implementation... Author: Kian Hui Teo (http://www.jguru.com/guru/viewbio.jsp?EID=64456), Oct 31, 2000 With Weblogic Server 5.1, I have seen an implementation of a mail bean before. Basically, just remember to include the mail.jar inside the weblogic classpath setting if you are using service pack 5 and below. You will also need to configure a smtp host for sending out your mail. You can set this inside your weblogic.properties file. Actual documentations on this can be found on the weblogic documentation website at http://www.bea.com Currently, the mail bean has already been implemented on production systems and working fine. What are the free EJB containers available? Which version of the EJB specification do they support? Are they free for development and production? Location: http://www.jguru.com/faq/view.jsp?EID=241193 Created: Oct 31, 2000 Modified: 2000-10-31 06:37:34.37 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by Habib El-Zoghbi (http://www.jguru.com/guru/viewbio.jsp?EID=38223 Some application servers are free for development and production, whilst some are free for development, but require a runtime license. Note that you should confirm from each site whether or not any licensing terms have changed • • • •
jBoss 2.0 from http://www.jboss.org supports EJB 1.1, and is free for development and production JRun Server 3.0 from http://www.allaire.com supports EJB 1.1, and is free for development Enhydra from http://www.enhydra.org supports EJB 1.1, and is free for development and production OpenEJB from http://www.openejb.org supports EJB 1.1, and is free for development and production
The EJB 1.1 spec eliminated "runAs" security delegation. Is there some other way to achieve this effect now? For example, how can I enable session bean method A, which is running as "guest" to call entity bean method B which only allows some role not containing "guest" to execute it? Assume I will do some kind of authentication in method A prior to the call to B (and only do the call to B on behalf of authorized callers) so this makes sense. Location: http://www.jguru.com/faq/view.jsp?EID=245708 Created: Nov 5, 2000 Modified: 2000-11-05 15:43:36.93 Author: Rhett Guthrie (http://www.jguru.com/guru/viewbio.jsp?EID=80532) Question originally posed by Bob Hall (http://www.jguru.com/guru/viewbio.jsp?EID=222264 Do the guest-specific authorization in Bean B. Doing this is not as clean as the old runAs mechanism, but it will work. What are some standard design patterns that are used in EJB? Location: http://www.jguru.com/faq/view.jsp?EID=247099 Created: Nov 6, 2000 Modified: 2000-11-07 22:12:12.677 Author: venkat r (http://www.jguru.com/guru/viewbio.jsp?EID=237873) Question originally posed by bindu devarapalli (http://www.jguru.com/guru/viewbio.jsp?EID=239587 Some standard design patterns used in EJB include the command and decorator patterns. An extensive list of patterns for use in EJB can be found at http://c2.com/cgi/like?EjbDesignPatterns How can I find out the cause of a javax.transaction.TransactionRolledbackException? Location: http://www.jguru.com/faq/view.jsp?EID=247150 Created: Nov 6, 2000 Modified: 2000-11-13 19:03:43.299 Author: shilpa Tiwari (http://www.jguru.com/guru/viewbio.jsp?EID=138841) Question originally posed by Raghunandan Mysore (http://www.jguru.com/guru/viewbio.jsp?EID=112837 A TransactionRolledBackException would occur if :
1. There has been an exception within the scope of the transaction. If you have
2.
proper logging in your program and log all the possible exceptions then you could easily see the reason of a TransactionRolledBackException. Or more precisely the exception which led to the rollback. This Exception could be seen in the stack trace if you dump your stack trace. If the transaction timed out before the completion of the task. In this case case you could see in the stack trace that the transaction was timed out and then the TransactionRolledBackException as it would be thrown once timeout occurs.
What's the main difference between throwing an javax.ejb.EJBException and throwing an java.rmi.RemoteException from within a EJB? When should each be thrown? Location: http://www.jguru.com/faq/view.jsp?EID=249857
Created: Nov 9, 2000 Modified: 2000-11-13 19:07:44.99 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by Benjamin Chi (http://www.jguru.com/guru/viewbio.jsp?EID=232856 The main difference is that throwing remote exception from within the bean is deprecated: your bean methods (including ejbLoad, ejbStore and their ilk) should throw EJBException. Other things to note from the spec are that the current transaction will be rolled back (it wouldn't be if you threw an application exception), and the client will see it as a RemoteException, even though you threw an EJBException. Comments and alternative answers
When throwing a EJBException, that is a SystemExce... Author: Guilherme Ceschiatti (http://www.jguru.com/guru/viewbio.jsp?EID=252922), Nov 13, 2000 When throwing a EJBException, that is a SystemException, the EJB Container will rollback the transaction without user intervention. The EJB Container then encapsulates EJBException in the RemoteException to deliver it to the client. Re: When throwing a EJBException, that is a SystemExce... Author: Todd Huss (http://www.jguru.com/guru/viewbio.jsp?EID=389670), Mar 28, 2001 You should never explicitly throw a RemoteException as of EJB1.1 or later. Instead you should either throw an EJBException (or subclass thereof) in the case of a system exception or a subclass of Exception in the case of an application exception. The EJB Spec talks about this in detail in the "Exception Handling" section. How can we interact with COM/DCOM components from a EJB component ? Location: http://www.jguru.com/faq/view.jsp?EID=254368 Created: Nov 15, 2000 Modified: 2000-11-15 14:56:16.813 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by jeetender davai (http://www.jguru.com/guru/viewbio.jsp?EID=253290 A list of tools that integrate Java with the Microsoft platform is available here. These tools can be used, as long as they stay within the EJB specification requirements set out in section 18.1.2 of the EJB 1.1 specification. Is it possible to stop the execution of a method before completion in a SessionBean? Location: http://www.jguru.com/faq/view.jsp?EID=254734 Created: Nov 15, 2000 Modified: 2000-11-15 18:56:41.868 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Ramakrishna Rallapalli (http://www.jguru.com/guru/viewbio.jsp?EID=215737
Stopping the execution of a method inside a Session Bean is not possible without writing code inside the Session Bean. This is because you are not allowed to access Threads inside an EJB, refer to section 18.1.2 of the EJB 1.1 specification. One possible solution (that requires coding) would be to set the transaction that the Session Bean is running within to be rolled back. To do this, use the setRollBackOnly() method of the javax.transaction.UserTransaction interface. This method would of course require that your Session Bean is using transactions. If the Session Bean is processing many long running requests then it could provide an optimization by checking the transaction status using the getRollBackOnly() call of the javax.ejb.SessionContext object. Is it possible to access a CORBA object from a EJB? I am using VisiBroker 4.0 for my CORBA objects and J2EE 1.2.1 for my EJB. Location: http://www.jguru.com/faq/view.jsp?EID=254760 Created: Nov 15, 2000 Modified: 2000-11-15 19:09:33.488 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by kyin yan (http://www.jguru.com/guru/viewbio.jsp?EID=239598 Yes it is, you'll probably want to use the VisiBroker ORB from the EJB, to override the default ORB, use the following properties: org.omg.CORBA.ORBClass=com.inprise.vbroker.orb.ORB org.omg.CORBA.ORBSingletonClass=com.inprise.vbroker.orb.ORB These properties can be set on the commandline (using -Dorg...) or using a file named orb.properties. In CMP how can I define a finder method equivalent to a 'SELECT * FROM TABLE'? [RC - Please give reference to the particular AppServer you are using] Location: http://www.jguru.com/faq/view.jsp?EID=256842 Created: Nov 17, 2000 Modified: 2000-11-21 10:44:45.924 Author: shiva prasad (http://www.jguru.com/guru/viewbio.jsp?EID=123366) Question originally posed by Praveen kumar (http://www.jguru.com/guru/viewbio.jsp?EID=84503 •
Weblogic 5.1.0 - Define the following Finder syntax in your weblogic-ejbjar.xml deployment descriptor. <method-name>All <method-params>
Comments and alternative answers
In Weblogic 4.5.1 define the following finder syntax... Author: uttara donde (http://www.jguru.com/guru/viewbio.jsp?EID=239829), Nov 22, 2000 In Weblogic 4.5.1 define the following finder syntax in finder descriptions "findByAll()" "(= 1 1)" In Websphere using FinderHelper write the... Author: evyatar shoresh (http://www.jguru.com/guru/viewbio.jsp?EID=90755), Nov 22, 2000 In Websphere using FinderHelper write the following: public static final string findByAllWhereClause="1=1";
and define a method in the Home interface as follows:
public Enumeration findByAll() throws RemoteException; Is it legal to have static initializer blocks in EJB? Location: http://www.jguru.com/faq/view.jsp?EID=257106 Created: Nov 18, 2000 Modified: 2000-11-27 14:22:53.803 Author: ganaparthy balasubramanyam (http://www.jguru.com/guru/viewbio.jsp?EID=257097) Question originally posed by ravi srivatsav (http://www.jguru.com/guru/viewbio.jsp?EID=44460 Although technically it is legal, static initializer blocks are used to execute some piece of code before executing any constructor or method while instantiating a class. Static initializer blocks are also typically used to initialize static fields - which may be illegal in EJB if they are read/write - see section 18.1.2. In EJB this can be achieved by including the code in either the ejbCreate(), setSessionContext() or setEntityContext() methods. Is it possible to specify multiple JNDI names when deploying an EJB? Location: http://www.jguru.com/faq/view.jsp?EID=258023 Created: Nov 20, 2000 Modified: 2000-11-21 10:17:47.525 Author: Andrea Pompili (http://www.jguru.com/guru/viewbio.jsp?EID=51802) Question originally posed by Guillaume Bedard (http://www.jguru.com/guru/viewbio.jsp?EID=252289 No. To achieve this you have to deploy your EJB multiple times each specifying a different JNDI name. Is it possible to write two EJB's that share the same Remote and Home interfaces, and have different bean classes? if so, what are the advantages/disadvantages? Location: http://www.jguru.com/faq/view.jsp?EID=258282 Created: Nov 20, 2000 Modified: 2000-11-28 13:59:47.825 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by Alan Gault (http://www.jguru.com/guru/viewbio.jsp?EID=131380 It's certainly possible. In fact, there's an example that ships with the Inprise Application Server of an Account interface with separate implementations for
CheckingAccount and SavingsAccount, one of which was CMP and one of which was BMP. Note that if you just want to map the same EJB to two data sources, you can just deploy it twice under different names. Comments and alternative answers
Sharing interfaces might be possible, but not trivial.... Author: Rickard Nilsson (http://www.jguru.com/guru/viewbio.jsp?EID=259069), Nov 22, 2000 Sharing interfaces might be possible, but not trivial. If you deploy with Sun Deployment Tool 1.2.1 you will get a java.lang.ClassCastException: MyBean2EJB_EJBObjectImpl when you execute a method in MyBean2EJB, which shares Remote and Home interface with MyBean1EJB. If you delete MyBean1EJB and redeploy the application, this exception goes way. The best way is while deploy it as two different beans... Author: Rahul kumar Gupta (http://www.jguru.com/guru/viewbio.jsp?EID=4809), Dec 4, 2000 The best way is while deploy it as two different beans and use different JNDI names for lookup, that will avoid the conflict you are hitting. Is is possible for an EJB client to marshall an object of class java.lang.Class to an EJB? Location: http://www.jguru.com/faq/view.jsp?EID=261142 Created: Nov 23, 2000 Modified: 2000-11-24 15:11:42.869 Author: Prashant Mirajkar (http://www.jguru.com/guru/viewbio.jsp?EID=53347) Question originally posed by Partha Pratim Das (http://www.jguru.com/guru/viewbio.jsp?EID=245213 Technically yes, spec. compliant NO! - refer to section 18.1.2 of the EJB 1.1 specification (page 273). "The enterprise bean must not attempt to query a class to obtain information about the declared members that are not otherwise accessible to the enterprise bean because of the security rules of the Java language." For BMP, I don't want all the variables to be updated in the database when only one variable has been changed in each of the business methods. Is it a good practice to load and store values from and to database inside the business methods rather than ejbStore() and ejbLoad()? Location: http://www.jguru.com/faq/view.jsp?EID=262837 Created: Nov 26, 2000 Modified: 2000-11-28 13:48:16.388 Author: Matthias David (http://www.jguru.com/guru/viewbio.jsp?EID=17908) Question originally posed by Mahesh chandra Puvvada (http://www.jguru.com/guru/viewbio.jsp?EID=231051 Placing load and store commands inside business methods is not a good practice. Imagine if you have several calls to business methods to the bean, in this case you
would have database access on each business method call. Using the ejbStore() and ejbLoad() methods guarantee that the database access takes place when it is really necessary, e.g. between transcations. If only some of the variables change between calls of ejbLoad() and ejbStore() then an approach to use would be to store which variables have changed using transient boolean flags and then write only these variables to the database. Are enterprise beans allowed to use Thread.sleep()? Location: http://www.jguru.com/faq/view.jsp?EID=267170 Created: Dec 1, 2000 Modified: 2000-12-05 18:09:33.129 Author: Xavier Schaefer (http://www.jguru.com/guru/viewbio.jsp?EID=267049) Question originally posed by Ulrich Kraemer (http://www.jguru.com/guru/viewbio.jsp?EID=256233 Here is the answer from the Java 2 Enterprise Edition Developer's Guide (v. 1.2.1) : "Enterprise beans make use of the services provided by the EJB container, such as life-cycle management. To avoid conflicts with these services, enterprise beans are restricted from performing certain operations: • • •
... Managing or synchronizing threads ... "
Where can I find a vendor-independent Job Scheduling Framework for J2EE? Location: http://www.jguru.com/faq/view.jsp?EID=276094 Created: Dec 12, 2000 Modified: 2000-12-12 10:34:38.845 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by Simon Juden (http://www.jguru.com/guru/viewbio.jsp?EID=275869 Check out this article from Sims Computing Comments and alternative answers
(A) Here's a direct link to Sim's Flux task scheduling... Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4), Dec 12, 2000 (A) Here's a direct link to Sim's Flux task scheduling component. (B) Another way to do this is to use an application server which support's JMX. Basically, create a JMX MBean component which uses the JMX timer services and then fires off e.g., a session bean when the associated timer expires. How can I use JUnit to test J2EE/EJB applications? Location: http://www.jguru.com/faq/view.jsp?EID=276550
Created: Dec 12, 2000 Modified: 2002-04-04 12:09:42.503 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out Jeff Schnitzer's JUnitEE package and the Wiki EJB Unit Testing page. Comments and alternative answers
There's also a good article from the JavaWorld arc... Author: Sid Haniff (http://www.jguru.com/guru/viewbio.jsp?EID=300834), Jan 22, 2001 There's also a good article from the JavaWorld archives. http://www.javaworld.com/javaworld/jw-05-2000/jw-0526-testinfect.html JUnitEE link broke Author: Damien Joldersma (http://www.jguru.com/guru/viewbio.jsp?EID=412803), Mar 22, 2002 The JUnitEE link posted on this page is broken, http://junitee.sourceforge.net works better now. Re: JUnitEE link broke Author: Erik Meade (http://www.jguru.com/guru/viewbio.jsp?EID=774835), Apr 4, 2002 Thanks, I fixed it. Should show up next update of the site. Try Jakarta Cactus and TagUnit Author: Sean Sullivan (http://www.jguru.com/guru/viewbio.jsp?EID=203382), Jun 30, 2002 Try these tools: http://jakarta.apache.org/cactus/ http://www.tagunit.org/ What optimizations can be made to increase the performance of finder methods, especially when retrieving large result sets? Location: http://www.jguru.com/faq/view.jsp?EID=277869 Created: Dec 14, 2000 Modified: 2001-01-25 20:43:43.962 Author: Xavier Schaefer (http://www.jguru.com/guru/viewbio.jsp?EID=267049) Question originally posed by Nicholas Whitehead (http://www.jguru.com/guru/viewbio.jsp?EID=1260 Here is a very good presentation of patterns to improve the performance of your beans. The method that I used, and that showed very good results, is the following. • • •
For each Entity Bean class, create a serializable base class (i.e. the Entity Bean class should inherit from this class). Move all public attributes, getters and setters to this class (they are not needed any more in the Bean class, but are inherited). Add a returnBase method in the Entity Bean, which returns a copy of its data, in the form of a base class instance (i.e. a standard java class).
• •
Avoid direct client - Entity Bean interaction, but wrap the entity bean by a session bean. When undertaking a select statement, o the client asks the intermediate session bean to call the finder, o the intermediate session bean calls the returnBase method for each EJB and stores all the resulting instances in a Vector. o The vector is returned to the client in one throw !
Comments and alternative answers
Another optimization that is useful for finders that... Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644), Dec 21, 2000 Another optimization that is useful for finders that return large datasets is to eschew the finder completely: the intermediate session bean described above can simply execute SQL and return the serializable base class described above (or an equivalent serializable object) This does break encapsulation to some extent (by giving the session bean knowledge of the database structure), but it also avoids hitting the database n+1 times (as using a finder might). There are also ways of structuring your persistence layer to avoid this breaking of encapsulation, particularly for BMP beans. Re: Another optimization that is useful for finders that... Author: Venkatesh Balakumar (http://www.jguru.com/guru/viewbio.jsp?EID=430540), Sep 30, 2002 I think the DAO Pattern will be helpfull in this aspect. It can be found in the following link Sun's Java BluePrints Patterns Catalog. Cheers, Venkat. Enterprise JavaBeans by Monson-Haefel, Third Edition (O'Reilly) Author: Stan Jordan (http://www.jguru.com/guru/viewbio.jsp?EID=512836), Feb 1, 2002 There is an excellent discussion of this topic on pages 351-353 of this book. He eschews the finder in favor of JDBC. Worth reading. What are the benefits of using a Stateless Session Bean over using a class purely consisting of static methods? Location: http://www.jguru.com/faq/view.jsp?EID=281106 Created: Dec 18, 2000 Modified: 2000-12-19 13:39:08.584 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by Danny So (http://www.jguru.com/guru/viewbio.jsp?EID=236938
Mostly container management of transactions and the ability to 'easily' call remote code. Really, the two solutions work at different scales: a Stateless Session Bean is useful when you can define a set of (fairly coarse grained) atomic transactions that are related by a common theme, where a bunch of static methods in a class are more useful for (rather fine grained) utility code. One common use of Stateless Session Beans is to implement a facade over a set of entity beans, in order to allow the client to be transaction-ignorant. In this pattern the session bean defines a set of transactions that it implements using entity beans. See FAQ question "What is the Session wraps Entity Pattern? What are the motivations behind it?" for more information. Comments and alternative answers
Beyond the technical advantages of Session Beans, one... Author: Xavier Schaefer (http://www.jguru.com/guru/viewbio.jsp?EID=267049), Dec 20, 2000 Beyond the technical advantages of Session Beans, one of the great advantages of this concept that is has got a one-to-one trace to analysis classes of the unified software development process, therefore allowing clear design guidelines. • • •
Boundary classes become html or jsp pages. Entity classes become Entity Beans Control classes become Session Beans.
Another difference is in the number of database in... Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243), Dec 26, 2000 Another difference is in the number of database instances/connections required. In the case of a Java class with static methods, you would need to open/close the connection for each method. (There are ways around this if you design for it.) In stateless session beans, the EJB server which manages the pool of the session beans has the connection to the database and therefore there is no need to open close per a session bean method call. (Of course, there are situations here where you would want to talk to a totally separate database, etc. and then have to design/account for this as well.) Can an Entity Bean call a stored procedure using Container Managed Persistence ? If yes, how? Location: http://www.jguru.com/faq/view.jsp?EID=281113 Created: Dec 18, 2000 Modified: 2000-12-20 09:39:02.416 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by Philip Liu (http://www.jguru.com/guru/viewbio.jsp?EID=34697 If you mean "can you map the CMP Bean's persistence operations through stored procedures?", the answer depends on the sophistication of your chosen container's
mapping tool and how tightly it integrates with your database. Sophisticated mapping tools are free to map your bean's CMP fields to whatever they want, however they want. However, many CMP tools are much simpler and expect to map to relational tables. Now, if your question was more generally "Can a CMP bean call a stored procedure?", for example from a business method, or from ejbCreate(...), the answer is a definite yes. Just specify the resource-reference in your ejb-jar.xml (as you will anyway), look up the DataSource to get a Connection, the do all the CallableStatement JDBC stuff you want. Comments and alternative answers
Can an Entity Bean call a stored procedure using Container Managed Persistence ? If yes, how? Author: dreaddy Mck (http://www.jguru.com/guru/viewbio.jsp?EID=385159), Mar 22, 2001 Can some submit an example of specifing the resource-reference in your ejb-jar.xml (as you will anyway), and looking up the DataSource to get a Connection Re: Can an Entity Bean call a stored procedure using Container Managed Persistence ? If yes, how? Author: Steven Martin (http://www.jguru.com/guru/viewbio.jsp?EID=430104), Jun 11, 2001 Was any code ever posted? I'd like to use EJBS to do that wrapping as well. thanks, Steven Re: Re: Can an Entity Bean call a stored procedure using Container Managed Persistence ? If yes, how? Author: V Shah (http://www.jguru.com/guru/viewbio.jsp?EID=226807), Oct 23, 2001 Can CMP call a stored procedure ? I need to have an ORACLE stored procedure called for every insert/update/delete. How would I go about doing this ? Thanks Re: Re: Re: Can an Entity Bean call a stored procedure using Container Managed Persistence ? If yes, how? Author: praveen Kumar Nagunoori (http://www.jguru.com/guru/viewbio.jsp?EID=542975), Nov 13, 2001 Yes u can call a database stored procedure in cmp beans just specify the database connection resources in the ejb-jar.xml and get the connection in the call back methods and call ur operation related stored procedure in the call back methods using CallableStatements. But my suggestion is why u want to call the stored procedures why dont u apply that in business logic u implemnt in session beans. Re[4]: Can an Entity Bean call a stored procedure using Container
Managed Persistence ? If yes, how? Author: Neo Gigs (http://www.jguru.com/guru/viewbio.jsp?EID=748386), Apr 17, 2002 Hi there, From some source out there where BMP only can call a stored procedure.... Unless there are some codes that prove what u said..? Thanks Neo Re[2]: Can an Entity Bean call a stored procedure using Container Managed Persistence ? If yes, how? Author: Will Bracken (http://www.jguru.com/guru/viewbio.jsp?EID=840566), Apr 16, 2002 Yeah, I'd be interested in seeing an example or a link to a tutorial on how to do it in WebSphere Studio or something. What is the difference between an Application Server and a Web Server? Location: http://www.jguru.com/faq/view.jsp?EID=282323 Created: Dec 19, 2000 Modified: 2000-12-20 10:05:22.308 Author: sharad chaudhary (http://www.jguru.com/guru/viewbio.jsp?EID=62937) A Web Server understands and supports only HTTP protocol whereas an Application Server supports HTTP,TCP/IP and many more protocols. Also many more features such as Caches,Clusters,Load Balancing are there in Application Servers which are not available in Web Servers. We can also Configure Application Servers to work as Web Server. In short, Applicaion Server is a super set of which Web Server is a sub set. [See also What are all the different kinds of servers? (Such as Web Servers, Application Servers, etc) ] Comments and alternative answers
Web servers do offer caches, clustering and load b... Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644), Dec 21, 2000 Web servers do offer caches, clustering and load balancing - in fact, these are far easier to implement for web servers than application servers, because web servers are far simpler.
Also, HTTP is an application layer protocol that runs over TCP/IP. Your final summary is fairly good, but I think the best description is that Web servers are HTTP servers, whereas an application server runs application code in the context of some higher level API (servlets, EJB, ASP, Enhydra's compiled HTML thingy) Now, given Apache's module APIs, is it a web server or an application server? Re: Web servers do offer caches, clustering and load b... Author: Balaji Sundararajan (http://www.jguru.com/guru/viewbio.jsp?EID=439659), Jun 15, 2001 Even if we take it literally, a web server serves web pages so an application server should serve with application (logic). The application logic (here, the business logic) is embedded in some form, let that be an EJB or CORBA component, and the application server allows us to get the services provided by those components. IMHO, the qualities such as load balancing, fail-over support, caching are all nonfuntional requirements that are applicabale to any distributed application (web server, db server, app server etc.)
Re[2]: Web servers do offer caches, clustering and load b... Author: Barath Ganesan (http://www.jguru.com/guru/viewbio.jsp?EID=1212633), Nov 23, 2004 In my context,a web server is just a publishing server.whereas an application server provides some services like security, and as said before clustering and caches on its own.we jus have to configure in order to use these services.in case of a web server it is the burdon of the programmer to do all these. A web server provides services only to web clients whereas an application server provides services to any application which is running in a distributed environment. Re: Web servers do offer caches, clustering and load b... Author: Matt Rokenbrod (http://www.jguru.com/guru/viewbio.jsp?EID=955561), Jul 18, 2002 Can multiple Application Servers Run on the same webserver on the same computer? Re: Web servers do offer caches, clustering and load b... Author: Krupakar Jonnalagadda (http://www.jguru.com/guru/viewbio.jsp?EID=1204169), Oct 8, 2004
Apache's module apis is an application server. WebServer just serves HTTP Request, while Application... Author: Anurag Goel (http://www.jguru.com/guru/viewbio.jsp?EID=285633), Dec 25, 2000 WebServer just serves HTTP Request, while Application Server consist of Servlet Engine, and serve WebServer. WebServer contains only HTML files and send only HTML file any other file requested which has to be compiled dynamically based on the request, Webserver will get it from Application Server. Application Server consist of Servlet Engine,JVM and other parsers which interpret the required class files and send it to Webserver. It should also be noted that while many AppServers... Author: Alex Varanese (http://www.jguru.com/guru/viewbio.jsp?EID=334606), Feb 20, 2001 It should also be noted that while many AppServers (such as BEA's WebLogic) are indeed a superset of web server functionality, they aren't generally used that way. WebLogic is often used for it's enterprise capabilities and then augmneted by allowing Apache to handle the strictly HTTP-related side of things. Re: It should also be noted that while many AppServers... Author: Sanjay Kumar Gupta (http://www.jguru.com/guru/viewbio.jsp?EID=1083738), May 12, 2003 Summary: A normal web server can handle Http request means it can provide static web pages, images, css etc. For generating dynamic web contents it requires support for JSP, Servlets etc in Java & ASp in Microsoft respectively. So A javaenabled webserver means it has JVM & servlet engine which can run java servlets or JSp if it has JSP container. In such a case, the web server on receiving http request which can be handled by a servlet, passes it on to servlet which will handle it & may generate an HTML page which web server delivers to webbrowser. An application server can provide services based on various protocols including HTTP, meaning web service can be inbuilt or can be configured with it. Application servers serve application code to application clients. It provides several services like transaction processing, resource pooling i.e. database connection pooling, Security features, clustering etc. Re[2]: It should also be noted that while many AppServers... Author: prasenjit biswas (http://www.jguru.com/guru/viewbio.jsp?EID=1228123), Apr 8, 2005 You can't run EJB or any business logic in Javawebserver.An application server should have the capability to run business logic in it.That's why we can't say that JWserver a application server. Application vs Webserver Author: siraj ahmed (http://www.jguru.com/guru/viewbio.jsp?EID=405469), Apr 18, 2001
If application server has inbuilt jvm and servlet engine then why we call javawebserver2.0 as "webserver" it can handle the servlet request then its also an application server. Please comment.... Re: Application vs Webserver Author: rahul bose (http://www.jguru.com/guru/viewbio.jsp?EID=219615), Sep 4, 2001 can a web server exists by itself without any appserver Thanks, rahul Re: Re: Application vs Webserver Author: praveen Kumar Nagunoori (http://www.jguru.com/guru/viewbio.jsp?EID=542975), Nov 13, 2001 Yes Webserver can exists by itself as it supports all the basic facilties to serve the purpose of a simple webhosting Why does an update trigger is activated when I access a method in a CMP EJB mapped to the table with that trigger? Location: http://www.jguru.com/faq/view.jsp?EID=283925 Created: Dec 21, 2000 Modified: 2000-12-27 18:15:04.69 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by HERNAN RODRIGUEZ (http://www.jguru.com/guru/viewbio.jsp?EID=65693 Probably because the EJB container is storing the bean when the transaction commits, even though you didn't modify it. Some containers have various ways of optimizing around this, from comparing the data (IAS 4.0) to allowing you to implement an 'isModified' bethod returning boolean (WebLogic). The container you're using may allow something like this. What is EJBDoclet? Location: http://www.jguru.com/faq/view.jsp?EID=285175 Created: Dec 24, 2000 Modified: 2000-12-24 01:22:49.179 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) EJBDoclet is an open source JavaDoc doclet that generates a lot of the EJB related source files from custom JavaDoc comments tags embedded in the EJB source file. Is it legal to use JDBC code inside the business methods of an Entity Bean? What are the implications of doing so? Location: http://www.jguru.com/faq/view.jsp?EID=287585 Created: Dec 27, 2000 Modified: 2001-01-01 02:35:20.703 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by amol kher (http://www.jguru.com/guru/viewbio.jsp?EID=274801 Yes it is allowed. The implications rather depend on your bean and your application. The biggest implication is in your transactions: if you call your entity business methods directly from a client, each method will be executed as its own transaction, so you can expect ejbLoad, your business method, and ejbStore to all be called for
each method. This tends to be a lot of datbase activity, which is why guys like me advocate the Ssession wraps Entity' pattern. See this FAQ for more details on 'Session wraps Entity' Another potential problem rises from doing this within a CMP entity bean: you have to be careful not to modify tables behind the container's back: containers are allowed to cache CMP entity data (the spec defines three 'commit options', A, B, and C) and modifying the tables directly can cause the container's cache to be inconsistent in some cases. With BMP beans the situation is simpler, and making JDBC calls from normal business methods can allow you to optimize your application in some situations. For example, if your application's object model consists of a few very coarse grained entities that each have several sets of dependent objects, you can use a 'lazy fetch' implementation to retrieve dependents only when you know they're going to be used. Are there any performance issues that have to be considered while using EJB Components from COM environments? Location: http://www.jguru.com/faq/view.jsp?EID=287841 Created: Dec 28, 2000 Modified: 2001-01-01 02:36:23.591 Author: Lee Fuller (http://www.jguru.com/guru/viewbio.jsp?EID=109421) Question originally posed by Nikhil Kapre (http://www.jguru.com/guru/viewbio.jsp?EID=49106 Certainly. The level of performance degradation depends on the architecture used, which might include calling into the local JVM to call a particular class (which might then use RMI to get into a particular EJB component), using MSMQ and JMS to loosely couple the two architectures, using SOAP/Web services to loosely couple architectures or using an EJB to CORBA/COM bridge. Personally, I would choose a loosely coupled architecture, with the anticipation of fast performance not being a requirement. If re-using an existing EJB component, then this performance hit will have to factored into the expectations, if a new component, then it is best to keep it all COM(+) for maximum performance. (IMHO) In EJB 2.0, What is an abstract persistence schema? Location: http://www.jguru.com/faq/view.jsp?EID=290107 Created: Dec 31, 2000 Modified: 2001-01-01 02:28:46.864 Author: John Zukowski (http://www.jguru.com/guru/viewbio.jsp?EID=7) Question originally posed by vikash mall (http://www.jguru.com/guru/viewbio.jsp?EID=214765 For a full description and an example, see Read all about EJB 2.0 by Richard MonsonHaefel in JavaWorld. Basically, the persistence manager maps an entity bean to a database based on the bean-persistence manager contract / abstract persistence schema. What is EJB QL? Location: http://www.jguru.com/faq/view.jsp?EID=294899 Created: Jan 5, 2001 Modified: 2001-01-07 13:47:33.181 Author: malay thakkar (http://www.jguru.com/guru/viewbio.jsp?EID=294890)
Question originally posed by John Zukowski PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=7 EJB QL is a Query Language provided for navigation across a network of enterprise beans and dependent objects defined by means of container managed persistence. EJB QL is introduced in the EJB 2.0 specification. The EJB QL query language defines finder methods for entity beans with container managed persistenceand is portable across containers and persistence managers. EJB QL is used for queries of two types of finder methods: 1. Finder methods that are defined in the home interface of an entity bean and which return entity objects. 2. Select methods, which are not exposed to the client, but which are used by the Bean Provider to select persistent values that are maintained by the Persistence Manager or to select entity objects that are related to the entity bean on which the query is defined. From the EJB 2.0 spec: The Enterprise JavaBeans query language, EJB QL, is used to define finder queries for entity beans with container managed persistence. EJB QL lets the Bean Provider specify finder methods in a portable way. It is a specification language that can be compiled to a target language, such as SQL, of a persistent store used by a persistence manager. This allows the responsibility for the execution of finder queries to be shifted to the native language facilities provided for the persistent store (e.g., RDBMS), instead of requiring finder queries to be executed directly on the persistent manager’s representation of the entity beans’ state. As a result, finder methods are both portable and optimizable. Comments and alternative answers
code? Author: Ilija Jovanoski (http://www.jguru.com/guru/viewbio.jsp?EID=515190), Oct 9, 2001 This is good but can we see some code with explanation where to put the methods... Thanks! Re: code? Author: Murthy Yadlapati (http://www.jguru.com/guru/viewbio.jsp?EID=536293), Nov 1, 2001 Look at the following article for examples: about ejb 2.0 and EJBQL Re: Re: code? Author: Ilija Jovanoski (http://www.jguru.com/guru/viewbio.jsp?EID=515190), Nov 2, 2001 Many thanks!
What is the difference between a "Coarse Grained" Entity Bean and a "Fine Grained" Entity Bean? Location: http://www.jguru.com/faq/view.jsp?EID=295657 Created: Jan 7, 2001 Modified: 2001-01-07 16:45:41.67 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by manish sharma (http://www.jguru.com/guru/viewbio.jsp?EID=285743 Here's my definition, such as it is. A 'fine grained' entity bean is pretty much directly mapped to one relational table, in third normal form. A 'coarse grained' entity bean is larger and more complex, either because its attributes include values or lists from other tables, or because it 'owns' one or more sets of dependent objects. Note that the coarse grained bean might be mapped to a single table or flat file, but that single table is going to be pretty ugly, with data copied from other tables, repeated field groups, columns that are dependent on non-key fields, etc. Fine grained entities are generally considered a liability in large systems because they will tend to increase the load on several of the EJB server's subsystems (there will be more objects exported through the distribution layer, more objects participating in transactions, more skeletons in memory, more EJB Objects in memory, etc.) The other side of the coin is that the 1.1 spec doesn't mandate CMP support for dependent objects (or even indicate how they should be supported), which makes it more difficult to do coarse grained objects with CMP. The EJB 2.0 specification improves this in a huge way. Can an EJB Remote interface extend other interfaces as well as javax.ejb.EJBObject? Location: http://www.jguru.com/faq/view.jsp?EID=296411 Created: Jan 8, 2001 Modified: 2001-01-09 09:52:23.795 Author: Brian Keeton (http://www.jguru.com/guru/viewbio.jsp?EID=276091) Question originally posed by Alexander Ivantsov (http://www.jguru.com/guru/viewbio.jsp?EID=43897 As with other interfaces in Java, the remote interface can extend multiple interfaces. In fact, it's common to pull the business methods out of the remote interface and define them in a separate interface. This new interface can then be extended by the remote interface and implemented by the bean class. The advantage here is that now the compiler can do the checking for you to make sure the bean class is implementing the method signatures that are exposed by the remote interface. You wouldn't want the bean class to implement the remote interface directly because it would then be required to implement the methods from EJBObject. You'll see this referred to as using a "business interface" in Monson-Haefel's book. Are there any examples and best practices for implementing the hashCode() and equals() methods for a compound primary key class? Location: http://www.jguru.com/faq/view.jsp?EID=296598 Created: Jan 8, 2001 Modified: 2001-01-09 05:59:49.552 Author: John Francis (http://www.jguru.com/guru/viewbio.jsp?EID=296576) Question originally posed by paul martin (http://www.jguru.com/guru/viewbio.jsp?EID=283798
Try this article at www.ejbnow.com Comments and alternative answers
hashCode() and equals() methods Author: Avinash Salimath (http://www.jguru.com/guru/viewbio.jsp?EID=26087), May 28, 2001 Examples for implementing the hashCode() and equals() methods for a compound primary key class are: Equals(): Assuming primarykey class name as "PrimaryKeyClass" and having two primary keys "primarykey1" and "primarykey2" then public boolean equals (Object obj) { if (obj instanceof PrimaryKeyClass) { PrimaryKeyClass otherkey = (PrimaryKeyClass) obj; if( (otherkey.primarykey1 == primarykey1) && (otherkey.primarykey2 == primarykey2) ) return true; else return false; } else return false; } hashcode() method will be like this: public int hashCode () { StringBuffer sb = new StringBuffer(); sb.append(primarykey1); sb.append(primarykey2); String keys = sb.toString(); int hashCode = keys.hashCode(); return hashCode; }
In reference to EJB, what is the meaning of scalable?, how does EJB support scalability? Location: http://www.jguru.com/faq/view.jsp?EID=298862 Created: Jan 10, 2001 Modified: 2001-01-16 19:54:50.067 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by Anand Kumar (http://www.jguru.com/guru/viewbio.jsp?EID=288893 First, remember that scalability is only one of the goals of the EJB sped: some of the others are portability, automated transaction management, standardization of life-
cycle management, ease of development, and compatability/interoperability. A lot of the scalability goal can really be considered as supporting scalability while not forcing the code writers to jump too many hoops. In other words, ensuring that scalability is purely a design or application architecture issue and doesn't become a coding issue. Another point to remember is that scalability is really a hardware matter: all software can do is make the problem more or less difficult. My take at 'scalable' in enterprise level systems is that the duration of any transaction will degrade more slowly than the transaction rate increases. In other words, the goal would be linear degradation, with a small coefficient. Of course in reality it isn't linear to infinite loads, but we do want it to remain linear to as high a transaction rate as possible. Another attribute related to scalability is stability: even if our load is such that we are getting a lot slower, we shouldn't crash. Note that this does not mean 'fast.' I expect EJB implementations to be slower than equivalent CORBA distributed systems that ignore transactions and security. I also expect EJB based implementations of Web applications to be slower than the equivalant Servlet/JSP -> JDBC/Data Access Object implementation. The performance 'knee' of the EJB application will be higher in both cases - if it's a well designed EJB application that accounts for and makes use of EJB features. One of the scalability support features is the EBJObject itself: because the client doesn't call the bean directly, but only through a redirection layer, the container can interpose in the call and make a decision as to how to handle the call. This might involve a pool of bean instances, in which multiple beans can assume the same entity, or it can involve blocking while the last transaction executes (note, though, that a stateful session bean can balk by throwing an exception if access is attempted from two different transactions at once). The container's implementation and configuration is the limiting factor here. Other scalability gains come in places where the spec doesn't neccessarily define behavior: container vendors are free to implement their client-side stubs in any way they see fit - in some cases, the vendor can implement client stubs in such a way as to take advantage of their clustering capabilities. Of course, clusters of application servers would be a bear to write code for if there weren't a simple way of writing transactional code to run on them. Here, EJB enables scalability by defining a declaritive transaction model. The alternative would be to write directly to one of the distributed transaction APIs (Xopen or the CORBA Transaction Service, for example). Using these APIs directly tends to make code fairly hairy. Another scalability feature for designers and architects to take advantage of is the Stateless Session Bean. The EJB specification allows containers to pool instances of these and rotate through them on a request by request (invocation by invocation) basis. Your client can hold a single reference to a stateless session but in making 10 method calls to it, it may actually be serviced by 10 different instances of the bean. This enables scalability in a couple of ways:
1. methods on stateless session beans can be designed to be transactions, thus keeping critical sections short and increasing throughput by avoiding waits on locks. 2. Total memory utilization by the server will be less than if the container had to have one instance of the bean per client reference The passivation/activation mechanism is another scalability feature. With this feature, the container can keep a certain number of bean instances in memory, but swap state in and out of them so that that pool appears to the outside world as if it is far larger. This can keep a server running with a decent throughput even if its load is far higher than it might otherwise be able to handle What is the role of serialization in EJB? Location: http://www.jguru.com/faq/view.jsp?EID=301817 Created: Jan 13, 2001 Modified: 2001-01-20 14:24:31.453 Author: Tom McClure (http://www.jguru.com/guru/viewbio.jsp?EID=301803) Question originally posed by Laxmi bannai (http://www.jguru.com/guru/viewbio.jsp?EID=234299 A big part of EJB is that it is a framework for underlying RMI: remote method invocation. You're invoking methods remotely from JVM space 'A' on objects which are in JVM space 'B' -- possibly running on another machine on the network. To make this happen, all arguments of each method call must have their current state plucked out of JVM 'A' memory, flattened into a byte stream which can be sent over a TCP/IP network connection, and then deserialized for reincarnation on the other end in JVM 'B' where the actual method call takes place. If the method has a return value, it is serialized up for streaming back to JVM A. Thus the requirement that all EJB methods arguments and return values must be serializable. The easiest way to do this is to make sure all your classes implement java.io.Serializable. Comments and alternative answers
Yes, besides the answer above, I would like to add... Author: Mihir Kulkarni (http://www.jguru.com/guru/viewbio.jsp?EID=312865), Jan 25, 2001 Yes, besides the answer above, I would like to add that: To save the state of a stateful session bean. The EJB container is a CTM and has to do efficient management of resources - as a result it has to passivate beans and use its resources optimally. The passivation strategy used commonly is Java serialization, of course, the strategy is vendor specific. The above discussion is relevant to the passivation of the stateful session beans wherein it is necessary to save the state of the stateful session bean when it is about to be passivated - ie, being disassociated from the EJBObject. How to serialize large objects ? Author: Thomas Carrie (http://www.jguru.com/guru/viewbio.jsp?EID=499238), Oct 8, 2001
What if I want to serialize a large object (a few Mb) and use it as a stream on the server side. I think that serialization mechanism is not a good solution to that problem : it is slow (no // between network, client and server) and it uses a lot of memory. Does anyone have a good solution to that problem ? Re: How to serialize large objects ? Author: Sean Sullivan (http://www.jguru.com/guru/viewbio.jsp?EID=203382), May 8, 2002 In EJB 2.0, you can use Local interfaces. The advantage: you can avoid object serialization for method calls within the same JVM What is the correct DTD URL (DOCTYPE) for use with a messaging bean? [I am trying to deploy messaging bean using Weblogic 5.1 SP3. This comes as an example with weblogic. In the ejb-jar.xml for messaging bean, the DOCTYPE is defined as : DOCTYPE ejb-jar PUBLIC "-//Sun Microsystems, Inc.//DTD Enterprise JavaBeans 2.0//EN" "http://java.sun.com/j2ee/dtds/ejb_2_0.dtd" I found that the url to the DTD is incorrect. I am unable to deploy my bean. ] Location: http://www.jguru.com/faq/view.jsp?EID=303322 Created: Jan 15, 2001 Modified: 2001-01-16 07:02:32.632 Author: Matthew Kershaw (http://www.jguru.com/guru/viewbio.jsp?EID=243677) Question originally posed by Archana Karnik (http://www.jguru.com/guru/viewbio.jsp?EID=68139 I believe someone asked this question to Umit Yalcinalp in the EJB2.0 Java DevConn chat on 19-Sep-00. The answer given was "we have not published it yet, except listing it in the specification. This is because we currently have a draft of the specification and we needed to be flexible as we make changes to the spec. We plan to make it available when we have the Proposed Final Draft released." The DTD has yet to be released. http://developer.java.sun.com/developer/community/chat/JavaLive/2000/jl0919.htm l Comments and alternative answers
Try: http://java.sun.com/dtd/ejb-jar_2_0.dtd Author: Mihir Kulkarni (http://www.jguru.com/guru/viewbio.jsp?EID=312865), Jan 25, 2001 Try: http://java.sun.com/dtd/ejb-jar_2_0.dtd Try this DTD for weblogic-ejb-jar.xml http://www.b... Author: Tirumal Chamarti (http://www.jguru.com/guru/viewbio.jsp?EID=44418), Jan 28, 2001 Try this DTD for weblogic-ejb-jar.xml http://www.bea.com/servers/wls600/dtd/weblogic-ejb-jar.dtd
Is there any way to read values from an entity bean without locking it for the rest of the transaction (e.g. read-only transactions)? We have a keyvalue map bean which deadlocks during some concurrent reads. Isolation levels seem to affect the database only, and we need to work within a transaction. Location: http://www.jguru.com/faq/view.jsp?EID=303935 Created: Jan 16, 2001 Modified: 2001-01-20 14:26:16.291 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by Alex McManus (http://www.jguru.com/guru/viewbio.jsp?EID=117866 The only thing that comes to (my) mind is that you could write a 'group accessor' - a method that returns a single object containing all of your entity bean's attributes (or all interesting attributes). This method could then be placed in a 'Requires New' transaction. This way, the current transaction would be suspended for the duration of the call to the entity bean and the entity bean's fetch/operate/commit cycle will be in a separate transaction and any locks should be released immediately. Depending on the granularity of what you need to pull out of the map, the group accessor might be overkill. Why am I able to call a business method using the same Remote Interface reference after I called the remove() method of a Stateless Session Bean?? Location: http://www.jguru.com/faq/view.jsp?EID=307891 Created: Jan 20, 2001 Modified: 2001-01-20 14:40:32.385 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Arun Prasad Paramahamsan (http://www.jguru.com/guru/viewbio.jsp?EID=257985 Figure 6.9.3 - Client-invoked remove() from the EJB 1.1 specification answers your question. For Stateless Session Beans, the container may choose to optimize and re-use the EJB instance. Comments and alternative answers
For Stateless session bean two method calls to a bean... Author: rajesh agarwal (http://www.jguru.com/guru/viewbio.jsp?EID=101019), Jan 25, 2001 For Stateless session bean two method calls to a bean may not invoke the methods from the same bean. Moreover, the remove() method does not mean physically removing the bean. The remove() method on the stateless session bean ... Author: Mihir Kulkarni (http://www.jguru.com/guru/viewbio.jsp?EID=312865), Jan 25, 2001 The remove() method on the stateless session bean causes the bean instance to return back to the pool. Now, if you are calling a remote method after the remove, then
another instance from the pool will be taken up to service that request. Thus, it appears to the client that the bean was never removed. However, actually it was returned back to the pool. Also, which bean instance is going to serve that request depends upon the pooling strategy, if its LIFO, the same instance will be serving the request again. As the Specs say: "To the client, it appears as if the client controls the life cycle of the session object. However, the container handles the create and remove calls without necessarily creating and removing an EJB instance." Calling client's remove() method does not invoke the... Author: prajakt samant (http://www.jguru.com/guru/viewbio.jsp?EID=272793), Feb 5, 2001 Calling client's remove() method does not invoke the corresponding ejbRemove(),which is actually called during physical remove of the stateless session bean. Client's remove() method just returns the bean back to the pool. Re: Calling client's remove() method does not invoke the... Author: abhishek agrawal (http://www.jguru.com/guru/viewbio.jsp?EID=117348), Feb 27, 2002 It appears that sometime container can return same instance of stateless bean because of optimizaton. But if first call from client has modified some member variable of bean then getting same instance of bean is too risky. Please clear this confusion 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? Location: http://www.jguru.com/faq/view.jsp?EID=308342 Created: Jan 21, 2001 Modified: 2001-02-01 15:53:58.627 Author: Suresh Rangan (http://www.jguru.com/guru/viewbio.jsp?EID=308330) Question originally posed by sujatha karuppiah (http://www.jguru.com/guru/viewbio.jsp?EID=218765 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. Comments and alternative answers
The answer is fine, but i want to add onething here. Author: Banda Srinivas (http://www.jguru.com/guru/viewbio.jsp?EID=389958), Apr 5, 2001 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. thank you Srinivas Advantages Author: lyndon mendoza (http://www.jguru.com/guru/viewbio.jsp?EID=411396), Apr 27, 2001 I think the questioner wanted to know if there is an advantage in using entity beans as opposed to using just the jdbc api. There are a lot of advantages to using Entity Beans but if speed is paramount it may not be the best solution. If you have an existing system with tons of existing and well-tested stored procs don't just throw them away. I am guessing this is the main reason why you asked the question in the first place. You can leverage these procs with the use of jdbc api. nice intrepretation but... Author: Anthony, Cheuk Tung LAI (http://www.jguru.com/guru/viewbio.jsp?EID=1079401), Apr 25, 2003 It is a nice piece of intrepretation but if we delegate all the task to container to manage, it seems there are some uncertainty in some errors. Where and when should I use the context.getPrimaryKey() method rather than just accessing the Primary Key field(s) directly? Location: http://www.jguru.com/faq/view.jsp?EID=309978 Created: Jan 23, 2001 Modified: 2001-01-29 17:11:09.38 Author: Sathyanarayana Katakam (http://www.jguru.com/guru/viewbio.jsp?EID=245368) Question originally posed by TH Lim (http://www.jguru.com/guru/viewbio.jsp?EID=95720 context.getPrimaryKey() is used when an instance is associated with an EJB object, and is used during the callback methods (ejbActivate, ejbPassivate, etc ..) and business methods. This method should be called once the bean is associated with an EJBObject. As, if the bean is not associated with one, then you will get an IllegalStateException. The
earliest you can call this method without getting an exception is in the ejbPostCreate() mtehod. Comments and alternative answers
I found that in some BMP examples, Context.getPrim... Author: TH Lim (http://www.jguru.com/guru/viewbio.jsp?EID=95720), Jan 29, 2001 I found that in some BMP examples, Context.getPrimaryKey() is used to get the primary key in the method ejbLoad(). Why one has to do so as the primary key is aleady stored in its variable? Re: I found that in some BMP examples, Context.getPrim... Author: Zahid Iqbal (http://www.jguru.com/guru/viewbio.jsp?EID=58168), Sep 4, 2001 Well, though in some cases it will still work if one is not making use of Context.getPrimaryKey() (and is simply using EJB variable), but it is not a safe method to use EJB (PK) variable for this purpose. Let me explain it with an example. Suppose the user calls findByPrimaryKey() method on Employee (BMP) Entity EJB by passing it emp-id=1000. After the container delegates the request to ejbFindByPrimaryKey() method, it will query the database to check for the existence of employee for the requested emp-id. Since the ejbFindByPrimaryKey() is required to return the PrimaryKey value in case the record is found in the database, so it's upto the programmer either he/she explicitly set the value of EJB pk variable in this method (though it is not required as it should be done in ejbLoad()). In our example we consider that there is no such explicit assignment. So after that container initializes ejb instance based on the primary key value and then calls ejbLoad() method, it'll not be possible to retrieve pk value using EJB vairable(s). So the only way to do so is to call Context.getPrimaryKey() that will return pk value (emp-id=1000 in this case) that was returned earlier through ejbFindByPrimaryKey() method. So the above example shows that Context.getPrimaryKey() should be used in ejbLoad() that will work in all scenarios. Usually we should get the primary key from the context... Author: raviprolu pavan kumar (http://www.jguru.com/guru/viewbio.jsp?EID=217700), Jan 30, 2001 Usually we should get the primary key from the context when we cannot ensure that the bean has a consistent value because the same bean instance is not used everytime to execute every call a client makes. The bean is swapped from and to the pool. So when we use callback methods like ejbLoad or ejbStore, we should not use the bean instance' primary key but get it from
the bean context which is a more permanent storage than the poolable bean. When an instance is activated from a pool, a context is attributed to the instance which has a more permanent state of the bean than the instance itself. So usually while coding the callback methods like ejbPostCreate,()ejbLoad(), ejbActivate()and all the finder methods ejbFindByPrimaryKey() ejbFindByX() we should use context.getPrimaryKey() And rest of the coding may be done using the bean's key attribute. Can I use the Apache Web Server with the Sun J2EE Reference Implementation? Location: http://www.jguru.com/faq/view.jsp?EID=314392 Created: Jan 28, 2001 Modified: 2001-01-29 17:14:41.91 Author: Sebastian Kim (http://www.jguru.com/guru/viewbio.jsp?EID=314386) Question originally posed by Alex Chaffee PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=3 The answer to your question is yes and no: Under the Jakarta project of Apache, the product Tomcat, which extends the Apache Web Server, allows you to run your basic servlets, JSPs and the like. However, if you want to utilize J2EE's EJB functionality, you need to use an EJB container, which neither Apache nor Apache+Tomcat is (or rather has). If you're going down the open source road and sticking to Apache, the appropriate solution is JBoss (jboss.org). If you're open at this point, but want to stay away from BEA Weblogic or IBM Websphere, try Enhydra (enhydra.com) by Lutris. A list of free EJB Containers is listed here. Comments and alternative answers
If your question is "Can I use Apache as my w... Author: Uma Maheswari Kandasamy (http://www.jguru.com/guru/viewbio.jsp?EID=310809), Mar 7, 2001 If your question is "Can I use Apache as my webserver and the j2ee implementation kit as my app server?" then it should be possible. Though I have not worked under this combination, I know we can have apache as the webserver and weblogic as the app server. Re: If your question is "Can I use Apache as my w... Author: Richard Robinson (http://www.jguru.com/guru/viewbio.jsp?EID=395750), Jul 24, 2001 I have Apache 1.3.x (12?) running on a Linux box at home, that has also got the
Sun J2EE reference implentation running. And yes, it works. If you read the Minimalist User's Guide (for Tomcat 3.2.3 I believe) it talks about where you can configure Apache and Tomcat so that Apache handles everything (HTML, GIF, etc) other than servlets and JSPs. Go to jakarta.apache.org for document.
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? Location: http://www.jguru.com/faq/view.jsp?EID=315785 Created: Jan 29, 2001 Modified: 2001-01-31 22:04:14.634 Author: vasanth s (http://www.jguru.com/guru/viewbio.jsp?EID=314566) Question originally posed by prakash prabhu (http://www.jguru.com/guru/viewbio.jsp?EID=91561 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. Comments and alternative answers
Hi, The instance pool maintainence is up to the i... Author: Uma Maheswari Kandasamy (http://www.jguru.com/guru/viewbio.jsp?EID=310809), Mar 7, 2001 Hi, 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 app server. How it is implemented, it is again up to the implementer. Coming back to the question and assuming that the container supports pooling .... 1) The home interface can be pooled since it is doesnot hold the state of the client. Similarly the stateless session BEAN OBJECT INSTANCE can be pooled. 2)The other type of BEAN OBJECT INSTANCES (Stateful session bean and entity bean) holds the state of the client at any point of the time. So the Bean OBJECT INSTANCES cannot be pooled here. Maybe, the CLASS INSTANCES can be pooled and whenever a BEAN OBJECT INSTANCE of this type of beans is idle, it is
passivated and that CLASS INSTANCE is given to the next client. Note the difference between the CLASS INSTANCE and the OBJECT INSTANCE. CLASS and OBJECT INSTANCE The instance pool maintainence is up to the i... Author: r d (http://www.jguru.com/guru/viewbio.jsp?EID=385239), Mar 22, 2001 I am not clear about this in your previous reply. Will client not need OBJECT INSTANCE to work with? The instance pool maintainence is upto the impleme... Author: Uma Maheswari Kandasamy (http://www.jguru.com/guru/viewbio.jsp?EID=310809), Mar 7, 2001 The instance pool maintainence is upto 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 app server. How it is implemented, it is again up to the implementer. Coming back to the question and assuming that the container supports pooling .... 1. The home interface can be pooled since it is does not hold the state of the client. Similarly the stateless session BEAN OBJECT INSTANCE can be pooled. 2. The other type of BEAN OBJECT INSTANCES (Stateful session bean and entity bean) hold the state of the client at any point of the time. So the Bean OBJECT INSTANCES cannot be pooled here. Maybe, the CLASS INSTANCES can be pooled and whenever a BEAN OBJECT INSTANCE of this type of beans is idle, it is passivated and that CLASS INSTANCE is given to the next client. Note the difference between the CLASS INSTANCE and the OBJECT INSTANCE. The class instance is the one with no values attached to the class attributes and hence no state maintained. The object instance always holds the state of that object. Why don't Session Beans have to be re-entrant? Location: http://www.jguru.com/faq/view.jsp?EID=317316 Created: Jan 31, 2001 Modified: 2001-01-31 22:07:36.201 Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644) Question originally posed by murali P (http://www.jguru.com/guru/viewbio.jsp?EID=300299 It's not that they don't have to be re-entrant: they cannot be reentrant. The spec says "The container must ensure that only one thread can be executing an instance
at any time" (EJB 1.1 Spec. 6.11.6). This is partly to simplify development of the EJB: the bean developer needn't concern himself with concurrency issues. The other major factor is that Session beans are seen as extenstions of the client - multiple threads implies multiple clients, which does not fit with this view of an extension. Granted that stateless sessions are used more as facades over entities or service interfaces than as 'extensions of the client', the programming model (and the container's developer's task) are much simpler if we restrict session beans to one thread of execution at any one time. Also, because of the way that stateless session beans are pooled by the container, allowing two threads in one at once is not really needed. Of course, the 'Gotcha' here is that session beans can't be 'called back' to from another EJB even within the same transaction. The reason that Entity beans are allowed to be reentered (if their deployment descriptor says they're built that way) is that there are (arguably) more cases when an entity might need to be called back than there are for sessions. Comments and alternative answers
session bean reeentrance: easy answer Author: prajakt deshpande (http://www.jguru.com/guru/viewbio.jsp?EID=707071), Jan 3, 2002 EJB Spec 1.1 6.5.6 Serializing session bean methods A container serializes calls to each session bean instance. Most containers will support many instances of a session bean executing concurrently; however, each instance sees only a serialized sequence of method calls. Therefore, a session bean does not have to be coded as reentrant. Where can I find the DTD's for EJB Deployment Descriptors? Location: http://www.jguru.com/faq/view.jsp?EID=318375 Created: Feb 1, 2001 Modified: 2001-02-01 17:01:16.523 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by KiranKumar Ramamurthy (http://www.jguru.com/guru/viewbio.jsp?EID=228971 • •
EJB 1.1 http://java.sun.com/j2ee/dtds/ejb-jar_1_1.dtd EJB 2.0 http://java.sun.com/dtd/ejb-jar_2_0.dtd
When using EJB and making use of connection pools. How can changes to the database be audited per user? Location: http://www.jguru.com/faq/view.jsp?EID=318819 Created: Feb 1, 2001 Modified: 2001-02-02 12:11:16.527 Author: Subrahmanyam Allamaraju (http://www.jguru.com/guru/viewbio.jsp?EID=265492) Question originally posed by Chris Melville (http://www.jguru.com/guru/viewbio.jsp?EID=305546 This is quite not the case with EJBs. When you create a connection pool, the J2EE server is the client for the database. Since a J2EE environment is a shared environment, the practice is setup a very small number of connection pools, and
recycle the same pool of connections across several invocations (across several "users"). The notion of a database user does not therefore exist. For instance, you may have 1000 concurrent HTTP sessions, but only 10% of them may be using connections actively. In such cases if you try to allocate connections on user bases, you'll have too many idle connections, ultimately paying performance penalty. To answer your question, there is no direct and simple way of determining who changed what. A reasonable approach is to constrain the methods on various beans based on user roles, and log/audit certain business events (not database events). An alternate approach follows(thanks to Siva Visveswaran In order to do this we basically need to distinguish between the database user (used for connection therefore pooled) and the application user (not used to connect to db but perhpas part of an access control group that may vey well mirror your pools). For this we typically don't rely on DBMS logging but instead perform application level logging using LAST_UPDATED_USER and LAST_UPDATE _TIMESTAMP columns on the table. Okay so how do we populate the LAST_UPDATED_USER with the real user who's updating the information? We can obtain it from the Session/Entity context in the EJB. Comments and alternative answers
Sometimes you need to audit changes in the database... Author: Adam Skobodzinski (http://www.jguru.com/guru/viewbio.jsp?EID=130115), Feb 5, 2001 Sometimes you need to audit changes in the database on "per user" basis. This is especially true if you setup security in a database at the "row level". I use this technique for virtual private databases (VPD). I want to make sure that user can see only its own data and it is best if this security chcek is done at the database level. If you want to put entity beans into this solutions you have to create database pools for each user and deploy beans accordingly. This is not a very scalable solution. Is there any way around this? What about setting the res-auth to Application and... Author: Dan Christopherson (http://www.jguru.com/guru/viewbio.jsp?EID=39644), Feb 5, 2001 What about setting the res-auth to Application and calling DataSource.getConnection(String user, String password)? My take on this is, application level logging is c... Author: Shiv Swamy (http://www.jguru.com/guru/viewbio.jsp?EID=324245), Feb 8, 2001 My take on this is, application level logging is cumbersome and too expensive for performance based application but if you have business critical application with a need to maintain history, in that case you can have an auditing mechanism where you
can store the username, fieldchanged, newvalue, oldvalue, timestamp. This can be made as a history object that is connected to a table in the database. When using EJB and making use of connection pools. How can changes to the database be audited per user? Author: Allen Fogleson (http://www.jguru.com/guru/viewbio.jsp?EID=344251), Jun 3, 2001 We actually had a client insist on this since the DB vendor had convinced the client that only the database could effectively audit transactions. So we were forced into designing a system that did this. What we ended up doing was not using any entity beans, and all calls to the database used the datasource.getConnection(user, password) method. Im not sure how the container manages that, probably instantiates a new connection object, thus killing all the performace gained using a pool, but it worked. (slow... and im sure that will be the complaint next, but it worked) In EJB 2.0, What is a cmr-field. How can I differentiate between a cmr-field and a cmp-field? Location: http://www.jguru.com/faq/view.jsp?EID=319227 Created: Feb 2, 2001 Modified: 2001-02-13 08:29:21.802 Author: prajakt samant (http://www.jguru.com/guru/viewbio.jsp?EID=272793) Question originally posed by vikash mall (http://www.jguru.com/guru/viewbio.jsp?EID=214765 CMR stands for Container Managed Relation Field. In EJB 2.0 Persistence of CMP bean is managed by a Persistence manager The developer has to write his bean implementation class as abstract and Persistence Manager generates a concrete class for the bean. I will try to give an Example:Bean Developers Class:public abstract EmployeeBean implements javax.ejb.EntityBean { public public public public
abstract abstract abstract abstract
void setFirstName(String firstName); String getFirstName(); void setAddress(Address addr); Address getAddres();
}//end of class where Address is another abstract class(dependant object) having streetno,zip and other details In Deployment Descriptor:firstName myaddress
Address Thus when Persistence manager generates the concrete class for above abstract class.It creates a variable "firstName" of type String as CMP and "myaddress" which of type Address, which is a CMR or also called as dependant object. Regards Prajakt Comments and alternative answers
How the Dependant objects are mapped? Author: RATHAKRISHNAN K (http://www.jguru.com/guru/viewbio.jsp?EID=230041), Oct 24, 2001 firstName has been mapped to a field as given, but how about the Address Object's fields? How do we specify mapping between the fields of Address objects and that of the table in the DB? correction Author: Venugopal Thachappilly (http://www.jguru.com/guru/viewbio.jsp?EID=286533), Jul 23, 2002 Atleast in the latest specification of EJB 2.0, the above said is not entirely correct. CMR is a relationship between two entity beans and the relationship is also managed by the container. In the above example, address wouldn't be a value object, but a full fledged entity bean. Refer to the spec or a book for details. How can EJB's be accessed through Firewalls? Location: http://www.jguru.com/faq/view.jsp?EID=319285 Created: Feb 2, 2001 Modified: 2001-02-02 11:44:26.74 Author: Suresh Rangan (http://www.jguru.com/guru/viewbio.jsp?EID=308330) Question originally posed by shoban babu (http://www.jguru.com/guru/viewbio.jsp?EID=87955 With RMI over IIOP, RMI based EJB servers can be mixed with RMI based or CORBA Based EJB servers because everyone are propagating context information using IIOP. RMI has the ability to tunnel through Firewalls. This is very slow and arduous process, and it is really a security loophole. Special IIOP Firewall Proxies are developed and available that will permit IIOP traffic to pass through. If you are using IIOP protocol, any RMI or CORBA code you write will navigate the firewall. Limitations are the effectiveness of the proxies. ie you will have to have proxies on both client and server. One cant set up a B2C site with a IIOP proxy thinking that will be a solution for the problem. Only for limited applications where the server and client can be controlled, IIOP proxy add value. IONA provides a proxy called WonderWall and Borland provides the VisiBroker GateKeeper.
Comments and alternative answers
You could also use the Simple Object Access Protocol... Author: Steve Sarandos (http://www.jguru.com/guru/viewbio.jsp?EID=321309), Feb 5, 2001 You could also use the Simple Object Access Protocol (SOAP). This technology sends remote procedure calls in XML format which will pass right thru the firewall on the HTTP port (like a web page). The performance might be a little slower than IIOP but it will work without having to reconfigure the firewall or install proxies. An open source Java version is available at xml.apache.org. Re: You could also use the Simple Object Access Protocol... Author: Prasanna Singh (http://www.jguru.com/guru/viewbio.jsp?EID=280922), Mar 27, 2001 I was trying to authenticate firewall inorder to send SOAP message accross the internet and i was using java authenticate class. But did not work for me. What is the correct way to do the authentication ? thanks Re: Re: You could also use the Simple Object Access Protocol... Author: ce ce (http://www.jguru.com/guru/viewbio.jsp?EID=238982), Mar 27, 2001 I think it depends on what type of authentication the firewall/proxy is expecting. If your firewall wants NTLM level authentication then java may cause you a problem since when the HTTP request goes out and the firewall returns an NTML authentication msg the JVM may see that as an error. What type of firewall are you using? How can EJB's be accessed through Firewalls? Author: L Gilbert (http://www.jguru.com/guru/viewbio.jsp?EID=748154), Feb 5, 2002 You can also use IIOPS to tunnel IIOP via SSL e.g. port 447. This relies on the client side ORB to establish the session. For setup, see: Chapter 8 of:- WebSphere Advanced Edition: Security http://publib-b.boulder.ibm.com/Redbooks.nsf/RedbookAbstracts/sg246520.html Does EJB 1.1 support mandate the support for RMI-IIOP ? What is the meaning of "the client API must support the Java RMI-IIOP programming model for portability, but the underlying protocol can be anything" ? Location: http://www.jguru.com/faq/view.jsp?EID=319549 Created: Feb 2, 2001 Modified: 2001-02-02 16:26:35.097 Author: Nick Minutello (http://www.jguru.com/guru/viewbio.jsp?EID=222214) Question originally posed by sanjeev jain (http://www.jguru.com/guru/viewbio.jsp?EID=211266 EJB1.1 does mandate the support of RMI-IIOP. OK, to answer the second question:
There are 2 types of implementations that an EJB Server might provide: CORBAbased EJB Servers and Proprietry EJB Servers. Both support the RMI-IIOP API but how that API is implemented is a different story. (NB: By API we mean the interface provided to the client by the stub or proxy). A CORBA-based EJB Server actually implements its EJB Objects as CORBA Objects (it therefore encorporates an ORB and this means that EJB's can be contacted by CORBA clients (as well as RMI-IIOP clients) A proprietry EJB still implements the RMI-IIOP API (in the client's stub) but the underlying protocol can be anything. Therefore your EJB's CANNOT be contacted by CORBA clients. The difference is that in both cases, your clients see the same API (hence, your client portability) BUT how the stubs communicate with the server is different. Does RMI-IIOP support dynamic downloading of classes? Location: http://www.jguru.com/faq/view.jsp?EID=320155 Created: Feb 3, 2001 Modified: 2001-02-13 08:37:58.472 Author: RaghuRam Vudathu (http://www.jguru.com/guru/viewbio.jsp?EID=319533) Question originally posed by Alex McManus (http://www.jguru.com/guru/viewbio.jsp?EID=117866 No, RMI-IIOP doesn't support dynamic downloading of the classes as it is done with CORBA in DII (Dynamic Interface Invocation).Actually RMI-IIOP combines the usability of Java Remote Method Invocation (RMI) with the interoperability of the Internet Inter-ORB Protocol (IIOP).So in order to attain this interoperability between RMI and CORBA,some of the features that are supported by RMI but not CORBA and vice versa are eliminated from the RMI-IIOP specification.You can download from the Sun Microsystems RMI-IIOP home page. And on the other hand if your question is Does RMI-IIOP support code downloading for Java objects sent by value across an IIOP connection in the same way as RMI does across a JRMP connection? Then the answer is Yes. Comments and alternative answers
The JDK 12 redeisgn RMI Author: zhen liu (http://www.jguru.com/guru/viewbio.jsp?EID=385991), Apr 4, 2001 The JDK 12 support the dynamic class loading. I would like to bind my EJB object (container managed or bean managed) to Oracle 8 DBMS_ALERT or DBMS_PIPE so that my object is notified whenever there is an update in the database by some batch process. Is it possible to do? If so, how? Location: http://www.jguru.com/faq/view.jsp?EID=322782 Created: Feb 7, 2001 Modified: 2001-02-13 08:30:20.201 Author: Alexey Ryndin (http://www.jguru.com/guru/viewbio.jsp?EID=221245)
Question originally posed by mrinal mitra (http://www.jguru.com/guru/viewbio.jsp?EID=241593 If you use Oracle 8 you can use ORACLE ADVANCE QUERYING and subscribe for it with JMS, so you object can register some message listener, which will be notified when message sent by your batch process will arrive. For more detail information how to lookup Oracle Advance Querying system and to subscribe your JMS receiver or subscriber, look http://technet.oracle.com/docs/products/oracle8i/doc_library/817_doc/appdev.817/a 85456.pdf. (You may need to register yourself on technet.oracle.com first). Comments and alternative answers
Would this architecture actually work with CMP & BMP? Author: Pratap Das (http://www.jguru.com/guru/viewbio.jsp?EID=129542), Mar 26, 2001 How would a non-Message Driven Bean be able to receive this JMS message from Oracle? Wouldn't its passivation have an impact on this architecture? Would you clarify a bit more about this solution? --Das Re: Would this architecture actually work with CMP & BMP? Author: Stu Charlton (http://www.jguru.com/guru/viewbio.jsp?EID=423826), May 17, 2001 Entities and Sessions can't directly receive messages from JMS. You would need an active object to montior the JMS queue, which would then act as an EJB client. See the J2EE Patterns on http://developer.java.sun.com for an example of adapting JMS onto EJB's without message-driven beans. What is a Message Driven Bean, What functions does a message driven bean have and how do they work in collaboration with JMS? Location: http://www.jguru.com/faq/view.jsp?EID=327430 Created: Feb 13, 2001 Modified: 2001-02-13 08:45:45.329 Author: ranjay sinha (http://www.jguru.com/guru/viewbio.jsp?EID=290360) Question originally posed by vasanth s (http://www.jguru.com/guru/viewbio.jsp?EID=314566 Message driven beans are the latest addition to the family of component bean types defined by the EJB specification. The original bean types include session beans, which contain business logic and maintain a state associated with client sessions, and entity beans, which map objects to persistent data. Message driven beans will provide asynchrony to EJB based applications by acting as JMS message consumers. A message bean is associated with a JMS topic or queue and receives JMS messages sent by EJB clients or other beans. Unlike entity beans and session beans, message beans do not have home or remote interfaces. Instead, message driven beans are instantiated by the container as required. Like stateless session beans, message beans maintain no client-specific state, allowing the container to optimally manage a pool of message-bean instances.
Clients send JMS messages to message beans in exactly the same manner as they would send messages to any other JMS destination. This similarity is a fundamental design goal of the JMS capabilities of the new specification. To receive JMS messages, message driven beans implement the javax.jms.MessageListener interface, which defines a single "onMessage()" method. When a message arrives, the container ensures that a message bean corresponding to the message topic/queue exists (instantiating it if necessary), and calls its onMessage method passing the client's message as the single argument. The message bean's implementation of this method contains the business logic required to process the message: public void onMessage(javax.jms.Message message) // code to handle message Note that session beans and entity beans are not allowed to function as message beans. Comments and alternative answers
You can learn more about asynchronous messaging and... Author: Suresh Rangan (http://www.jguru.com/guru/viewbio.jsp?EID=308330), Feb 13, 2001 You can learn more about asynchronous messaging and message beans here. See this article Author: Alex Chaffee (http://www.jguru.com/guru/viewbio.jsp?EID=3), Dec 11, 2001 The article EJB 2 Message-Driven Beans by Dion Almaer walks through creating and using a MessageDrivenBean. Message Driven Bean Author: Manjula Gundluri (http://www.jguru.com/guru/viewbio.jsp?EID=738246), Jan 29, 2002 When we have JMS already present to handle asynchronous messages,then why we have Message Driven beans in EJB2.0 Re: Message Driven Bean Author: Ashutosh Rai (http://www.jguru.com/guru/viewbio.jsp?EID=769095), Feb 23, 2002 A quote from this article will probably answer your question. The aricle: EJB 2 Message-Driven Beans by Dion Almaer. The quote: "That was pretty easy. That is the great thing about MDBs. We don't have lots of ugly JMS code (like we had in the client, or like we would have if we wrote the consumer from scratch)" -ashutosh
When calling an EJB from another EJB should they both be packaged in same JAR?. Are the any preferences for Weblogic or any other servers? Location: http://www.jguru.com/faq/view.jsp?EID=332819 Created: Feb 19, 2001 Modified: 2001-02-25 07:49:39.083 Author: Alexey Ryndin (http://www.jguru.com/guru/viewbio.jsp?EID=221245) Question originally posed by Junaid Shamim (http://www.jguru.com/guru/viewbio.jsp?EID=136546 Definitely not. You can use any object published in JNDI by looking up it by name, obtain reference to it and narrowing this reference. As far as I know this can be done with any J2EE compatible server. The only possible catch is to have the client classes available to the calling bean. See What classes does a client application need to access EJB? Comments and alternative answers
But If the beans are in the same J2EE Application unit ... Author: Jonathan Morrissey (http://www.jguru.com/guru/viewbio.jsp?EID=330060), Mar 19, 2001 I agree with the previous answer that the beans do not need to be in the same jar, but it's worth knowing that if they are in the same container you can use EJB references (see EJB spec 1.1, page 207, Sect 14.3). I have used this in my current project with a performance gain of over 50%. Regards, Jonathan What about a J2EE application accescing a EJB in another EJB Applicaction? Author: Luis Soeiro (http://www.jguru.com/guru/viewbio.jsp?EID=447389), Jun 28, 2001 I am trying to have an EJB in one J2EE application (.ear file), A, access an EJB in another J2EE application, B. If you just setup JNDI names and EJB references, application "A" can't find B's Home Interface. If you get the generated application "B" Client jar (with the required Stubs) and add it to the application "A" EJB jar, you get another error at runtime, meaning App "A" can't still find the EJB located in the deployed App "B". Is there any special packaging necessary? MDB to Stateless session bean call Author: Ashutosh Rai (http://www.jguru.com/guru/viewbio.jsp?EID=769095), Feb 23, 2002 Hi, I am trying to call a method on a stateless session bean. The session bean is in a seperate ear file. Both the beans are getting deployed successfully. But the jndi lookup is not working. When we use a standalone client, we specify the naming provider using a jndi.properties file. For calling a bean from another bean how does the calling bean get naming provider info? In my case, I am getting a "name not found" exception. Is it essential to give a reference to the session bean in the MDB deployment descriptor? I feel that the call should be similar to using a standalone client, if not what is the difference?
I am using Oracle j2ee container (orion) Thanks -ashutosh Can I re-use the same Primary key class for various Entity Beans? Location: http://www.jguru.com/faq/view.jsp?EID=342031 Created: Mar 1, 2001 Modified: 2001-03-01 15:23:42.06 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Roy abraham (http://www.jguru.com/guru/viewbio.jsp?EID=340391 Yes, you sure can. Comments and alternative answers
same Primary ket class Author: Mahesh Bhagia (http://www.jguru.com/guru/viewbio.jsp?EID=429170), May 26, 2001 How will you be able same Primary key for various Entity bean, because according to EJB specification, pk for eg BuyerBean is BuyerPK, that means PK name is related to the name of the Entity Bean Re: same Primary ket class Author: vijay Yellai (http://www.jguru.com/guru/viewbio.jsp?EID=431786), May 31, 2001 that is just a naming convention used for readability and understanding. Normally it would be easier for another develeoper to maintain ones code if the PK class was named after the bean it belongs to. This is possible beacuse the association of the primary key is done only during the deploment and the deployer can associate any PK class with any bean aslong as the fields in the PK class exist with the same name in the bean as persistant fields Can you control when passivation occurs? Location: http://www.jguru.com/faq/view.jsp?EID=342056 Created: Mar 1, 2001 Modified: 2002-09-25 07:14:48.493 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Kim Johansson (http://www.jguru.com/guru/viewbio.jsp?EID=329972 The developer, according to the specification, cannot directly control when passivation occurs. Although for Stateful Session Beans, the container cannot passivate an instance that is inside a transaction. So using transactions can be a a strategy to control passivation. The ejbPassivate() method is called during passivation, so the developer has control over what to do during this exercise and can implement the require optimized logic.
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)." Where can I find an example of the command pattern implemented with EJB? Location: http://www.jguru.com/faq/view.jsp?EID=342497 Created: Mar 2, 2001 Modified: 2001-03-07 07:32:55.824 Author: Jonathan Morrissey (http://www.jguru.com/guru/viewbio.jsp?EID=330060) Question originally posed by Devendra Partap (http://www.jguru.com/guru/viewbio.jsp?EID=64273 There is a discussion of this pattern on the serverSide site titled Command Pattern (Abstracted value-objects in/out of EJB). How to create serialized deployment descriptor in EJB 1.0? Location: http://www.jguru.com/faq/view.jsp?EID=345478 Created: Mar 6, 2001 Modified: 2001-03-07 07:34:33.48 Author: Jayesh Nazre (http://www.jguru.com/guru/viewbio.jsp?EID=44356) Question originally posed by Preeti Aggarwal (http://www.jguru.com/guru/viewbio.jsp?EID=338884 Well most of the Application servers have tools for creating the deployment descriptor. But if they do not have it, then you can use the SessionDescriptor class for creating a deployment descriptor for session beans and EntityDescriptor class for entity beans. For further reference refer the following JavaDoc But remember that EJB 1.1 uses XML for specifying the deployment descriptor and these classes have since been deprecated. Where I could find good literature on J2EE architecture? Location: http://www.jguru.com/faq/view.jsp?EID=346382 Created: Mar 7, 2001 Modified: 2001-03-07 08:18:31.866 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by Dnyanesh Bendre (http://www.jguru.com/guru/viewbio.jsp?EID=274207 The best place to start is the J2EE Blue Prints located at http://java.sun.com/j2ee/blueprints/index.html Comments and alternative answers
Sun includes a good J2EE Developer's Guide with their... Author: Rahul Khimasia (http://www.jguru.com/guru/viewbio.jsp?EID=55768), Mar 7, 2001 Sun includes a good J2EE Developer's Guide with their J2EE reference
implementation soft documentation. The included guide is in HTML format, but you can also download a PDF version from http://java.sun.com/j2ee/j2sdkee/devguide1_2_1.pdf. The blueprint is not a valid architecture Author: ben menasha menasha (http://www.jguru.com/guru/viewbio.jsp?EID=399216), May 27, 2001 The blueprint (despite how it is marketed) is really just a showcase of many different technologies. To anyone who has developed a commerce site or any complex web application the petstore is massive, unmaintable and complex. The whole model architecture is duplicated in both the web app and ejb module, the amount of code for the functionality products is nothing to be proud off. In fact the intro states that that for a real project this is overkill and one should not develop this an exacting MVC architecture as it is costly and duplicates effort all over the place. J2EE application should primarly be designed just as any OO application is written, the services that J2EE provides can be used and should be used when needed, but I personaly don't think that the petstore is a good example of application architecture. Althugh it is a great sample app for showing off all the technologies at once. Where can I find "EJB/J2EE coding standards" ? Location: http://www.jguru.com/faq/view.jsp?EID=346527 Created: Mar 7, 2001 Modified: 2001-03-11 16:08:12.033 Author: Jonathan Morrissey (http://www.jguru.com/guru/viewbio.jsp?EID=330060) Question originally posed by Yatin Sanghvi (http://www.jguru.com/guru/viewbio.jsp?EID=87651 Here are some useful links on this topic: • •
The J2EE Blue Prints The ServerSide.com patterns
There is also a useful thread on the topic of J2EE naming standards here . Comments and alternative answers
RE: Where can I find "EJB/J2EE coding standards" ? Author: Luigi Viggiano (http://www.jguru.com/guru/viewbio.jsp?EID=101985), Mar 25, 2001 I'm not aware about generally accepted coding standards around. Looking at the Sun site, in "Java Live" chat about J2EE standardization, there're people asking for coding standards to Sun: check this link: http://developer.java.sun.com//developer/community/chat/JavaLive/2000/jl0201.html. How can I use a local DTD to validate ejb-jar.xml instead of going to SUN's server as specified in DOCTYPE element? Location: http://www.jguru.com/faq/view.jsp?EID=347169
Created: Mar 8, 2001 Modified: 2002-12-01 15:45:28.793 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by nicole li (http://www.jguru.com/guru/viewbio.jsp?EID=281530 You can do this by specifying a local DTD-file in the SYSTEM property of the DOCTYPE element. Here is an example: If your DTD was located inside a localfolder - "C:/localdtd" then your DOCTYPE element should be as follows: Comments and alternative answers
No don't change the doctype! You'll have to change... Author: Gene De Lisa (http://www.jguru.com/guru/viewbio.jsp?EID=38746), Mar 16, 2001 No don't change the doctype! You'll have to change it back! Look at the org.xml.sax.EntityResolver interface. if you have sun's implementation look at com.sun.xml.parser.Resolver The Weblogic 6.0 ejbc only permit the PULBLIC DOCTYPE Author: Qiao Lian (http://www.jguru.com/guru/viewbio.jsp?EID=410298), Apr 26, 2001 I edit the XML with local DTD, then the Weblogic 6.0 ejbc report error DOCTYPE. The error do not uccor when I use the PUBLIC DOCTYPE. Can the activation/passivation of beans be tuned so that passivation is NOT done unless absolutely necessary. Which servers support this, and how? Location: http://www.jguru.com/faq/view.jsp?EID=348928 Created: Mar 11, 2001 Modified: 2001-03-11 16:14:47.094 Author: Robert Castaneda (http://www.jguru.com/guru/viewbio.jsp?EID=4362) Question originally posed by David Mullineux (http://www.jguru.com/guru/viewbio.jsp?EID=55639 Please see this FAQ. Comments and alternative answers
ACTIVATION/PASSIVATION Author: OBUCHI MACHINI (http://www.jguru.com/guru/viewbio.jsp?EID=297581), Apr 3, 2001 Yes,this can be tuned accordingly.. The APPSERVER Which I know of is "WEBLOGIC 5.1 ". In this u can tune the Activation/Passivation Re: ACTIVATION/PASSIVATION Author: Gautam Mehta (http://www.jguru.com/guru/viewbio.jsp?EID=390509),
Apr 13, 2001 can u explain it in a bit detail Thanks Gautam Re: ACTIVATION/PASSIVATION Author: lakshman prasad (http://www.jguru.com/guru/viewbio.jsp?EID=423825), Jun 17, 2001 Dear Obuchi, Can explain little more about how to do this tunning in weblobic app sever. How can I pass a ResultSet from an EJB to a client? what are the best classes to use? Location: http://www.jguru.com/faq/view.jsp?EID=349555 Created: Mar 12, 2001 Modified: 2001-03-15 13:41:49.123 Author: Jonas Bergqvist (http://www.jguru.com/guru/viewbio.jsp?EID=81465) Question originally posed by Alec Smecher (http://www.jguru.com/guru/viewbio.jsp?EID=319506 It is better that you iterate through the ResultSet on the server side and return a Vector of Vectors (or something else similar) representing the rows and columns of the ResultSet. Everything that is sent between the EJB server and the EJB client should of course be serializable (due the to RMI specification). A ResultSet is NOT serializable and therefore you should (can) not return a ResultSet. Comments and alternative answers
Use can use CachedRowSet to pass ResultSet back to client and to other beans. Author: Stan UA1OUT (http://www.jguru.com/guru/viewbio.jsp?EID=555595), Nov 21, 2001 Check out sun.jdbc.rowset.CachedRowSet class. It can be used to disconnect a rowset from the DB and passed back to the client. Since cached rowset implements javax.sql.RowSet the client can manipulate the disconnected instance of the cached class as usual. To be able to use CachedRowSet you have to download and put on your client's and server's classpath rowset.jar file. The above is described in more details in "Data transfer Rowset" EJB pattern. Regards, Stan How can I get the underlying JDBC connection which the CMP bean is using? Location: http://www.jguru.com/faq/view.jsp?EID=351799 Created: Mar 15, 2001 Modified: 2001-03-15 15:00:32.431 Author: sukumar kaukuntla (http://www.jguru.com/guru/viewbio.jsp?EID=351793)
Question originally posed by prateek saxena (http://www.jguru.com/guru/viewbio.jsp?EID=304604 Technically speaking you can't. But you can access a JDBC connection within the same transaction from a CMP bean using the following XML deployment descriptor : <enterprise-beans> <entity> <description>Datasource for the myDB database jdbc/myDB java.sql.Datasource Container ... .... Comments and alternative answers
sir i need some EJB examples can u provide it to me?... Author: sudhes kumar palaniswamy (http://www.jguru.com/guru/viewbio.jsp?EID=352874), Mar 16, 2001 sir i need some EJB examples can u provide it to me? my emailid is [email protected] thanking u sudhes india Might be possible... Author: Ivo Limmen (http://www.jguru.com/guru/viewbio.jsp?EID=327483), Apr 9, 2001 The J2EE 1.2 specifications state that retrieving the JDBC connection should but possible but it might be having a context that is not stated as specified in the specifications. This is a piece of the specifications: This specification recommends, but does not require, that all resource factory references be organized in the subcontexts of the application component’s environment, using a different subcontext for each resource manager type. For example, all JDBC™ DataSource references should be declared in the "java:comp/env/jdbc" subcontext, all JMS connection factories in the "java:comp/env/jms" subcontext, all JavaMail connection factories in the "java:comp/env/mail" subcontext, and all URL connection factories in the "java:comp/env/url" subcontext. This means that you will have to lookup in your console application at the used naming facilities and see what the naming context is for the JDBC connections. You can use a context lookup to retrieve the Bean's JDBC datasource. With regard to Entity Beans, what happens if both my EJB Server and Database crash, what will happen to unsaved changes? Is there any transactional log file used? Location: http://www.jguru.com/faq/view.jsp?EID=412828
Created: Apr 30, 2001 Author: Shaun Childers (http://www.jguru.com/guru/viewbio.jsp?EID=30243) Question originally posed by ponraj sivaram (http://www.jguru.com/guru/viewbio.jsp?EID=314542 Actually, if your EJB server crashes, you will not even be able to make a connection to the server to perform a bean lookup, as the server will no longer be listening on the port for incoming JNDI lookup requests. You will lose any data that wasn't committed prior to the crash. This is where you should start looking into clustering your EJB server. Comments and alternative answers
Answer Author: Uma Maheswari Kandasamy (http://www.jguru.com/guru/viewbio.jsp?EID=310809), May 6, 2001 Hi, Any unsaved and uncommited changes are lost the moment your EJB Server crashes. If your database also crashes, then all the saved changes are also lost unless you have some backup or some recovery mechanism to retrieve the data. So consider database replication and EJB Clustering for such scenarios, though the occurence of such a thing is very very rare. Thx, Uma Database's log files will take care of them Author: Rahul kumar Gupta (http://www.jguru.com/guru/viewbio.jsp?EID=4809), May 7, 2001 All databse have the concept of log files(for exampe oracle have redo log files concept). So if data bases crashes then on starting up they fill look up the log files to perform all pending jobs. But is EJB crashes, It depend upon the container how frequenlty it passivates or how frequesntly it refreshes the data with Database For Entity Beans, What happens to an instance field not mapped to any persistent storage,when the bean is passivated ? Location: http://www.jguru.com/faq/view.jsp?EID=412829 Created: Apr 30, 2001 Author: Jonathan Morrissey (http://www.jguru.com/guru/viewbio.jsp?EID=330060) Question originally posed by bob miller (http://www.jguru.com/guru/viewbio.jsp?EID=342494 The specification infers that the container never serializes an instance of an Entity bean (unlike stateful session beans). Thus passivation simply involves moving the bean from the "ready" to the "pooled" bin. So what happens to the contents of an instance variable is controlled by the programmer. Remember that when an entity bean is passivated the instance gets logically disassociated from it's remote object. Be careful here, as the functionality of passivation/activation for Stateless Session, Stateful Session and Entity beans is completely different. For entity beans the ejbPassivate method notifies the entity bean that it is being disassociated with a particular entity prior to reuse or for dereferencing and possible garbage collection. Unlike stateful session beans the state does not need to be stored in secondary storage as by definition it already exists in permanent storage.
How can I connect to multiple databases using CMP I have 6 SQL servers running on Windows NT platform. I need to connect to one of these depending on customer login . How can I achieve this using CMP? I can not pass fixed connection String to the container as everytime I am changing SQL server depending on Customer. Location: http://www.jguru.com/faq/view.jsp?EID=421472 Created: May 14, 2001 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Subodh Chintawar (http://www.jguru.com/guru/viewbio.jsp?EID=416739 Theoretically you can achieve it with CMP, but using 6 different instances of the application server, or 6 'applications' on your application server (if it will allow you). Each application will connect to one of your 6 databases. Based on the login of your customer, you get the correct InitialContext(). Comments and alternative answers
Other ideas.. Author: Stu Charlton (http://www.jguru.com/guru/viewbio.jsp?EID=423826), May 17, 2001 Some extended CMP implementations should allow for multiple mappings inside an EJB JAR. WebGain's TopLink, for instance, might be able to do this, since it adds a lot of features outside the realm of CMP. Re: Other ideas.. Author: Cornel Antohi (http://www.jguru.com/guru/viewbio.jsp?EID=491370), Sep 15, 2001 A question: i can use only one BMP that will receive the databaseURL as parameter ? That are the implications ? 6 diff databases Author: bidarkar jay kumar (http://www.jguru.com/guru/viewbio.jsp?EID=440821), Jun 18, 2001 i trie using weblogic5.1(though older) but it worked when i used to connect to 3 different databases.i guess this should happen in any case. Other Ideas!.. Using Different Connection Pools Author: Sridhar Panatula (http://www.jguru.com/guru/viewbio.jsp?EID=232093), Oct 2, 2001 In computing environments where there is no container kind of stuff, I would have made a connection to a server depending upon the login by associating groups with servers and thus giving a different servername and other details to connect. Like Different DSN name in Windows Environment. I would try to achieve the same thing here by using different connection pools and associating groups of users with Connection Pool. I would query for the login properties before selecting the dbConn(Conection pool name).
Good Luck, Does WebSphere support EJB 2.0? Location: http://www.jguru.com/faq/view.jsp?EID=424210 Created: May 18, 2001 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by ram t (http://www.jguru.com/guru/viewbio.jsp?EID=244164 No, it doesn't. At this point in time, the EJB 2.0 specification is not completely finalized. Why can't a Stateless SEssion Bean implement the SessionSynchronization interface? it might also want to be notified of the transaction events. Location: http://www.jguru.com/faq/view.jsp?EID=424215 Created: May 18, 2001 Modified: 2002-01-09 06:43:11.325 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Feng Xue (http://www.jguru.com/guru/viewbio.jsp?EID=56913 It's just because a Stateless Session Bean does not have state. The container does not guarantee (like for the Stateful SEssion Bean) that the bean that will be used on two method calls, will be the same. Comments and alternative answers
Here is a more precise answer. Author: Subrahmanyam Allamaraju (http://www.jguru.com/guru/viewbio.jsp?EID=265492), May 18, 2001 To be precise, for the sake of argument, let's say that a stateless bean can maintain (it can, in fact) state. During a transaction, a client can invoke one or more methods on a bean. However, the container does not guarantee that the same bean instance is used for all calls. Imagine a pool of instances participating in a group of concurrent trasnactions. Since an instance can participate in multiple ongoing transactions, it can not compensate (or synchronize) itself due to transaction commit/rollback. You can try to visualize this by trying to write some code for synchronization.
It would make sense with container-managed transactions Author: Heikki Linnakangas (http://www.jguru.com/guru/viewbio.jsp?EID=722172), Jan 16, 2002 If you used container-managed transactions, so that a new transaction is created for each method call, using SessionSynchronization on a stateless session bean would
actually make sense. I tried to do that because I wanted to trace the transaction boundaries to a log file, to measure how long it takes to perform a transaction, and how long the commit takes. I was quite confused because it didn't work, until I found out that SessionSynchronization doesn't work with stateless session beans. Re: It would make sense with container-managed transactions Author: Sivakumar Janarthanan (http://www.jguru.com/guru/viewbio.jsp?EID=1036581), Dec 11, 2002 yes, I agree that it would have been very helpful if session synchronization interface had been provided for stateless session beans with container managed transactions. In my current project, I have a requirement where, if a transaction gets rolled back, I need to do some database updates (or need to write some status information to a flat file) in a totally new transaction. With no session synchronization support for stateless session beans which use container managed transaction, it is really hard to do it. One of the ways could be, for each of the business method in the stateless session bean, if the business method is the initiator of the transaction and before the control is getting out of the method, I need to check whether the transaction is getting rolled back and if so, call another session bean method with a transaction attribute of "REQUIRED NEW" and do the database updates. This needs to be enforced by the programmer only and it might be error prone. Instead, if the EJB specs had allowed session synchronization interface for stateless session beans which uses container managed transactions, it would have been very helpful in this kind of scenario. Where can I learn (more) about Application Servers? Location: http://www.jguru.com/faq/view.jsp?EID=431183 Created: May 30, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru AppServer FAQ. Where can I learn (more) about becoming certified in Java technology? Location: http://www.jguru.com/faq/view.jsp?EID=431185 Created: May 30, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru Certification FAQ. Where can I learn (more) about CORBA (Common Object Request Broker Architecture)? Location: http://www.jguru.com/faq/view.jsp?EID=431188 Created: May 30, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru CORBA FAQ.
Where can I learn (more) about Java running on IBM's AS/400 series computers? Location: http://www.jguru.com/faq/view.jsp?EID=431194 Created: May 30, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru Java400 FAQ. Where can I learn (more) about Java's reusable software components, JavaBeans? Location: http://www.jguru.com/faq/view.jsp?EID=431197 Created: May 30, 2001 Modified: 2001-06-16 16:04:06.477 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru JavaBeans FAQ. Comments and alternative answers
Advanced Java Programming Author: Naveen Madenhalli (http://www.jguru.com/guru/viewbio.jsp?EID=1253053), Jul 13, 2005 If a applet client wants to send a request to a server, what are the various steps to be followed? Where can I learn (more) about JDBC, Java's Database Connectivity solution? Location: http://www.jguru.com/faq/view.jsp?EID=431206 Created: May 30, 2001 Modified: 2001-07-24 09:55:24.202 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru JDBC FAQ. Where can I learn (more) about Java's support asynchronous and publish/subscribe messaging using JMS (Java Message Service)? Location: http://www.jguru.com/faq/view.jsp?EID=431210 Created: May 30, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru JMS FAQ. Where can I learn (more) about using JNDI (Java Naming and Directory Interface)? Location: http://www.jguru.com/faq/view.jsp?EID=431212 Created: May 30, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru JNDI FAQ. Where can I learn (more) about using design patterns with Java? Location: http://www.jguru.com/faq/view.jsp?EID=431238
Created: May 30, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru Patterns FAQ. Where can I learn (more) about Java Servlets? Location: http://www.jguru.com/faq/view.jsp?EID=431246 Created: May 30, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru Servlets FAQ. Comments and alternative answers
Advanced Java Programming Author: Naveen Madenhalli (http://www.jguru.com/guru/viewbio.jsp?EID=1253053), Jul 13, 2005 Explain the various steps involved in building your own bean with suitable example Where can I learn (more) about Java's support for developing multithreaded programs? Location: http://www.jguru.com/faq/view.jsp?EID=431248 Created: May 30, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru Threads FAQ. Where can I learn (more) about Java's support for transaction processing? Location: http://www.jguru.com/faq/view.jsp?EID=431948 Created: May 31, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the jGuru Transactions FAQ. Where can I learn (more) about JCA (Java Connector Architecture)? Location: http://www.jguru.com/faq/view.jsp?EID=431958 Created: May 31, 2001 Author: John Mitchell (http://www.jguru.com/guru/viewbio.jsp?EID=4) Check out the Sun's Java Connector Architecture homepage. How do we express the relationships between EJB Entity Beans in UML? Location: http://www.jguru.com/faq/view.jsp?EID=431997 Created: May 31, 2001 Author: jim conallen (http://www.jguru.com/guru/viewbio.jsp?EID=242550) Question originally posed by Peter Lin (http://www.jguru.com/guru/viewbio.jsp?EID=387708
I wish I had a quick answer for you, but the real answer lie in the activities of the JSR 26 committee. This group is currently working on a formal extension (profile) to the UML for modeling EJBs. I've seen some draft work, but can't say with any authority what the final outcome will be. With that comment aside, I'd suggest that you model relationships with associations, and draw them in class diagrams. Component diagrams, are only suitable for expressing dependencies (a weak form of relationship). Associations are used to model the concept of an instance maintaining a relationship to another instance. A dependency just shows that the class is dependent on another element. That is, if the interface changes or something like that, as opposed to a state change in the dependent object. Comments and alternative answers
Modeling relationships between EJBs Author: Ara Kassabian (http://www.jguru.com/guru/viewbio.jsp?EID=57884), Jul 6, 2001 To some extent, the answer depends on whether your model is a business (analysis) model or a design model. If it is a business model, then your classes are just business (domain) objects, many of which map to EJBs. In that case, you just draw relationships (association or inheritance) between the business objects as dictated by the semantics of the business domain. How those associations are implemented is not a concern at this level. If your model is a design model, on the other hand, your classes represent EJBs. In the JSR 26 referred to by Jim Conallen, stereotypes are used to identify whether a class is an entity bean, session bean, etc. The stereotypes are in fact a sort of shorthand. An entity bean actually consists of a group of Java classes: the implementation class, the remote interface, the stubs/skeletons, the local interface, etc. An association or an inheritance relationship between EJBs may be implemented in different ways, depending on which design pattern(s) you use. Some standard patterns are now emerging (see Sun's EJB blueprint directory, jGuru, and elsewhere). However, I do not believe any of them have been codified into stereotypes or any sort of shorthand notation as yet. So, IMHO, expressing relationships between entity beans in a UML model means chossing between two options: 1. Draw all the EJB classes explicitly in the class diagram and draw the relationships as you intend to implement them. 2. If you are going to be consistent in your implementation (always a good idea :-), use a shorthand notation (e.g., stereotypes) for the EJBs and for the relationships, and document the shorthand using supporting class diagrams (where you explicitly draw all the classes and associations).
Hope this answers the question somewhat. Entity Beans with no primary keys Is it possible to create an Entity Bean(CMP) based on table that does not have a primary key. Location: http://www.jguru.com/faq/view.jsp?EID=433111 Created: Jun 3, 2001 Author: Shirish Poddar (http://www.jguru.com/guru/viewbio.jsp?EID=86336) Question originally posed by Pankaj Jha (http://www.jguru.com/guru/viewbio.jsp?EID=431702 Yes, you can create CMP Entity Beans without primary keys. But you must be aware of the implications: 1. Duplicate records may be entered in the table 2. The findByPrimaryKey() method may return varying rows In essence, CMP was not designed to not have primary keys, although it can work. The development process is the same as when you create CMP which has primary keys. Comments and alternative answers
Entity Beans with no primary keys Is it possible to create an Entity Bean(CMP) based on table that does not have a primary key. Author: Allen Fogleson (http://www.jguru.com/guru/viewbio.jsp?EID=344251), Jun 3, 2001 You can create a custom Primary key class that contains all the columns in the table. (assuming that would be fairly unique) The only hassles there would be in implementing the hashcode method. Re: Entity Beans with no primary keys Is it possible to create an Entity Bean(CMP) based on table that does not have a primary key. Author: xxxxx yyyyy (http://www.jguru.com/guru/viewbio.jsp?EID=759426), Feb 14, 2002 I have created an entity bean for a table which does not have a primary key and it does not work. There is nothing stops you creating an entity bean(CMP) for a table which does not have a primary key but the result return by the finder method is wrong. Though the table does not have primary key, the CMP bean randomly picks a column(most likey the first column) out of a table and mkes it a primary key (which is absolutely wrong). Conclusion: A CMP entity bean for a table which does not have a primary key is not going to work. You must have a primary key to work properly. No Primary Key Class in Entity Beans Author: Shirish Poddar (http://www.jguru.com/guru/viewbio.jsp?EID=86336), Jun 9, 2001
Generally we create a separate primary key class in a Enity Bean. We can do without this creation also. What we can do is we have to write in the EJB-Jar.XML the primary key class name as Java predefined class, such as java.lang.string,any wrapper classes. <prim-key-class>java.lang.String <primkeyfield>accountId In this case Duplicate recrods will not be allowed. Re: No Primary Key Class in Entity Beans Author: Allen Fogleson (http://www.jguru.com/guru/viewbio.jsp?EID=344251), Jun 14, 2001 But in this case you are saying that the acountID is the primary key... So effectively you have made the table have a "primary key". I think in general we have to be aware that although primary keys may not be required, the detriment to not having at least one unique field is that finders may not operate as expected. Yes it is possible Author: prashant jani (http://www.jguru.com/guru/viewbio.jsp?EID=100991), Jan 18, 2002 in the cmp xml file. Do not provide CMp mapping for the primary key. Thats all but u will have to create a sequence at the database level for the primary key. this will avoid duplicate keys problem Jani Two primay key?? Author: F M (http://www.jguru.com/guru/viewbio.jsp?EID=737992), Jan 29, 2002 What about two primary key in 1 table (normalization table, many-to-many example)?? If let say I create a class for this primary key class, how can I retrieve it or how can I use a finder findByPrimaryKey?? I'm still confuse how to use this primary key class. about EJB performance Where can I find articles about EJB performance? Location: http://www.jguru.com/faq/view.jsp?EID=438168 Created: Jun 12, 2001 Author: Luis F. Canals Samaniego (http://www.jguru.com/guru/viewbio.jsp?EID=66172) Question originally posed by slose Lin (http://www.jguru.com/guru/viewbio.jsp?EID=429700 Here are some links: An official white paper about EJB performance: http://developer.java.sun.com/developer/technicalArticles/ebeans/ejbperformance/ http://www.jdance.com/ejbperformance.shtm has some links to pages about EJB performance If you use IBM WebSphere, http://advisor.com/wFiles.nsf/wCatID/Miw0009.vonag01.zip/$file/Vonag01.zip can be useful.
But if you use WebLogic 5.1, in http://www.weblogic.com/docs51/classdocs/API_ejb/EJB_deploy.html#1032825 you can see some tips. Here, you can see how to reduce network traffic Comments and alternative answers
EJB performance Author: Shahram Khorsand (http://www.jguru.com/guru/viewbio.jsp?EID=3357), Jun 17, 2001 The EJB performance is very dependent on the products you are using. However, couple of really good reviews of different products are available on http://www.theserverside.com. Cheers, Shahram Using the Java Connector Architecture with EJBs Can I map an entity bean to an EIS for which a JCA resource manager exists? Ideally, I would like to use container managed persistence for this. Location: http://www.jguru.com/faq/view.jsp?EID=440204 Created: Jun 16, 2001 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by Ara Kassabian (http://www.jguru.com/guru/viewbio.jsp?EID=57884 Is there a COM Bridge that lets Windows developers create native client applications that access Enterprise JavaBeansTM (EJBTM) components deployed on a J2EE App server? Location: http://www.jguru.com/faq/view.jsp?EID=448051 Created: Jun 30, 2001 Author: Davanum Srinivas (http://www.jguru.com/guru/viewbio.jsp?EID=2011) Yes. Take a look at: JavaTM 2 Platform, Enterprise Edition Client Access Services (J2EETM CAS) COM Bridge 1.0 Early Access. How do I use an EJB to handle simple authentication to an LDAP directory? Location: http://www.jguru.com/faq/view.jsp?EID=449495 Created: Jul 4, 2001 Author: Nicholas Whitehead (http://www.jguru.com/guru/viewbio.jsp?EID=1260) Question originally posed by John Doe (http://www.jguru.com/guru/viewbio.jsp?EID=215716 There are code samples in Sun's JNDI tutorial that explain how to perform LDAP authentication through JNDI. My recommendation would be to create a session bean that acquires an LDAP /JNDI context in the setSession() method. A subsequent call to authenticate would pass in
a user and password. The following code shows how to authenticate the passed values: env.put(Context.InitialContextFactory, "com.sun.jndi.ldap.LdapCtxFactory"); // I added this line myself env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=S. User, ou=NewHires, o=JNDITutorial"); env.put(Context.SECURITY_CREDENTIALS, "mysecret"); // Create the initial context DirContext ctx = new InitialDirContext(env); A failure in authentication will cause this code to throw a javax.naming.AuthenticationException You may want to store the actual LDAP tree that contains the users you are authenitcating so youi can dynamically set it without recoding, so the actual code may look like this if you store the LDAP tree name in JNDI as "myUserLDAPTree" (ou=NewHires, o=JNDITutorial): env.put(Context.InitialContextFactory, "com.sun.jndi.ldap.LdapCtxFactory"); // I added this line myself env.put(Context.SECURITY_AUTHENTICATION, "simple"); env.put(Context.SECURITY_PRINCIPAL, "cn=" + passedUserName + "," + (String)new InitialContext().lookup("myUserLDAPTree")); env.put(Context.SECURITY_CREDENTIALS, passedPassword); // Create the initial context DirContext ctx = new InitialDirContext(env); The simply return a true, or a false if a javax.naming.AuthenticationException is thrown. Comments and alternative answers
How would you find and store the actual LDAP tree? Author: neal ravindran (http://www.jguru.com/guru/viewbio.jsp?EID=17737), Mar 5, 2003 You have said "You may want to store the actual LDAP tree that contains the users you are authenitcating so youi can dynamically set it without recoding, so the actual code may look like this if you store the LDAP tree name in JNDI as "myUserLDAPTree" (ou=NewHires, o=JNDITutorial): " I have to authenticate users at different ou levels...Some are one level deep other are more than that. How can I write a common login program using the technique you mentioned? Stateful Session Beans and Fail Over How are stateful session beans handled in a failover situation -- is this vendor dependent?
Location: http://www.jguru.com/faq/view.jsp?EID=452355 Created: Jul 9, 2001 Author: Shahram Khorsand (http://www.jguru.com/guru/viewbio.jsp?EID=3357) Question originally posed by Krishna Dev (http://www.jguru.com/guru/viewbio.jsp?EID=414725 There is no standard for failovers.Each AppServer implements it differently. I made a comparison between, Weblogic (WL), Websphere(WAS) and Borland App server(BAS). I found that BAS had the best failover. They simply right the state to a database within 5 seconds intervals. This is of course configurable. BAS had even the best clustering alternative. My tests showed that this feature didn't have any impact on the performance. If you are planning on spending alot of money. There are hardware clusters and different technologies that provide HA (high availability) services. see SUN clustering servers. When it comes to WL and WAS there wasn't a clean failover technology that didn't impact the performance. Because the problem with statefullness is that it makes everything so much slower. I found that BAS gave us the best performance. Comments and alternative answers
Some justification... Author: Nick Minutello (http://www.jguru.com/guru/viewbio.jsp?EID=222214), Sep 1, 2001 I think we might need a few more details to back up the comments on "who's best". Firstly, it is guaranteed that you will have to accept some performance hit when you cluster. You cant get scalability and availability otherwise. There is no such thing as a free lunch. Secondly, unless I am mistaken, BAS dont really have a statefull fail-over solution. (I could be wrong). My understanding is that the only state replication mechanism is via passivation! This means you might get statefull session failover with BAS if the Session Bean miraculously gets passivated just before its failover.... I dont know of any other state replication mechanism that Borland has. I would gladly be corrected on this if this were wrong. Weblogic achieves statefull replication using ip-multicast - to broadcast the state to any number of other servers in the cluster that happen to contain a replica (you can configure any number of replicas - usually you have just one). Even so, weblogic's solution isnt transactional - in that you can never be guaranteed that the replica has received the state before your method returns. If you did make it transactional - ie you had almost 100% surity that your statefull failover has failed over to one with a valid
state - then performance would be affected dramatically. I am not sure of Websphere's strategy - so I have no place commenting on it. So, in conclusion, clustering and fail-over DO have a performance cost. I suspect you dont see a performance impact with Borlands solution because, in fact, it doesnt have a statefull fail-over solution. Re: Some justification... Author: Janakiraman Nellissery (http://www.jguru.com/guru/viewbio.jsp?EID=539086), Mar 27, 2002 Hi Nick, How do we make the fail-over in WLS as Transactional? Do u know what is the setting reqd in WLS to do that.? Thanx. -Janakiraman
Re[2]: Some justification... Author: Nick Minutello (http://www.jguru.com/guru/viewbio.jsp?EID=222214), Mar 27, 2002 You can't make fail-over transactional. None of the EJB containers support this. In any case, the performance impact would be quite large - you would be talking about a 2PC commit on every transaction. Correcting my earlier post, WLS doesnt use *multi-cast* to replicate - but the in-memory replication is done over the network. Weblogic does this after the Stateful bean's transaction commit - which means there is only a tiny window where failure can occur resulting in state loss. Borland and Websphere do a periodic passivation to database - leaving (usually) a 5 second window where a failure can occur resulting in state loss.
Old Author: John Zukowski (http://www.jguru.com/guru/viewbio.jsp?EID=7), Jul 10, 2001 Unfortunately, they are from 1999. Re: Old Author: John Zukowski (http://www.jguru.com/guru/viewbio.jsp?EID=7), Jul 10, 2001 Oops, 2000 for the J2EE ones. The standard library ones are 1999. Re[2]: Old Author: innum onenu (http://www.jguru.com/guru/viewbio.jsp?EID=385539), Dec 2, 2001 so What's the inference about javareport.com package structure? Is it new and updated or old? Also, eventhough the main root element is J2EE, guess it doesn't cover all the J2EE API's(JMS, JNDI etc.) Any other place where the entire(latest) set could be found? Also any thoughts on how to produce these sort of documents? Is it possible to attain through javadoc? Lastly, What are all the API's covered under J2EE and their latest versions(a link would be great). Can i use SOAP to expose my EJB objects? Location: http://www.jguru.com/faq/view.jsp?EID=474484 Created: Aug 12, 2001 Author: Davanum Srinivas (http://www.jguru.com/guru/viewbio.jsp?EID=2011) Yes, of course. There's an article on TheServerSide.com that shows you how to do this: Integrating Apache SOAP with an EJB Server. Comments and alternative answers
That link is dead... try this Author: Kevin Baker (http://www.jguru.com/guru/viewbio.jsp?EID=882634), May 26, 2002 http://www.theserverside.com/home/thread.jsp?thread_id=2086 Does setting the Home and Object stubs to null from an EJB client improve performance? Location: http://www.jguru.com/faq/view.jsp?EID=475266 Created: Aug 13, 2001 Author: Nick Minutello (http://www.jguru.com/guru/viewbio.jsp?EID=222214) Question originally posed by prakash prabhu (http://www.jguru.com/guru/viewbio.jsp?EID=91561 No, not really. If your appserver uses JRMP, then it *might* mean that your serverside objects (EJB's) get garbage collected sooner. However, it depends on the appserver's lifecycle
management. Since IIOP is mandated in the EJB spec (and IIOP does not support distributed garbage collection) then most appservers probably rely on a different strategy for object lifecycle management. If you ARE using JRMP, then the client-side garbage collection of the stubs (which can be accelerated by setting references to null) can reduce the network load (as the stubs sit there pinging the server objects to keep them alive). However, I dont see that much of an improvement in performance to warrant setting stubs to null when you are done with them. In fact, you will get better performance by *caching* your home stubs (these are always slow to look up). Check out the Home Factory pattern at http://www.theserverside.com/home/thread.jsp?thread_id=7931 In EJB 2.0 Entity Beans, What is the difference between the local home interface and the remote home interface? Location: http://www.jguru.com/faq/view.jsp?EID=477519 Created: Aug 15, 2001 Author: Christopher Pickslay (http://www.jguru.com/guru/viewbio.jsp?EID=468619) Question originally posed by CustomWare Asia Pacific PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=139414 EJB 2.0 adds the notion of local beans, which are accessible only from within the JVM your beans are running in. The idea behind this is that many beans you might create are never meant to be accessed by remote clients. For example, you may program beans meant for your public interface like Order and Invoice, and you may have other helper beans which are never meant to be instantiated by remote clients, like Inventory and SalesTaxCalculator. Or you might have an entire system that takes advantage of EJB's transaction management, persistence, etc, but which has no remote (i.e., outside the current JVM) clients at all. With EJB 1.1, you had to implement remote client views for all these beans, even if you had no remote clients. This means that your home and remote interfaces had to extend javax.rmi.Remote, which puts several restrictions on them, including: • • • •
Any objects passed as parameters must be serializable Parameters are passed by value, not by reference Network and serialization overhead related to RMI Client must handle RemoteException on all method calls
Local beans also have limitations, the primary one being that you can only access them from within the same JVM, so they don't make much sense for distributed applications. Also, if you're converting your old remote interfaces to local ones, you have to be careful about the pass-by-reference semantics, which may lead to unintended consequences. Note that you can implement both remote and local interfaces to your beans. But in most cases it makes more sense to define your application model first, based on
access, distribution, and deployment needs, and then decide on local vs. remote based on the tradeoffs. In EJB 2.0, What is an Entity Bean's local interfaces? How do I define them? Location: http://www.jguru.com/faq/view.jsp?EID=477524 Created: Aug 15, 2001 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by CustomWare Asia Pacific PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=139414 In EJB 2.0, An Entity Bean can have a set of Local interfaces for use by clients within the same JVM (known as collocated clients). The local interfaces extend the following interfaces: • •
javax.ejb.EJBLocalObject - for the Object interface javax.ejb.EJBLocalHome - for the Home interface
Arguments between these interfaces and clients calling them are passed by reference. What is the difference between Public Final Draft and Public Final Draft 2 of EJB 2.0? Location: http://www.jguru.com/faq/view.jsp?EID=479764 Created: Aug 20, 2001 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by CustomWare Asia Pacific PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=139414 Check out section E.12 of Public Final Draft 2 for a complete listing of the changes between versions. The major changes were the addition of Local interfaces and Local Home interfaces for both Entity and Session Beans. On the Container Managed Persistence (CMP) front, Dependant Objects (which were a source of controversy) were removed. What is the J2EE ECperf? Location: http://www.jguru.com/faq/view.jsp?EID=488276 Created: Aug 31, 2001 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by CustomWare Asia Pacific PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=139414 ECperf is used for benchmarking J2EE application servers. It consists of a Specification and a benchmarking kit which is designed specifically to test and measure performance and scalability of J2EE application servers. More information can be found at the ECperf homepage here
Comments and alternative answers
Official ECperf website Author: Rodney Russ (http://www.jguru.com/guru/viewbio.jsp?EID=407228), Jan 23, 2002 If you would like to see certified ECperf results, you might want to check out http://ecperf.theserverside.com/ecperf. Currently, there are only results posted for WebSphere and Borland's appserver. How do EJB and Web Services relate together? Are Web Services a replacement for EJB? Location: http://www.jguru.com/faq/view.jsp?EID=488279 Created: Aug 31, 2001 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by CustomWare Asia Pacific PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=139414 Web Services can be thought of as a wrapper that can be used to allow EJB's to invoke external services and also to allow external services and clients to invoke the EJB's. A major strength of Web Services is in the integration of the J2EE platform with the Microsoft .NET platform. Using Web Services allows, for example, Microsoft Visual Basic clients to access EJB's as clients. Some products such as IBM WebSphere and BEA WebLogic already support Web Services inside there Application Servers. Comments and alternative answers
EJB and Webservices Author: Uma Maheswari Kandasamy (http://www.jguru.com/guru/viewbio.jsp?EID=310809), Sep 2, 2001 EJBs are Java Components that can be only accessed directly using another Java client. The disadvantage here is that these components and its services are remotely available to only Java application. (Here I am not talking about web clients) Suppose you want have a service, say, Tax Calculation Service EJB, which you would want another application to access, no matter what kind/technology that application is written in, then you will go for this WebServices. All you would do is PUBLISH your service to a registry called the UDDI and let the other applications know about such a service. Then, this other application will contact the REGISTRY using SOAP and know about the methods and parameters that your component needs and will build up a SOAP REQUEST for your component. Your component will then do the Tax Calculation and then give back a SOAP RESPONSE which the client application will use for its purpose.
So EJB is one way to write your WebService. Hope this makes things clear, Uma Re: EJB and Webservices Author: ChandraShekhar Rao (http://www.jguru.com/guru/viewbio.jsp?EID=308678), Dec 5, 2001 Hello, Pls can I have clear details about Webservices. ie. If I want to do webservices programming what i need. Pls can u gice me clear info EJB and Webservices Author: Ranjith CP (http://www.jguru.com/guru/viewbio.jsp?EID=797328), Mar 14, 2002 Web Services enables businesses to interact each other without human interaction. If you want to make your business web service enabled,you need to obey some rules defined by www.w3.org.These protocols are called SOAP.You create a WSDL file,which have all the operations.It must have the input payload (the arguments which come in)and output payload(the xml which contain the output arguments). Re: EJB and Webservices Author: Alex Robinson (http://www.jguru.com/guru/viewbio.jsp?EID=818985), May 2, 2002 Why can't EJBs/App Servers just encapsulate the Webservices implementation? EJBs are already designed to support different protocols for communication including Java RMI and IIOP. Why couldn't it also support SOAP? It would then be the responibility of the app server when generating the EJB Object implementation for the stub and proxy to implement the necessary logic to support SOAP. Additionally the App Server could support UDDI for finding services similar to how Java programs currently find EJBs using JNDI. Ultimately it seems to me the implementation of a web service could be completely transparent to the java developer accept for maybe some additional work in the deployment descriptor. Then any Session EJB could easily be exposed as a web services and available to any web service ready technology. Am I wrong or is this the ideal solution where web services is available automatically to Java EJB developers and interoperability with other technologies is easier to acheive without requiring the Java developer to learn a new set of APIs? Of course still need to address the issue of a Java program accessing a web service where the EJB Object stub would not be available like a .NET web service. In EJB 2.0, What is an ejbSelect() method? Location: http://www.jguru.com/faq/view.jsp?EID=488299 Created: Aug 31, 2001 Author: CustomWare Asia Pacific (http://www.jguru.com/guru/viewbio.jsp?EID=139414) Question originally posed by
CustomWare Asia Pacific PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=139414 A select method is similar to a finder method for Entity Beans, they both use EJB-QL to define the semantics of the method. They differ in that an ejbSelect method(s) are not exposed to the client and the ejbSelect method(s) can return values that are defined as cmp-types or cmr-types. For more information on EJB QL, see this FAQ. How can I update the primary key field in a CMP Entity Bean? Location: http://www.jguru.com/faq/view.jsp?EID=515864 Created: Oct 9, 2001 Author: Tim Duggan (http://www.jguru.com/guru/viewbio.jsp?EID=506387) Question originally posed by Shanks75 shanks75 (http://www.jguru.com/guru/viewbio.jsp?EID=506367 You cannot change the primary key field of an Entity bean. Refer to page 130 of the EJB 2.0 specification, it states "Once the primary key for an entity bean has been set, the Bean Provider must not attempt to change it by use of set accessor methods on the primary key cmp-fields. The Bean provider should therefore not expose the set accessor methods for the primary key cmp-fields in the component interface of the entity bean." A work around to update a primary key field, would be to remove and then an recreate the bean. When using Websphere 3.5, VisualAge and Oracle to develop CMP EJB's I receive the following error: "Unable to insert data into a NOT NULL field". What am I doing wrong? Location: http://www.jguru.com/faq/view.jsp?EID=515867 Created: Oct 9, 2001 Author: Shai Almog (http://www.jguru.com/guru/viewbio.jsp?EID=501707) Question originally posed by Theresa Betts (http://www.jguru.com/guru/viewbio.jsp?EID=506361 You need to modify the create method for the Entity bean to initialize ALL the not null fields. VAJ defaults to initializing the primary key but it doesn't initialize the NOT NULL fields, this won't work because any invocation of create() immediately causes insert. Take a look (or debug) the deployed code generated by VAJ to see the generated code that is deployed into the server. Comments and alternative answers
Attempted to insert null value Author: rajesh tiwari (http://www.jguru.com/guru/viewbio.jsp?EID=268316), Oct 14, 2001 You have attempted to insert null value to a field which has been stated as not null ===> Solution, always initialize all the fields before invoking the create method, or provide a costructor which will intialize all the required value, so that even though the
value has not been provided by the client to some of the field, it will go with the default value provided by the java Answer Author: Rocky NAIR (http://www.jguru.com/guru/viewbio.jsp?EID=537969), Nov 3, 2001 well hi there proabably in in the backend that particular field will be not null and u must be trying to insert a null field .. in visula age there is an option for break points.. and also u can see which field has got what values in the top right corner.. this way u can check which variable has got a null value and compare it with the database Regards.. Inserting NOT NULL Author: Somashekhar Kori Shetty (http://www.jguru.com/guru/viewbio.jsp?EID=95700), Nov 15, 2001 declare all the class variables of String type to blank as String var = "" ; But incase of the Date, if it is CMP, then you have to assign the default date. Where as in BMP, you can just skip the field. Re: Inserting NOT NULL Author: C. N. Tsang (http://www.jguru.com/guru/viewbio.jsp?EID=967331), Jul 28, 2002 I considered this as the Oracle's BAD behavior. If you insert an empty string ("") into a NOT NULL field in Oracle, Oracle will change it to null, and thus cause exception. I bypass it by change the value of the field to a blank (" "). I have tested DB2 and Interbase (Firebird) does not have this problem. Can stateful behave as stateless Is it possible to change a Stateful Session Bean to behave in a Stateless manner at deploy-time? What issues are involved? Location: http://www.jguru.com/faq/view.jsp?EID=547716 Created: Nov 14, 2001 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by sachin V (http://www.jguru.com/guru/viewbio.jsp?EID=507759 Stateful and Stateless Session Beans are for different purposes. Therefore, stateful session bean cannot act as a Stateless Session Bean since their lifecycles are different. You can create a Stateful Session Bean to not store any conversational state and therefore, at least in theory, you can make it stateless, but since the lifecycles of Stateless and Stateful Session Beans are different, you do not achieve anything by doing this. Comments and alternative answers
Stateful to stateless Author: Subrahmanyam Allamaraju (http://www.jguru.com/guru/viewbio.jsp?EID=265492), Nov 15, 2001
I would like to clarify the above answer. It is possible to change stateful beans into stateless beans declaratively. However, depending how the bean is implemented there may be some side effects. Firstly, if the state of the bean is modified by different methods, there may be inconsistencies in the behavior of the bean. Secondly, the container will not invoke session synchronization methods and hence you can not manipulate the state of the bean in the case of a rollback. As long as your bean does not depend on the above two, you can make a stateful bean stateless. In your case, you may have to carefully analyze if there is state held in the bean, and if so, how the state is modified by different methods.
Can an EJB determine its own JNDI name? Location: http://www.jguru.com/faq/view.jsp?EID=547718 Created: Nov 14, 2001 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by stefano traballesi (http://www.jguru.com/guru/viewbio.jsp?EID=547075 No. A work-around would be to put <env-entry> in the deployment descriptor and the EJB could then read the environment variable. What is the meaning of marshalling and unmarshalling? Location: http://www.jguru.com/faq/view.jsp?EID=560072 Created: Nov 25, 2001 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Omar Khan (http://www.jguru.com/guru/viewbio.jsp?EID=232689 Omar, In few words, "marshalling" refers to the process of converting the data or the objects inbto a byte-stream, and "unmarshalling" is the reverse process of converting the byte-stream beack to their original data or object. The conversion is achieved through "serialization". The purpose of the "marshalling/unmarshalling" process is to transfer data between the RMI system. Is it possible to convert a Java Bean to an Enterprise Java Bean (EJB)? Location: http://www.jguru.com/faq/view.jsp?EID=560079 Created: Nov 25, 2001 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by David Burg (http://www.jguru.com/guru/viewbio.jsp?EID=537744
I f I have to write EJBs, can I first write JavaBeans and later convert them to EJBs? Yes, you can convert them later, but keep in mind that Java Beans are client-side objects and EJBs are server side object, and they have completely different development, lifecycle, purpose... They have nothing in common other than the fact that they both have Java Beans in their name. It is the same as if you ask can you convert any java class into EJB. The answer is still yes given that the class you want to make an EJB does not violate any of the EJB restrictions posed in its specifications. If you need to write EJBs, it is a big waste of time to create java beans and then convert them to EJBs. There is absolutely no good reason to do that and many reasons why not to do it. Comments and alternative answers
but how might this be done? Author: java rine (http://www.jguru.com/guru/viewbio.jsp?EID=557631), Dec 1, 2001 sorry if this might sound like an ignorant question. I'm a newbie to the EJB technology and would like to find out how this conversion might be done? Do i just cut and paste the methods and attributes from the javabean into corresponding methods in the bean class of the EJB or are there special issues to look out for? Are there any examples where i can look for such a conversion? Convert JavaBeans to EJB's? Author: Kevin Baker (http://www.jguru.com/guru/viewbio.jsp?EID=882634), May 26, 2002 I am currently working without a J2EE server, so must develop this stage of my app withouth EJB's. I will definately be moving to J2EE in the future though... So I will have to convert all of my beans. Its seems to me that it shouldn't be that difficult, but would love to see an example of this. "...Java Beans are client-side objects and EJBs are server side object...." Excuse me too for being a bit of a newbie. This statement above just seems a little off. I can see how javabeans can be used client side... but I am actively using them in my server-side jsp scripts. So to me they are not exclusively client-side. Maybe you could explain that statement a bit more. Thanks Re: Convert JavaBeans to EJB's? Author: jay raj (http://www.jguru.com/guru/viewbio.jsp?EID=822224), Oct 28, 2002 Hi! I can tell the difference between JavaBeans and Enterprise Java Beans.For what purpose they are used for: (1)JavaBeans are not used for distributed purposes and EJB's are used for
Distributed applications. (2)Basically JavaBeans are used for intraprocess communications, where as EJB's are used for interprocess communications.EJB's are widely used to develop applications in 3-tier architectures. (3)One way, they are realated to each other, they are component based models.A component is developed for specific purpose and not for specific application.It can be reused across the software life cycle. So dude, clearly understand what EJB is meant for and what javabean is meant for.The power of EJB can be achieved by utilising it for the right purpose. Regards, jay.. In EJB 1.1., how do I ensure that while any client can access EJB A, only EJB A should be allowed to access EJB B? ie my client cannot access EJB B directly. Location: http://www.jguru.com/faq/view.jsp?EID=560080 Created: Nov 25, 2001 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by lina chitturi (http://www.jguru.com/guru/viewbio.jsp?EID=388164 (Keeping in mind that 1.1 version does not support run_as_mode) Hi, Maybe this it's just a silly idea, but can't you just limit the access to EJB B inside the deployment descriptor, using the <method-permission> tag? <method-permission> guest <method> <ejb-name>EJB_A <method-name>* <method-permission> administrators <method> <ejb-name>EJB_B <method-name>* This should not allow anyone without the administrator permissions to access to the EJB_B, and I think that you can set the context inside EJB_A to be in that security level.
Bypassing login prompt for J2EE1.3 using runclient command Location: http://www.jguru.com/faq/view.jsp?EID=560676 Created: Nov 26, 2001 Author: Gerard Weatherby (http://www.jguru.com/guru/viewbio.jsp?EID=550879) Question originally posed by Gauri Tendulkar (http://www.jguru.com/guru/viewbio.jsp?EID=542648 Additional Information While connecting to J2EE1.3 server for a standalone java application (in .ear) using runclient command, there is the need to bypass the login prompt for login name and password. As per the documentation, this can be done by the following command: runclient -client <> -name <> -Dj2eelogin.username=<<user_name>> -Dj2eelogin.password=<<password>> But this does not work. (Ultimately it prompts for login name and password). Documentation is incorrect (or at least unclear). Set VMARGS to: -Dj2eelogin.username=<<user_name>> -Dj2eelogin.password=<<password>> before executing runclient. Comments and alternative answers
Bypassing login prompt for J2EE1.3 using runclient command Author: Len White (http://www.jguru.com/guru/viewbio.jsp?EID=568486), Nov 30, 2001 Are you sure this should not be j2eelogin.name, not j2eelogin.username? Recovering State of Statefull SessionBean. I know how to get the EJBHandle of a Statefull SessionBean and write it to a file and I get a reference to the EJBObject after I read it back. Now the question is: (a) Does the handle in itself store the variable values? (b) How do I get these values back and construct the bean if my app server has crashed? (c) If we cannot do it, then how do I do session fail over management? Location: http://www.jguru.com/faq/view.jsp?EID=560681 Created: Nov 26, 2001 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by Janakiraman Nellissery (http://www.jguru.com/guru/viewbio.jsp?EID=539086 EJB specs section 2.1.3.1 reads: while a session bean is transactional, it is not recoverable should its container crash. with that in mind, comments are below.
(a) No. Handle is a simple "pointer" used to locate a bean. So, it does not store the values of the variables of the beans although specifications do not prohobit this implementation. (b) Read the top of my message. so, you cannot automatically. You could try to save the state of stateful session bean to non-volatile storage after each method invocation. that wastes lots of resources but could be implemented if you really, really need to keep client's state when server crashes. Of course, you would need a mechanism to recover that state from storage yourself. (c) Well, you do not. The design of stateful session beans is such that it starts out at default and maintains a state as clients perform operations on the system. Nowhere in the specifications do you read that session are "crash-safe" or that there is a failover when server crashes. Web containers do not keep http sessions around when they crash and ejb container is no different. As I wrote in (b) you can implement it yourself but you have be smart on how you go about doing it. Comments and alternative answers
Recovering State of Statefull SessionBean. Author: Adam Young (http://www.jguru.com/guru/viewbio.jsp?EID=584348), Dec 13, 2001 Instead, you would do something like: EJBObject e; try{ e = handle.getObject() }catch (Exeception e){ e = localGetObject(); } Where localGetObject()cretes the instance in the first place. I would suggest making a client side proxy for Your Session EJB that does this for you. Session state after a server crash Author: Tore Green (http://www.jguru.com/guru/viewbio.jsp?EID=457032), Jul 12, 2002 Some application servers share session state between servers in a cluster. E.g. I believe that Weblogic Server can replicate session state to a secondary server in the cluster, enabling the client to continue working with that server if the primary server for that client crashes. I seem to remember that this works both with Stateful Sesion Beans and with HTTP session state. Are we allowed to change the transaction isolation property in middle of a transaction? Location: http://www.jguru.com/faq/view.jsp?EID=565056 Created: Nov 28, 2001 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by Ranjith Ayinala (http://www.jguru.com/guru/viewbio.jsp?EID=562285 No. You cannot change the transaction isolation level in the middle of transaction.
Comments and alternative answers
Isolation-Level with CMP (In the middle of a transaction) Author: Klaus Dirlewanger (http://www.jguru.com/guru/viewbio.jsp?EID=842393), May 17, 2002 Hey all, but how with CMP. The isolation levels are defined for single methods. You say it is only possible to set the isolation level at the beginning of a transaction. So my conclusion would be: The isolation level only can be set for session bean methods beginning a new transaction (REQUIRES resp. REQUIRES_NEW), by no means for entity beans. Is this conclusion correct. Many thanks Klaus Re: Isolation-Level with CMP (In the middle of a transaction) Author: Prasun Sarangi (http://www.jguru.com/guru/viewbio.jsp?EID=893319), May 27, 2002 we can not change the ISOLATION LEVEL in the middle of a transaction. The best way to know this is to look into the javadoc of java.sql.Connection.setTransactionIsolation(int level) this is the method we use while playing aroung Isolation Level in BMP. Incase of CMP we can not explictly mention the IL. That is the Container who will be deciding on that looking to the underlying RDBMS. Re[2]: Isolation-Level with CMP (In the middle of a transaction) Author: Klaus Dirlewanger (http://www.jguru.com/guru/viewbio.jsp?EID=893388), May 27, 2002 Thank you. First: How the isolation level is set I already knew. Second: That it isn´t possible to be changed in the middle of a transaction was a previous answer. And anyway: I think the isolation level can be set. Therefore I would like to ask my question again. A lot of thanks Klaus What is the need of Remote and Home interface. Why cant it be in one? Location: http://www.jguru.com/faq/view.jsp?EID=567986 Created: Nov 30, 2001 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by hari kp (http://www.jguru.com/guru/viewbio.jsp?EID=557981 Hi, In a few words, I would say that the main reason is because there is a clear division of roles and responsabilities between the two interfaces.
The home interface is your way to communicate with the container, that is who is responsable of creating, locating even removing one or more beans. The remote interface is your link to the bean, that will allow you to remotely access to all its methods and members. As you can see there are two distinct elements (the container and the beans) and you need two different interfaces for accessing to both of them. I would suggest you to take a look at this FAQ: What's the difference between EJBHome, EJB Home, EJB Object, EJBObject and EJB (not to mention Home Interface and Remote Interface)? and, maybe, spend some time in reading the EJB Specifications that are extremely clear and interesting. Comments and alternative answers
It is all to do with interfaces. Author: Nick Minutello (http://www.jguru.com/guru/viewbio.jsp?EID=222214), Dec 1, 2001 When you work with objects by interface, you need to have a factory to create the objects. If the objects are local, then you can use a factory method or a factory object. However, if the objects are remote, you can only use a factory object. CORBA had such a concept as a factory object. In EJB, the factory object is the Home Object. There is always one and only one of these home objects, thats why you can have an interface to this object (without the need for another factory object). It would be impossible for the server side object to be both object AND factory - so that is why there are two interfaces. CMP 2.0 entity bean. Can I write a method in CMP 2.0 Entity Bean which can retrieve some data from database (ie. is it possible to have a CMP entity bean mapped to a particular table and have a business method in it which retrieve some data from a different table)? Location: http://www.jguru.com/faq/view.jsp?EID=571808 Created: Dec 4, 2001 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by Gaurav Sharma PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=66767 You can have CMP Entity Bean map to whichever table you want and you can have business methods in the bean retrieve values from whichever table you want but not ejbStore() ejbLoad()... (i.e not the container callbacks). CMP does stand for Container managed persistence and therefore you have to let the container do the persistence for you.
But there is nothing to prevent you from declaring a business method in your entity bean that uses JDBC to connect to the database and retrieve data from some other table. The trouble is that if you business method in populating attributes of the bean itself from a table to which it is not mapped. What can happen in this scenario is app server can figure out that the value of an attribute in your bean has changed and call callback that will retrieve values into the bean attributes from the original table to which CMP attributes are mapped. I believe that the best solution for you is BMP. Can I develop an Entity Bean without implementing the create() method in the home interface? Location: http://www.jguru.com/faq/view.jsp?EID=575693 Created: Dec 6, 2001 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by JIA Java Italian Association PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=414973 I think you can. As far as I know, there is nothing, in the EJB specifications, that prevents you to create an Entity Bean without the create() method. In this situation, the only way to obtain an instance of the bean is using a finder method. Without the create() method, the only way to create new beans is manually accessing to the database and using, for example, SQL insert statements. Comments and alternative answers
No create() method in Entity Bean... Author: Sandeep Thool (http://www.jguru.com/guru/viewbio.jsp?EID=128141), Jan 15, 2002 As per the specifications, there can be 'ZERO' or 'MORE' create() methods defined in an Entity Bean. In cases where create() method is not provided, the only way to access the bean is by knowing its primary key, and by acquiring a handle to it by using its corresponding finder method. Entity bean without create() method Author: Mahesh Mulchandani (http://www.jguru.com/guru/viewbio.jsp?EID=756686), Feb 12, 2002 In home interface u only provide the method signature and not implement as mentioned in the question. in applications where in u want users to only read the data u go for zero create methods in the entity bean. No implementation of Create method Author: Sandeep Thool (http://www.jguru.com/guru/viewbio.jsp?EID=128141), Feb 17, 2002
In Create methods, one usually INSERTS a row in a table. Now, ofcourse you MAY NOT ALWAYS WANT to INSERT a row. In other words, there is no necessary reason to implement the CREATE method. In those cases, you can create an instance of a bean based on the data present in the table. All one needs to know is the primary key of that table. i.e. a set a columns that uniquely identify a single row in that table. Once this is known, one can use the 'getPrimaryKey()' to get a remote reference to that bean, which can further be used to invoke business methods.
EJB-JNI-Legacy Integration(C++ API) We have exisitng System in C++.We want to use Existing in the intranet/internet. We are using JNI to use existing System. And then we are calling JNI Classes in EJB.Could any one provide archtecure and sample with steps How to call existing C++ API in JNI and that JNI API in EJB session beans.If any one can provide help ,i will be greatful to them. Location: http://www.jguru.com/faq/view.jsp?EID=577956 Created: Dec 9, 2001 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by bhadra reddy (http://www.jguru.com/guru/viewbio.jsp?EID=425815 EJBs are suppose to be portable between different app server who comply with the Sun's specifications for compliant EJB containers. Because of this reason, loading of native libraries is not allowed in EJB. if some app servers allow this as an enhacement, you need to look at the documentation of that particular app server to find your answers. but overall, loading native libraries and using JNI from EJB is prohibited by the spec. you could use JMS or MDBs to accomplish the same with similar amount of work. Comments and alternative answers
J2EE Connector Author: Nick Minutello (http://www.jguru.com/guru/viewbio.jsp?EID=222214), Dec 9, 2001 What sort of functionality is in this C++ library? How fine-grained is the interface to it? What does it do? A valid means of using native code is to use the J2EE Connector Architecture. However, I would strongly recommend that for C++ code, you dont use JNI. The main reason is that a bug in your C++ code can bring your whole JVM down. It really compromises the robustness that the appserver environment gives you.
If you really have to - then try use a separate Appserver for the JNI components - and cluster them separately.
WebSphere and JNI Author: leo de blaauw (http://www.jguru.com/guru/viewbio.jsp?EID=842771), Apr 17, 2002 Hi, I dont about your appserver. But we are facing a simular issue at our project here. We are using websphere 4.0 which doesnt support MDB's in its current release. We do however have to support and old legacy c++ dll with business rules in it which we cannot go around at this time. Does anyone know if calling a native interface from EJB's in websphere is allowed and if so if there is any level of protection for crashes if you decide to do so ? Greetings, Leo de Blaauw Re: WebSphere and JNI Author: Anil Datt (http://www.jguru.com/guru/viewbio.jsp?EID=20887), May 2, 2002 We are using weblogic and since we were also in the same situtaion we went ahead and used the jni code in teh session bean. Weblogic allows to make the JNI calls from teh EJB , but any error in the C code brings down the whole app server. Why dont you write a simple EJB and try to load any dll or shared library just to see whether websphere allows it. I feel it alllows it. Click on this Link EJB-JNI Author: Wap Dev (http://www.jguru.com/guru/viewbio.jsp?EID=914149), Jun 13, 2002 I am devloping an application server which is in windows platform,i want to Invoke Java Beans using JNI,whether it is possible or only normal .class files will be intiated EJB-JNI-Legacy Integration(C++ API) ... Author: Raffaele PAPA (http://www.jguru.com/guru/viewbio.jsp?EID=1007318), Oct 9, 2002 Hi there ! You can create an ejb that creates a wrapper class that instantiates the JNI class which does the rest , e.g. calling the legacy subroutine in JBoss and in WebSphere it works .... obviuosly remember that every static data got from the C++ procedure should be refreshed with ejbActivate ( ) [here it is a bit of sample code ( i'm finishing to publish it ) on http://www.e-mplace.com/EJB-JNI.htm ] if you have some question please email me at [email protected] Raffaele PAPA bye bye Create a server/appserver running in a separate JVM Author: geoff maude (http://www.jguru.com/guru/viewbio.jsp?EID=55701), Oct 24, 2002 The safest way to handle JNI integration would be to put it in a separate JVM instance, though it need not be running an appserver (depends on your
scalability/transaction safety requirement.) If its not an EJB Server, at least have an RMI interface. In any case, you'd need a daemon to ping it heartbeat requests and restart it if/when it crashes, and some expectant try blocks in your EJB in case it goes down. Re: Create a server/appserver running in a separate JVM Author: Amit T (http://www.jguru.com/guru/viewbio.jsp?EID=1048812), Jan 21, 2003 Can anyone be a little more specific about this server/appserver running in a separate JVM. Any other site / article giving more info on this topic ??? Any help would be most helpful Re: Create a server/appserver running in a separate JVM Author: Pedja Radojkovic (http://www.jguru.com/guru/viewbio.jsp?EID=1083282), May 9, 2003 One possible solution can be to wrap your native C/C++ code in apache module and let apache take care about executing it. Bad thing is that you have to communicate with it via http. This solution can be good when your C/C++ library is not thread safe, and you cannot execute it in one JVM. More about writing apache modules you can find at www.apache.org. JMS and message beans are the way to go Author: Alexander Krapf (http://www.jguru.com/guru/viewbio.jsp?EID=221775), Jul 26, 2003 We have been asked this question many times over the years because we have a tool that helps in the integration of Java and C++ code (JunC++ion). In my opinion, in-process integration is not a good option and we always recommend using MessageBeans in the EJB server and JMS C++ bindings in the external C++ process. Some JMS providers have proprietary C++ bindings, for all the others (or if you don't want to lock yourself into a specific JMS vendor) you can use JMS Courier. BTW: This is also possible for .NET applications using Codemesh's JuggerNET tool.
Re: JMS and message beans are the way to go Author: suhas shahapurkar (http://www.jguru.com/guru/viewbio.jsp?EID=1198687), Sep 13, 2004 Hi all, I want to access the JMS messages from the C++ code. The JMS messages are in the Weblogic Server. Thanks in Advance!! Suhas S Re[2]: JMS and message beans are the way to go Author: Alexander Krapf (http://www.jguru.com/guru/viewbio.jsp?EID=221775), Sep 13, 2004 Suhas,
AS I said, you probably don't want the C++ code to be running in the server process. That means that you have to "JMS-enable" your C++ process. We do this via our JMS Courier product by providing you with C++ wrapper classes for the JMS API. The wrapper classes use JNI under the hood. You use the wrapper classes in your C++ application just like you would use the Java classes in a Java application. If you don't want to purchase our product, you have several other choices: 1. write JNI code yourself (and have months of fun :-) 2. use a commercial JMS with some proprietary C++ extensions (and have vendor lockin) 3. use a commercial JMS with some proprietary XML extensions (and have vendor lockin) The first alternative might actually not be too bad if all you need to do can be wrapped up in one or two method calls. We usually recommend against doing it by hand if you need advanced features like asynchronous callbacks (for MessageListeners) or if you have more than 10 integration points. Good luck, Alex What is the difference between Context, InitialContext and Session Context? How they are used? Location: http://www.jguru.com/faq/view.jsp?EID=584577 Created: Dec 14, 2001 Author: RATHAKRISHNAN K (http://www.jguru.com/guru/viewbio.jsp?EID=230041) Question originally posed by Dipendra Jha (http://www.jguru.com/guru/viewbio.jsp?EID=492227 javax.naming.Context is an interface that provides methods for binding a name to an object. It's much like the RMI Naming.bind() method. javax.naming.InitialContext is a Context and provides implementation for methods available in the Context interface. Where as SessionContext is an EJBContext object that is provided by the EJB container to a SessionBean in order for the SessionBean to access the information and/or services or the container. There is EntityContext too which is also and EJBContext object that'll be provided to an EntityBean for the purpose of the EntityBean accessing the container details.
In general, the EJBContext (SessionContext and EntityContext), AppletContext and ServletContext help the corresponding Java objects in knowing about its 'context' [environment in which they run], and to access particular information and/or service. Whereas, the javax.naming.Context is for the purpose of 'NAMING' [by the way of referring to] an object. Comments and alternative answers
InitialContext Author: rao ande (http://www.jguru.com/guru/viewbio.jsp?EID=760782), Feb 15, 2002 What can be inferred from implementing the methods in Context. i.e, Is it that if we set the InitialContext and give a name, we are binding it by that name? What are all the steps that are required to port EJB 1.1 code to EJB 2.0 compatible? Location: http://www.jguru.com/faq/view.jsp?EID=585941 Created: Dec 15, 2001 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by Dilli Babu Nandarapu (http://www.jguru.com/guru/viewbio.jsp?EID=260919 Question continues: What are all the changes I have to do for my EJB1.1 code to port into EJB2.0 compatible. The present application is in EJB1.1. I need to port this code to EJB2.0 spec. Ejb 1.1 code will run in the container compatible with Ejb 2.0 without any change. But, EJB 2.0 is a more robust and powerful specification with many new features so you may considering altering your code to take advantage of these new features. But as I said, you do not need to change anything to make EJB 1.1 code execute in an EJB 2.0 environment. [If you are interested in an article about the migration from EJB 1.1 to EJB 2.0, I strongly suggest you to take a look at this article: Migrating from Enterprise JavaBeansTM(EJBTM) 1.1 to 2.0 - AAG] Comments and alternative answers
Does this mean that EJB1.1 & EJB2.0 beans can interoperate without problems? Author: Pratap Das (http://www.jguru.com/guru/viewbio.jsp?EID=129542), Jan 28, 2002 If no changes are required for EJB1.1 beans to run on an EJB2.0 compatible container, can I drop existing EJB1.1 beans into the appserver for use by newer EJB2.0 beans?
That is, can both 1.1 & 2.0 beans exist & interoperate on an appserver concurrently? --Das Re: Does this mean that EJB1.1 & EJB2.0 beans can interoperate without problems? Author: Sushil Srivastava (http://www.jguru.com/guru/viewbio.jsp?EID=744298), Feb 4, 2002 You should be able to use both the EJB1.1 and EJB2.0 bean in the App Serve without a hitch as EJB2.0 suports EJB1.1 and as such they can co exist. So you should not need to change anything. But do bear in mind that the CMP specifications have changed quite a lot and as such are not compatible althoug the application server is required to support both. About J2EE Application Server Scalibility Issue Location: http://www.jguru.com/faq/view.jsp?EID=585943 Created: Dec 15, 2001 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by innum onenu (http://www.jguru.com/guru/viewbio.jsp?EID=385539
1. Does scalibility means supporting mulitiple concurrent users alone?
2.
3.
Scalability means that the performance of the application does not deteriorate greatly as more users are connected to the system. A scalable system will perform to its expectations as more users are simultaneously using the system up to some threshold. It is said any application developed using the J2EE framework would be highly scalable. Now does the specification say the limit of concurrent users, the J2EE complaint app. server should support? No. The specification is not specific on the number of concurrent users J2EE compliant app server should support. The more it will support, the more it will sell so it is in the interest of the company developing the app server to have this as high of a number as possible. But maximum number of concurrent users is not only as function of the capacity of the app server. It depends on many other things in the application. For one, database. You can have an app server that support 1 million concurrent users but if the database can handle only 100,000 connections to it, your threshold become your lowest common denominator, that is database in this case. If an application needs to support 2000 concurrent users, is it necessary to use EJB's to take advantage of the J2EE application server's capability or just using JSP's and Servlets alone could be scalable? That also depends on the application. Using JSPs/Servlets alone could do the trick since they are multithreaded and can handle many simultaneous users but of course there is a limit. What that limit is needs to be tested for a given deployment. Any web-enabled application needs to be capacity tested to ensure that it will properly function under high load. 2000 users is not that much so I think JSP/Servlet solution could handle that many users at once. But keep in mind that you are developing an application that is likely composed of JSP/Servlet, JavaBeans, and perhaps EJBs. Just by adding EJBs
to the picture does not necessarily mean that your application is more scalable. If you think about it, lets take your example of 2000 users hitting an application at once under normal load. Lets also say that you get an increase to about 2,500 and clients start to complain that the application all of a sudden is slow and does not perform to their expectations. simply adding EJBs to this application will not solve your problem. This is because the threads of execution still go through the browser so your web tier still has 2,500 user load. So you may need to load balance the web-tier across several web servers or do something else. Thinking that you will increase the scalability by adding EJBs to the picture is flawed. overall, J2EE applications are highly scalable because they always offer an alternative that will make the application more scalable. e.g. your web-tier is a bottleneck, load balance across several web server. You application server is a bottleneck, you can cluster. if you keep in mind what makes an application scalable and distribute the work to the appropriate tier in the n-tier J2EE application you will have a scalable system. But you have to know the technology to make this happen. Why an onMessage call in Message-driven bean is always a seperate transaction? Location: http://www.jguru.com/faq/view.jsp?EID=586152 Created: Dec 16, 2001 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by jim geng (http://www.jguru.com/guru/viewbio.jsp?EID=423693 From the EJB 2.0 specification: "An onMessage call is always a separate transaction, because there is never a transaction in progress when the method is called." When a message arrives, it is passed to the Message Driven Bean through the onMessage() method, that is where the business logic goes. Since there is no guarantee when the method is called and when the message will be processed, is the container that is responsible of managing the environment, including transactions. Life Cycle of Stateful and Stateless Session Beans. Location: http://www.jguru.com/faq/view.jsp?EID=586390 Created: Dec 16, 2001 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Arvind S (http://www.jguru.com/guru/viewbio.jsp?EID=585871 Stateful Session Bean A stateless session bean has only two states: Does Not Exists and Method Ready Pool. A bean has not yet instantiated (so it is not an instance in memory) when it is in the Does Not Exists state. When the EJB container needs one or more beans, it creates and set them in the Method Ready Pool state. This happens through the creation of a new instance (Class.newInstance()), then it is set its context (setSessionContext()) and finally calls the ejbCreate() method. The ejbRemove() method is called to move a bean from the Method Ready Pool back to Does Not Exists state.
Stateful Session Bean Unlike Stateless, a Stateful Session Bean has three states. Does not exists, Method Ready and Passivated states. Like Stateless beans, when the Stateful Session Bean hasn't been instantiated yet (so it is not an instance in memory) is it in the Does not exists state. Once a container creates one or more instances of a Stateful Session Bean it sets them in a Method Ready state. In this state it can serve requests from its clients. Like Stateless Session Beans, a new instance is created (Class.newInstance()), the context is passed (setSessionContext()) and finally the bean is created with ejbCreate(). During the life of a Stateful Session Bean, there are periods of inactivity. In these periods, the container can set the bean to the Passivate state. This happens through the ejbPassivate() method. From the Passivate state the bean can be moved back to the Method Ready state, via ejbActivate() method, or can go directly to the Does Not Exists state with ejbRemove(). Comments and alternative answers
Life Cycle of Session Beans Author: Manindra Jha (http://www.jguru.com/guru/viewbio.jsp?EID=956196), Jul 19, 2002 From the above mentioned detail about the Life Cycle of Stateless and Stateful Session Beans its not clear that when exactly which methods are called e.g. when exactly the ejbCreate() method gets called in both the cases..is it when the client initiates the call by calling home.create()..or when the container makes the instantiaon and brings the instance to the exist state..?? Re: Life Cycle of Session Beans Author: sravan reddy (http://www.jguru.com/guru/viewbio.jsp?EID=962689), Jul 24, 2002 well,answer for the above question is-- if it is a stateless session bean the container will call ejbCreate() to create stateless beans.in case of stateful,each instance of stateful bean will be created when the client initiates home.create. i hope my answer is correct.if i'm wring pls let me know the correct one. Re[2]: Life Cycle of Session Beans Author: jignesh patel (http://www.jguru.com/guru/viewbio.jsp?EID=972821), Sep 3, 2002 I think u are correct. Re[3]: Life Cycle of Session Beans Author: jay vaghela (http://www.jguru.com/guru/viewbio.jsp?EID=1251352), Jul 1, 2005 it still not shows : 1 : When an instance is created at first time for Stateful 2 : what happen in case of another user comes to get that bean.???? will it create new one or old one will be send
Why are ejbActivate() and ejbPassivate() included for stateless session bean even though they are never required as it is a nonconversational bean? Location: http://www.jguru.com/faq/view.jsp?EID=707774 Created: Jan 2, 2002 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by devseal devseal (http://www.jguru.com/guru/viewbio.jsp?EID=71093 To have a consistent interface, so that there is no different interface that you need to implement for Stateful Session Bean and Stateless Session Bean. Both Stateless and Stateful Session Bean implement javax.ejb.SessionBean and this would not be possible if stateless session bean is to remove ejbActivate and ejbPassivate from the interface. You could argue that the two (stateful and stateless) are so different that they should have their own interface but Sun did not think so. They made both session beans implement the same interface and provided deployment descriptor to denote which one is it that you are deploying. Comments and alternative answers
stateful and stateless beans using the same interface Author: David Van Couvering (http://www.jguru.com/guru/viewbio.jsp?EID=61087), Jan 4, 2002 I think this may have been a good concept, but in reality when you code a session bean, you *must* know whether it is stateful or stateless. At least, you must know if you ever expect it to be stateless. You can't just blindly "switch" bean from being stateful to stateless, although this is what the current interface implies. A stateful bean normally makes use of member variables across method calls. If you were to make this stateless, the behavior of your bean would become undefined because member variable state is not guaranteed to be consistent across method calls for stateless beans. The other problem is that if you forget to mark a bean as stateless in your deployment descriptor (which I personally have done), the errors you get can be very misleading. You may not even catch your error during development, especially if you are testing in a single-user mode. One could argue that a new interface should be introduced for stateless beans so that you know, when coding, what type of bean you are building, and deployers can't change this at deploy time. Re: stateful and stateless beans using the same interface Author: Kenneth Scher (http://www.jguru.com/guru/viewbio.jsp?EID=864353), May 2, 2002 I have a further question: In between uses of a particular instance of a stateless session bean, what guarantees, if any, are made concerning the state of objects "owned" by that instance. For example, if a stateless bean wants to count how many times it's been called, using a private integer, is the state of that integer defined in the ejb spec? Static variables in EJB should not be relied upon as they may break in clusters. Why? Location: http://www.jguru.com/faq/view.jsp?EID=710888
Created: Jan 6, 2002 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by Gaurav Sharma PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=66767 Referring article: http://servlet.java.sun.com/javaone/javaone2000/pdfs/TS1295.pdf Static variables are only ok if they are final. If they are not final, they will break the cluster. What that means is that if you cluster your application server (spread it across several machines) each part of the cluster will run in its own JVM. If you declare a static variable that is not final, it can be changed. Suppose that you are tracking something with a static integer that you are increasing at some point and lets say that you start with a value of 100. Say a method on the EJB is invoked on cluster 1 (we will have two clusters - 1 and 2) that causes value of the static variable to be increased to 101. On the subsequent call to the same EJB from the same client, a cluster 2 may be invoked to handle the request. A value of the static variable in cluster 2 is still 100 because it was not increased yet and therefore your application ceases to be consistent. Therefore, static non-final variables are strongly discouraged in EJBs. Comments and alternative answers
Static must not only be final, but constant. Author: Ralph Harnden (http://www.jguru.com/guru/viewbio.jsp?EID=800215), Mar 17, 2002 For example, if you static final variable is initialized by a method call, the method may return different values for different nodes in the cluster. This would yield unpredictable results, unless that is what was intended. What about stateful EJBs Author: anupama jagadeesh (http://www.jguru.com/guru/viewbio.jsp?EID=805279), Mar 27, 2002 Does this mean that, using Stateful EJBs in a clustered environment will not work? becoz, the same client can be routed to a different cluster the next time he makes a call..??? A static variable is only a problem if it is required to have the same value everywhere in the application Author: Mats Löfkvist (http://www.jguru.com/guru/viewbio.jsp?EID=889847), May 23, 2002 If the semantics required is that the variable should always show the same value within all of the application, a static can not be used if the server is clustered (unless it is final and initialized with a constant). But if the variable is only required to show the same value within each JVM, it will
work just as well in a cluster as in a single-JVM server. For example a cache is usually not required to have the same content in the different JVMs of a clustered container. Note that some care is needed even in a non-clustered server though, e.g. if a synchronized method on the static would call an EJB you would mess upp the locking in the container, risking a deadlock. EJB 2.0 CMP example. Where can I find an example that can help me in developing an Enterprise JavaBeans 2.0 Container-Managed Persistence? Location: http://www.jguru.com/faq/view.jsp?EID=715956 Created: Jan 10, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Check out the Java Developer Connection of Sun's Java web site. There is a very interesting article, written by Beth Stearns: Enterprise JavaBeans 2.0 Container-Managed Persistence Example. Application Exception and EJB Transaction. If I throw a custom ApplicationException from a business method in Entity bean which is participating in a transaction, would the transaction be rolled back by container? Does container rolls back transaction only in case of SystemExceptions? Location: http://www.jguru.com/faq/view.jsp?EID=723614 Created: Jan 17, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Gaurav Sharma PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=66767 The short answers are: No and Yes. A SystemException is a subtype of java.lang.RuntimeException, while an ApplicationException is any Exception that does not extends neither java.lang.RuntimeException nor java.rmi.RemoteException. Said so, we have to add that an EJB Transaction is automatically rolled back only when a SystemException (or a subtype of it) is thrown. Comments and alternative answers
Applicaiton exception and EJB transactions Author: Gaurav Sharma (http://www.jguru.com/guru/viewbio.jsp?EID=66767), Jan 17, 2002 I dont know,why continer does automatic roll back of transaction only in case of
system exceptions and not in case of application exceptions. It would have been nice if I could throw application exception from within my transaction to tell client application what went wrong and I could propbably tell container to roll back transaction if a particular type of Application exception is encountered (may be specified in descriptor). Re: Applicaiton exception and EJB transactions Author: Siva Nadiminti (http://www.jguru.com/guru/viewbio.jsp?EID=729600), Jan 22, 2002 You can tell container to do rollback, when an userException occurs, using the method setRollbackOnly() in javax.transaction.UserTransaction Object. Re: Applicaiton exception and EJB transactions Author: surya seshaddri (http://www.jguru.com/guru/viewbio.jsp?EID=742379), Jan 31, 2002 Your ApplicationExceptions can extend from javax.ejb.EJBException, which is a sub class of RuntimeException. When a EJBException is encountered the container rolls back the transaction. EJB Specification does not mention anything about Application exceptions being sub-classes of EJBException. Re[2]: Applicaiton exception and EJB transactions Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727), Jan 31, 2002 Hi, If your "ApplicationException" is a subtype (direct of indirect) of RuntimeException, you have a SystemException and not an ApplicationException... No and Yes Author: Dattaraj Joshi (http://www.jguru.com/guru/viewbio.jsp?EID=585880), Jan 28, 2002 You can tell container to rollback the transaction, by using setRollBackOnly on SessionContext/EJBContext object as per type of bean you are using. Container managed transaction must be completed by the container Author: Ralph Harnden (http://www.jguru.com/guru/viewbio.jsp?EID=800215), Mar 17, 2002 If a business method in an Entity bean throws an application-defined exception (not an extension of RemoteException or RuntimeException), then this is a checked exception. If the container starts a transaction for a method, then the transaction must be disposed of by the container before the method returns to the caller. If that method throws any exception, checked or unchecked, then the transaction must be rolled
back. If, however, the method inherits the transaction started by the container for the caller's method, then the transaction will not be rolled back by the container when the called method throws a checked exception. The caller must either catch the exception, propagate it out, or throw an unchecked (i.e runtime) exception. If the caller catches the exception, the caller should decide whether or not to invoke setRollbackOnly(). If the caller popagates the exception out, then it is a checked exception for the caller, in which case the same condition described for the called method applies to the caller method. And, of course, if the caller throws an unchecked exception, the transaction will get rolled back by the container. Does Stateful Session bean support instance pooling? Location: http://www.jguru.com/faq/view.jsp?EID=727891 Created: Jan 21, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by sudarson roy pratihar (http://www.jguru.com/guru/viewbio.jsp?EID=326685 According to Richard Monson Haefel's book (Enterprise Java Beans, O'Reilly), Stateful Session Bean conceptually doesn't have instance pooling. But some container implement pooling internally. According to Ed Roman, it does support pooling. Can anybody pls tell me what specification says ? Personally, I think that Richard is right, even after taking another quick look at the specs and thinking a little bit about it. Reading the specs, in fact, there is no clear indication that a Stateful Session Bean is or is not pooled, while for the Stateless Session bean there is a specific paragraph (7.9.4 "Adding instance to the pool") that discuss the sequence for adding/removing an instance to/from the pool. To this, I would add some thoughts. The lifecycle of a Stateful Session Bean is strictly connected with "his" client. When the client decides to remove the bean, the bean has no reason to exists, because it cannot be used from another client without being (at least) reinitialized. Pooling it doesn't really make sense. But, at the same time, I would accept that, maybe for gaining performance (or for other reasons), some containers do pool Stateful Session Beans just to avoid the overhead of recreating the object. Comments and alternative answers
Statefull session bean pooling. Author: Chad Tippin (http://www.jguru.com/guru/viewbio.jsp?EID=737437), Jan 28, 2002
I think the point to take away from this is that *conceptually* you do not have to worry about it being pooled or shared among multiple clients. Under the hood, it may be pooled, or swapped out or whatever, hence ejbActivate() and ejbPassivate(). Cheers. Re: Statefull session bean pooling. Author: Sushil Srivastava (http://www.jguru.com/guru/viewbio.jsp?EID=744298), Feb 4, 2002 When it comes to pooling stateful session beans its the activation and passivation of the bean to and from the hard disk that allows more beans than the pool size permits to exist.Although all these beans are not equal. So the container can mantain a pool of such beans. What is PortableRemoteObject.narrow() method and what is used for? I found somewhere that it is "CORBA compliant". Why? Location: http://www.jguru.com/faq/view.jsp?EID=734137 Created: Jan 25, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Sarvotham.Pai. Hosdurg (http://www.jguru.com/guru/viewbio.jsp?EID=733922 Hi, When you execute a lookup to get the home interface of your bean, you normally use the lookup() method of the javax.naming.Context interface. This method will return you an Object that needs to be casted to the home interface you've asked for. Unfortunately, this cannot be done using the normal/explicit casting [MyHome myHome = (MyHome)returnedObject]. As you have already found out, the reason is connected to CORBA. Why? For EJB, the communication between the server and the client is based on RMI (both remote and local interfaces, in fact, do implements the java.rmi.Remote interface). The underlying protocol that it is used for the communication is IIOP (I think 1.2), that is part of CORBA standards. It is normally used to describe this communication system using the Java RMI over IIOP. IIOP has not been designed for Java, but for generic languages, and this means that there are some limitations. Some languages, in fact, do not have the concept of casting. Java RMI-IIOP provides a mechanism to narrow the the Object you have received from from your lookup, to the appropriate type. This is done through the javax.rmi.PortableRemoteObject class and, more specifically, using the narrow() method. Just a note: when you are using the new EJB 2.0 Local Client API, you should be able to do a direct/explicit cast from the looked up Object, to the interface you need. Comments and alternative answers
without Narrow Method Author: Sudhir Sharma (http://www.jguru.com/guru/viewbio.jsp?EID=1048849), Jan 21, 2003 I hope that if we don't use Narrow method to cast the object, it will work. In Ejb 2.0, it is possible to cast the object as we cast it in Java, if we are using Local Home and remote interface. But I hope in ejb 1.0 and 1.1 also, we can use direct casting over lookedup objects. Please clear me this thing if it is essential to use Narrow() method to cast the object. RMI-IIOP Author: Deepak Kalra (http://www.jguru.com/guru/viewbio.jsp?EID=1152019), Mar 10, 2004 Since Remote and Home interface implements java.rmi.Remote interface. ThE calls to these interface will be remote calls and Most of the conatiner use IIOP as communication network protocol and IIOP is CORBA standard. So we have to use narrow method of PortableRemoteObject as Its define as the standard of IIOP.Normal cast operator will not work as Application server use IIOP protocol Re: RMI-IIOP Author: Kacel Kacel (http://www.jguru.com/guru/viewbio.jsp?EID=1161993), Apr 11, 2004 The spec says to always narrow. If your ejb server (container) doesnt serv IIOP on wire , then the usual cast should work BUT your client code wont be vendor independent. Deploying, again, your ejb on an IIOP server, yhis time, will break your clients (without narrow). Think narrow instructions as portable condition for your bean, and think that your client is not always written in Java. Re[2]: RMI-IIOP Author: Suresh Subramanian (http://www.jguru.com/guru/viewbio.jsp?EID=1226627), Feb 11, 2005 I have seen a single application using both normal java casting and narrowed objects. In this application all servlets use normal casting to lookup ejbs and ejbs use narrow to lookup other ejbs like client java command line applications. Is there a specific reason to have this difference in approach? I want to know the difference. Please explain Thanks Suresh The EJB specification says that we cannot use Bean Managed Transaction in Entity Beans. Why? Location: http://www.jguru.com/faq/view.jsp?EID=734608 Created: Jan 25, 2002 Author: Matt Goodall (http://www.jguru.com/guru/viewbio.jsp?EID=450000) Question originally posed by Prasad B (http://www.jguru.com/guru/viewbio.jsp?EID=422641
The short, practical answer is... because it makes your entity beans useless as a reusable component. Also, transaction management is best left to the application server - that's what they're there for. It's all about atomic operations on your data. If an operation updates more than one entity then you want the whole thing to succeed or the whole thing to fail, nothing in between. If you put commits in the entity beans then it's very difficult to rollback if an error occurs at some point late in the operation. Think of an account transfer which takes money from the first account and then pays it into a second account. If the paying in part fails how do you put the money back in the first account? What about if that then fails too? The transaction should always "wrap" the entire operation. There are two obvious ways of achieving this in an EJB environment: 1. Use the javax.transaction package 2. Use a session bean to represent usecases and specify how transactions should be managed as part of the session bean's deployment descriptor. Solution 2 is the "correct" way to do it. Either way, you can simply leave all transaction code out of your entity beans. Any good EJB book will explain more about this. Comments and alternative answers
Bean Managed Transaction - Entity Beans Author: Sandeep Thool (http://www.jguru.com/guru/viewbio.jsp?EID=128141), Feb 17, 2002 The following reason could be attributed, for not allowing Bean Managed Transactions in Entity Beans. Entity Beans are SHAREABLE components in the sense that, more than 1 user will be using it at the same time. Which means that INSERTS/UPDATES/DELETES to this shared data will have to be carefully SYNCHRONIZED between simultaneous users. Which, needless to say, is quite complicated & may result in crashing the bean itself. Hence this job of SYNCHRONIZATION of INSERTS/UPDATES/DELETES to shared data between simultaneous users is best left to the container, which manages them internally at the THREAD level. Storing the Remote Reference to a Stateless Session Bean. In an application with several Stateless Session EJB, we are debating the best approach with reference to performance on how to do the calls to our Stateless Session Beans. Location: http://www.jguru.com/faq/view.jsp?EID=734699 Created: Jan 25, 2002 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by jennifer morgan (http://www.jguru.com/guru/viewbio.jsp?EID=436272
1. Does it make sense to cache the reference we would get from using the EJBObject.getHandle(), then use this reference when attempting to access the bean from here on? - Absolutely.
2. Does the reference map to a specific instance of the stateless session bean or to a pool of beans? - Since stateless session beans are all "created equal" most app servers using pooling to increase the performance. so the answer is that it maps to the pool of stateless session beans of the type for which you have the handle.
3. Since session beans do not support concurrency is there a danger in having
two threads utilize this same reference when accessing the stateless session bean? (does this depend on the container implementation?) - It does not depend on the application server implementation since there is no concurrency issues with stateless session beans. Concurrency problems occur when two or more threads operate on the same shared data in an unprotected way potentially resulting in loss of data integrity. Since your stateless session beans are stateless, there is no concurrency problems since there is no shared data to be corrupted. So no concurrency problems with stateless session beans.
4. Is the overhead associated with the remote lookup on a stateless session bean enough to warrent keeping a handle on the reference? - ABSOLUTELY.
Comments and alternative answers
Point #3 -- Answer is correct, but for the wrong reasons Author: Michael Brooks (http://www.jguru.com/guru/viewbio.jsp?EID=738484), Jan 29, 2002 > Since your stateless session beans are stateless... Not quite. From Ed Roman's book: "Stateless really means no conversational state. Stateless session beans can contain state that is not specific to any one client..." > there is no concurrency problems since there is no shared data to be corrupted. No, concurrency issues are very real, but they are handled by the container. Also from Roman: "EJB Containers automatically handle concurrent requests from clients . . . If multiple clients simultaneously invoke methods on a bean, the invocations are serialized, or performed lock step. The container will only allow one client to call a bean at once. The other clients are routed to other bean instances of the same class, or are forced to wait." > So no concurrency problems with stateless session beans. No concurrency "problems" with any EJBs.
Re: Point #3 -- Answer is correct, but for the wrong reasons Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727), Jan 29, 2002 Michael, You are right. "Stateless really means no conversational state. Stateless session beans can contain state that is not specific to any one client..." is a very interesting point. For completing your answer, can you provide examples of what type of state would you put into a Stateless Session Bean. Thanks. Re[2]: Point #3 -- Answer is correct, but for the wrong reasons Author: Michael Brooks (http://www.jguru.com/guru/viewbio.jsp?EID=738484), Jan 30, 2002 A database connection factory, or an entity bean's home object, just to name a couple examples. We're looking at any resource needed by the bean on many (unrelated) method invocations. Particularly resources that would be costly to create every time these methods are called. Also -- while we're on the topic -- you might want to cache another SLSB's EJB object, since we all agree it's worthwhile to keep these references hanging around, rather than repeatedly looking them up. Since the container guarantees that there will be no concurrent method invocations on any bean instance, we don't nead to worry about synchronizing threads' access to these resources. The important thing is that this "state" does not track client progress through a drawn out process, as it does in an SFSB. More formally, this state MUST not impact on the idempotence of the bean's business logic. But no, the verbal irony is not lost on me. :-) Re[3]: Point #3 -- Answer is correct, but for the wrong reasons Author: David Rosner (http://www.jguru.com/guru/viewbio.jsp?EID=439252), Feb 11, 2002 Regarding the point about saving references to EJB objects - should I be storing a handle to the EJB object by calling - getHandle(), or should we be storing the reference to the home object from the JNDI lookup and then calling create() each time we need to access a stateless session bean? Regarding your points about storing resources - what if I need resources on the client side and EJB side? Is it bad practice to create a regular java class
that hold a reference to components and deploy it within the EJB and Client layers? This class would need to be thread-safe so I don't know if thats a no-no within the EJB container? thoughts? Re[4]: Point #3 -- Answer is correct, but for the wrong reasons Author: Kent Smotherman (http://www.jguru.com/guru/viewbio.jsp?EID=1000253), Sep 17, 2002 This answer to the question of how best to cache and reference EJBs is very complex. Read different books and see different answers! The problem is like complex javascript - you can often get different results on different J2EE vendors and app servers. A given approach/pattern may work great in an unclustered environment and then fail under heavy load in a clustered environment. Basically, the ONLY way to ensure you are TRULY portable is to never ASSUME anything, which really means you have to look up the home interface EVERY time, regardless of performance considerations from doing this. Any other approach is making subtle assumptions on the J2EE implementation. For example, in a clustered environment can you safely maintain a reference to a home object? This would assume that the home stub is cluster aware, something that is NOT in the spec. It's a difficult situation, which is why when you search the web looking for answers you don't get a single simple answer. One developer can claim great performance using a given approach without realizing the subtle assumptions being made, which is unfortunately very easy to do. The best compromise (IMHO) that I've seen is to only cache a Handle to an EJB, since (from the EJB API spec): "public Handle getHandle() throws java.rmi.RemoteException Obtain a handle for the EJB object. The handle can be used at later time to reobtain a reference to the EJB object, possibly in a different Java Virtual Machine. Returns: A handle for the EJB object.Throws: java.rmi.RemoteException - Thrown when the method failed due to a system-level failure." Kent Smotherman Priority Technologies, Inc. Re[5]: Point #3 -- Answer is correct, but for the wrong reasons Author: Stephan Sann (http://www.jguru.com/guru/viewbio.jsp?EID=1254318), Jul 21, 2005 Time flies and so this posting is almost three years old now. Are there any news on this topic? What about a third approach: Let's assume all clients would exist in the same JVM; wouldn't it be the easiest thing to store a reference to the stub obtained by create()? If you store the reference to the home object from the JNDI lookup, you would have to call "create()" every time you need the EJB-instance(-stub). If you store the Handle obtained by "getHandle()", you would have to call "getEJBObject()" every time you need the EJB-instance(-stub). Storing the stub itself seems to be a shortcut. Well, with this approach
you bind yourself to one JVM, but isn't this true for the home-objectreference, too? Or have I overlook something and the stub-reference is a DONT? Re[2]: Point #3 -- Answer is correct, but for the wrong reasons Author: Mathias Rust (http://www.jguru.com/guru/viewbio.jsp?EID=399741), Mar 21, 2002 We use it for storing constants (= configuration data) read from a database. Why does the Sun j2EE Reference Implementation invoke ejbLoad() and ejbStore() twice in a row? Whenever I find an EJB (either BMP or CMP), the container calls ejbLoad(), then ejbStore(), then ejbLoad() again, then ejbStore() again. Is this the standard Entity Bean lifecycle, or something specific to the RI? Location: http://www.jguru.com/faq/view.jsp?EID=737225 Created: Jan 28, 2002 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by Wesley Janik (http://www.jguru.com/guru/viewbio.jsp?EID=301189 Container has a contract with the developers to provide certain things such as security, transactions, ... The way in which application server does this is up to the implementation. What you are seeing with multiple callbacks is not suprising. Most appllication servers allow you to specify to a certain extent when the callbacks occur. Orion Application Server offers isModified() method which is called before any callback. If isModified() (which you implement) returns false, the callbacks will not be invoked. Without these kinds of optimization techniques, you will see many callbacks most of which will not make sense to you. Comments and alternative answers
Optimizations of ejbLoad()/ejbStore() calls Author: MIlos Dunjic (http://www.jguru.com/guru/viewbio.jsp?EID=828049), Apr 6, 2002 In EJB 2.0 compliant implementation class all EJB attributes/properties shall be declared through pair of abstract getXXX and setXXX methods and not directly. EJB 2.0 compliant container then shall implement those methods by extending abstract implementation class provided by developers and implementing get/setXXX method pairs for each property. setXXX() methods have chance to set isModified flag behind the scenes if any of the EJB attributes changed by calling its' setXXX method. That shall be mandatory by the EJB 2.0 spec, but it is not. ejbStore(), ejbLoad()
Author: GFSDG GSDSGG (http://www.jguru.com/guru/viewbio.jsp?EID=926600), Jun 25, 2002 ejbStore(), ejbLoad() are the callback methods of EJBs.The calling of these methods is Container Vendor Dependent.To maintain the cache consistency, these methods are called twice. i.e., these methods are called before any other method of a bean instace called, and these methods are called after any other method of a bean instace called.This happens just because of cache consistency. Because there are many number of bean instances concurrently running, to reflect the changes made my the one bean instace to that of another, this happens. EJB CORBA security issue. javax.naming.CommunicationException: org.omg.CORBA.NO_PERMISSION. Location: http://www.jguru.com/faq/view.jsp?EID=747052 Created: Feb 5, 2002 Author: Antonino Salvatore CUTRI' (http://www.jguru.com/guru/viewbio.jsp?EID=726828) Question originally posed by Pradeep Sudarshan (http://www.jguru.com/guru/viewbio.jsp?EID=723339 Additional info: When I run my client, I get javax.naming.CommunicationException: org.omg.CORBA.NO_PERMISSION for the "lookup" statement in the client. The deployment was successful. This exception appear when an invocation failed because the caller has insufficient privileges. Try using J2EE runclient tool from sun, when a popup appear insert guest (or j2ee) in username and password fields. This is an example: set APPCPATH=C:\MyProjects\MyTestsClient.jar runclient -client MyTests.ear -name MyClient Java and O\R Mapping Location: http://www.jguru.com/faq/view.jsp?EID=752335 Created: Feb 8, 2002 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by innum onenu (http://www.jguru.com/guru/viewbio.jsp?EID=385539
1. Developing a application using EJB-CMP, automatically does the persistence of data in a RDBMS without the developer writing any JDBC code. In this case, what type of projects should utiltize O\R Mapping tools like TopLink, Cocobase etc? - TopLink and CocoBase could be used if you want a nice GUI tool to do your mapping. In some instance you may find that the schema your are working with is too complicated to describe as CMP and therefore you may opt for using these tools. Overall, if you do not have a tool to provide OR mapping for you and you want one (you do not want to hand-code) then you decide on
using TopLink, CocoBase, etc.
2. These tools specify they could support EJB-BMP too, what does this mean? In BMP, the developer writes all the JDBC code in the callback methods or executes Stored procedures. Where does these tools fit in here? - It means that they should be extensible. You may encounter a database schema that is far to complex to be completely automated. You may have many tables with special and awkward relationship that you can solve neither with CMP nor with any commercial tools. Therefore, any tool should allow you to extend what they generate to provide a more specific persistence using stored procedures for instance or some other persistence rules that cannot be described otherwise.
3. By using these tools, does it mean development of EJB's are not required at all as they would be generated. - Depends on the tool. You may still have to do some legwork to package and deploy.
4. Does EJB-CMP latest version provide mapping a object to more than one table? If so then why go for such tools?? - Again, this depends on your situation. Perhaps your development team likes the GUI interface for development and does not want to hand-code the EJBs. Or perhaps EJB-CMP is inadequate to solve all of the persistence issues you may have. At times, you need to represent the beans that not only come from many many tables in the database but have awkward relationships and things like that. At times, you may need to execute a database-specific function to accomplish certain things that you need during persistence. All these issues cannot possibly be solved in CMP although Sun is trying really hard and getting better with each new specification.
Stateless Session Bean member variable modification. If a client is calling two methods f1() and f2() of a Stateless SB, one after another, is it possible that if f1() modified some member variable of the bean it may reflect in method f2(). Location: http://www.jguru.com/faq/view.jsp?EID=776677 Created: Feb 28, 2002 Author: Jon Thorarinsson (http://www.jguru.com/guru/viewbio.jsp?EID=776345) Question originally posed by abhishek agrawal (http://www.jguru.com/guru/viewbio.jsp?EID=117348 Note that here is no guarantee that the variable still has the value, so don't rely on it. Variables in stateless session beans should only contain state which can be used by any client instance and not state which is specifically stored for a specific client instance. The reason is because at any time between method calls on the bean, the container may throw the bean out of the pool of available beans and destroy it. A stateful bean should be used if this is required. An example of a non-client-specific state in a stateless session bean is caching of resources that the bean needs, like a reference to another bean. State variables like
that, which should really be the only allowed state member variables in stateless session beans, should be initialized in ejbCreate() and released (if necessary) in ejbRemove(). That way, when a buisness method finishes on the bean, the private variable will live on as long as the bean is allowed to live in the container's pool, and therefore it's a good chance that the initialization of the private variable (which is often expensive) will not occurr every time a buisness method is invoked on the bean. Comments and alternative answers
is it possible that if f1() modified some member variable of the bean it may reflect in method f2(). Author: GFSDG GSDSGG (http://www.jguru.com/guru/viewbio.jsp?EID=926600), Jun 25, 2002 yes,definetly the bean variables modification reflect in the f2(). Since they are bean Variable, means their scope is for that bean. if the scope of the variable is to that of f1() then there will not be any reflection in f2(). Re: is it possible that if f1() modified some member variable of the bean it may reflect in method f2(). Author: Surender Kumar (http://www.jguru.com/guru/viewbio.jsp?EID=1133672), Dec 12, 2003 Depends.If it's a stateless bean, then container may give you another instance from the pool, which would be having another state.Change would be definitely there, but you may/may not get them Re[2]: is it possible that if f1() modified some member variable of the bean it may reflect in method f2(). Author: aruna kalidindi (http://www.jguru.com/guru/viewbio.jsp?EID=1143705), Feb 4, 2004 When will a container create new instance? Can we force it to create a new instance if we wish to see the change. When will a container create new instance? Author: Pardeep Sharma (http://www.jguru.com/guru/viewbio.jsp?EID=1177248), Jun 9, 2004 If container does not have any instance in its pool free, then it will create new otherwise it will use existing one. Can I map more than one table in a CMP? Location: http://www.jguru.com/faq/view.jsp?EID=783201 Created: Mar 5, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Sneh Rai (http://www.jguru.com/guru/viewbio.jsp?EID=728890 Actually the answer is no, you cannot map more than one table to a single CMP Entity Bean. CMP has been, in fact, designed to map a single table.
Said so, we can see that there could be some workaraounds. The easiest one is to create a VIEW on the database side and have your CMP Entity mapped to it. This is a perfect fit for a read-only solution and, since views are not database dependant, this is a portable solution. Personally, I think that considering the way database work, it should be possible to use not-read-only ejbs with views. The trick, probably, is to include all the fields from all the tables (including the pk of all tables) and create a compound PK object that maps to all the PKs of the tables. I haven't tested that but if anybody is interested in "wasting" some time, it would be nice... Comments and alternative answers
CMP and Table views Author: prashant jani (http://www.jguru.com/guru/viewbio.jsp?EID=100991), Mar 5, 2002 U can perform an insert in the view only if the associated tables of the view all null values for the fields. Also the primary key class will have to be taken care of For read only purpose views will serve the purpose.
What is the advantage of puttting an Entity Bean instance from the "Ready State" to "Pooled state"? Location: http://www.jguru.com/faq/view.jsp?EID=784545 Created: Mar 6, 2002 Modified: 2002-03-06 05:57:52.176 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by mandeep baruah (http://www.jguru.com/guru/viewbio.jsp?EID=781969 The idea of the "Pooled State" is to allow a container to maintain a pool of entity beans that has been created, but has not been yet "synchronized" or assigned to an EJBObject. This mean that the instances do represent entity beans, but they can be used only for serving Home methods (create or findBy), since those methods do not relay on the specific values of the bean. All these instances are, in fact, exactly the same, so, they do not have meaningful state. Jon Thorarinsson has also added: It can be looked at it this way: If no client is using an entity bean of a particular type there is no need for cachig it (the data is persisted in the database). Therefore, in such cases, the container will, after some time, move the entity bean from the "Ready State" to the "Pooled state" to save memory. Then, to save additional memory, the container may begin moving entity beans from the "Pooled State" to the "Does Not Exist State", because even though the bean's
cache has been cleared, the bean still takes up some memory just being in the "Pooled State". If X clients find the same entity bean, will there be X caches in the container? Location: http://www.jguru.com/faq/view.jsp?EID=787017 Created: Mar 7, 2002 Author: Jon Thorarinsson (http://www.jguru.com/guru/viewbio.jsp?EID=776345) Question originally posed by Jon Thorarinsson (http://www.jguru.com/guru/viewbio.jsp?EID=776345 An Entity Bean represents data in a persistent storage like a database and it caches the data. If X clients connect (via a findXXX method to the same Entity EJB, will there be X copies of the cache in the container or will the container serialize access to a single Entity EJB? The answer could be found in the EJB 2.0 Specs: 10.5.10 - Concurrent access from multiple transactions When writing the entity bean business methods, the Bean Provider does not have to worry about concurrent access from multiple transactions. The Bean Provider may assume that the container will ensure appropriate synchronization for entity objects that are accessed concurrently from multiple transactions. [...] Some containers do activate many instances, while others do prefer to serialize multiple access to one single instance. By default, the latest version of WebLogic would create X instances. Comments and alternative answers
Doubt on multiple access Author: kalyan raman (http://www.jguru.com/guru/viewbio.jsp?EID=753868), Mar 16, 2002 if multiple access are being serialized, then what happens if the bean instance is removed from the container in the middle? How the container is taking care of this? Re: Doubt on multiple access Author: Ashok Kumar (http://www.jguru.com/guru/viewbio.jsp?EID=800067), Mar 16, 2002 Technically, the container shouldn't remove the bean till all the serialized transactions are complete. It should maintain at least one instance of the bean till the X transactions are complete, after which it may remove it from the cache. Please correct me if I'm wrong What about other major application servers? Author: Stéphane RAY (http://www.jguru.com/guru/viewbio.jsp?EID=229276), Jul 30, 2002
I would be very interested in knowing how other major application servers (especially IBM WebSphere) handle this. Any complementary answers or pointers to related information would be welcome. Thanks in advance. Re: What about other major application servers? Author: Ah So (http://www.jguru.com/guru/viewbio.jsp?EID=132590), Aug 9, 2002 l think the # of instance will depend on the commit option (A,B,C,D) one use. For commit option A, there should be one instance only. But for B & C, there should be X Correct ? Can I invoke Runtime.gc() in an EJB? Location: http://www.jguru.com/faq/view.jsp?EID=787021 Created: Mar 7, 2002 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by leo liu (http://www.jguru.com/guru/viewbio.jsp?EID=785799 You shouldn't. What will happen depends on the implementation, but the call will most likely be ignored. Comments and alternative answers
Agreed. Author: Kenneth Liu (http://www.jguru.com/guru/viewbio.jsp?EID=304008), Mar 7, 2002 You should leave system level management like garbage collection for the container to deal with. After all, that's part of the benefit of using EJBs, you don't have to manage resources yourself. Implementing an EJB CMP compound primary key? Location: http://www.jguru.com/faq/view.jsp?EID=787024 Created: Mar 7, 2002 Modified: 2002-03-11 01:07:10.526 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by pavan kumar tammara (http://www.jguru.com/guru/viewbio.jsp?EID=780028 A Primary Key Class is a class that follows few simple rules: • • •
it has to implement the java.io.Serializable interface. all its fields have to be made public, to allow the container to use the Relfection API during the synchronization with the database. to allow the class to be better handled inside Collections, it should override the hashCode() and equals() methods.
•
when using CMP Entity Beans, be sure that the fields of the Primary Key class are also present in the Bean class, to allow the container to set the values, always using Reflection API.
Comments and alternative answers
PrimaryKey class in an EntityBean Author: Manjula Gundluri (http://www.jguru.com/guru/viewbio.jsp?EID=738246), Mar 10, 2002 Why we have to override the Hashcode and equals method in PrimaryKey class of an EntityBean?? Re: PrimaryKey class in an EntityBean Author: Brijesh Sharma (http://www.jguru.com/guru/viewbio.jsp?EID=794204), Mar 13, 2002 To uniquely identified the entity object, each entity primary key class needs to define hashcode method. Hashcode in an integer value. But there is a posibility that two object have same hashcode value, in that case equals method identified the object. Re[2]: PrimaryKey class in an EntityBean Author: Emmanuel DURIN (http://www.jguru.com/guru/viewbio.jsp?EID=936381), Jul 3, 2002 Utility of coding hashCode, is to store an object in a structure using hash keys ( java.util.HashTable, java.util.HashSet for instance ). This seems to be what do application server implementations If you don't code hashCode, you may be in trouble. Two Primary keys Objects with the same values for their attributes, would produce two different hashCodes. Because the default implementation returns the object reference. And this could lead to creating twice the recordset corresponding to the EJB in the database if you make a create through the Home interface. That shouldn't happen for an Entity EJB. hashCode must return the same value for 2 objects having the same values for their attributes. Emmanuel DURIN http://www.durin.org Re: PrimaryKey class in an EntityBean Author: Neeraj Pandey (http://www.jguru.com/guru/viewbio.jsp?EID=450858), Sep 11, 2002 Well, When container returns the beans from memory, it does so by looking in the hashtable, which contains the Object along with some unique integer. To make doubly sure that result are correct, container call equals method also, so that each entry in the hastable contains the unique value. Hence, Primary key class should implement Serializable interface and must override equals and hashCode method. Hope it helps !
Why the Session beans should not be re-entrant and the same way entity bean should be re-entrant? Why the container manages the thread synchronization then what is the point in having a separate property called re-entrant ? Location: http://www.jguru.com/faq/view.jsp?EID=788123 Created: Mar 8, 2002 Modified: 2002-03-08 05:39:26.909 Author: Jon Thorarinsson (http://www.jguru.com/guru/viewbio.jsp?EID=776345) Question originally posed by devaki perumal (http://www.jguru.com/guru/viewbio.jsp?EID=757008 Except for the JMS part of EJBs, Enterprise Java beans have synchronous interfaces, meaning that a response to a request on a bean must be sent before another request is sent to the bean. Entity EJB can be shared between clients but Session EJB cannot. Logically (but not necessarily implementation-wise in a container) this means that in a container there will be many session beans connected to clients and, hidden behind those Session Beans there will be much fewer Entity Beans. This implies that the Entity Beans could possibly benefit from being re-entrant, meaning that requests to them will not be serialized. Whether or not an application server will or can take advantage of the "re-entrant" field in the deployment descriptor is vendor specific. Without going into too much detail, an application server that relies on the database for transaction management, f.ex., will likely not read the "re-entrant" field at all, because it will create entity beans on demand, not share them and thus not serialize access to them - making re-entrancy become a no-issue. Even though session beans are synchronous, the fact that entity beans can be shared between clients means that an entity bean can receive a request that originated from a client B, while being buisy handling a request from a client A. This means that the container has at least 3 ways of dealing with this: • • •
The container may store a single instance of the entity bean in the server's memory (RAM) and serialize access to the bean. The container may store a single instance of the entity bean in the RAM and take advantage of the fact that the bean's "re-entrant" field has been set to true and thus it will not serialize access to the bean. The container may ensure that there exists at least one instance of the entity bean per client that is actively sending methods to the bean. The entity bean is "cloned" in a sense and all of those cloned instances are mapped to the same record in the database. In this case the bean doens't have to be reentrant, because a new client requesting access to the bean will get a new copy of the bean (although logically, all the clients appear to be connected to the same bean). The container also doesn't have to serialize access to the bean.
Note that in all cases, the entity bean can be passivated. Comments and alternative answers
Actually, you have confused concurrency control and "re-entrant" - re-entrant is
something different Author: Nick Minutello (http://www.jguru.com/guru/viewbio.jsp?EID=222214), Mar 10, 2002 The Re-entrant field has nothing to do with concurrency and threading (though, thread-safety is usually what re-entrant implies). The re-entrant flag is there to allow loop-back calls on an entity bean. it is best illustrated by an example: If there are 2 entity beans A, B, and there is a call made on beanA which calls a method on beanB which in turn makes a call on beanA, you effectively have a loopback. Now, if re-entrant is not set, the container will throw an exception at this point. If reentrant is set, the container will permit the loopback call. Now, the risk with marking an Entity Bean as "re-entrant" (and the reason why it is not advised) is that the container cannot tell the difference between a loopback call and a single client performing multi-threaded access. If a client has multiple threads accessing EJB's, and if these threads access the same Entity Bean, then the calls on the entity bean wont be serialised. (it is a bit more complicated than that - the concurrency setting and the transaction context play a part also) In general, loopback calls are not common. In general dont mark your bean as reentrant.
Better refer EJB 2.0 spec section 10.5.11 Author: RajaReddy Gedela (http://www.jguru.com/guru/viewbio.jsp?EID=1004430), Nov 28, 2002 First of all, EJB 2.0 spec(as well as EJB 1.1 also) says that, Entity beans are recommended not to be reentrant. But, I don't understand why you had asked the question as "why entity beans should be reentrant". If you refer the EJB 2.0 spec section 10.5.11 then it would be pretty clear to you. Why the Session beans should not be re-entrant and the same way entity bean should be re-entrant? Author: Gururaj Havanur (http://www.jguru.com/guru/viewbio.jsp?EID=138442), Jan 17, 2003 Session beans are one thread of execution during one method call from the client. They cannot be accessed by more than one thread at the the same time. If they do then it cannot be called a bean with a state, as state can be easily modified by another bean. However, Entity beans on the other hand represent
data. Which means container gives an option to handle this data securely or unsecurely(re-entrant). If Entity bean is not a re-entrant then, a method called from the client will get executed in a single thread of execution. Else, multiple threads will execute the same bean object, may be different methods, and create a data inconsistency. In the sum, Entity beans still serve the purpose of representing the data, whether they are re-entrant or not. However, session beans will not server their purpose if they allow re-entrant Hope that helps Can a Session Bean be defined without ejbCreate() method? Location: http://www.jguru.com/faq/view.jsp?EID=788861 Created: Mar 8, 2002 Modified: 2002-03-14 23:45:58.276 Author: Laurent Mihalkovic (http://www.jguru.com/guru/viewbio.jsp?EID=407112) Question originally posed by devaki perumal (http://www.jguru.com/guru/viewbio.jsp?EID=757008 The ejbCreate() methods is part of the bean's lifecycle, so, the compiler will not return an error because there is no ejbCreate() method. However, the J2EE spec is explicit: • •
the home interface of a Stateless Session Bean must have a single create() method with no arguments, while the session bean class must contain exactly one ejbCreate() method, also without arguments. Stateful Session Beans can have arguments (more than one create method)
Comments and alternative answers
stateful beans Author: alok dashore (http://www.jguru.com/guru/viewbio.jsp?EID=797732), Mar 14, 2002 stateful beans can contain multiple ejbCreate() as long as they match with the home interface definition The EJBObject is the answer. Author: kalyan raman (http://www.jguru.com/guru/viewbio.jsp?EID=753868), Mar 16, 2002 You need a reference to your EJBObject to startwith. For that Sun insists on putting a method for creating that reference (create method in the home interface). The
EJBObject does matter here. Not the actual bean. ejbCreate()
Author: Ramachandra Kondawar (http://www.jguru.com/guru/viewbio.jsp?EID=868788), May 7, 2002 Container creates the bean instance in the following steps. 1.newInstance(). 2.setSessionContext() 3.ejbCreate(). Hence ejbCreate() is required for the beans. I have the second edition of Richard Monson Haefels EJB book, and the examples don't work on JBoss (apparently due to a server bug). I remember seeing some time ago about a fixed set that changed the action of the primary key class. Does anyone have a link for the fixed examples? Location: http://www.jguru.com/faq/view.jsp?EID=794338 Created: Mar 13, 2002 Author: Jonas Bergqvist (http://www.jguru.com/guru/viewbio.jsp?EID=81465) Question originally posed by simon m (http://www.jguru.com/guru/viewbio.jsp?EID=790083 Try downloading the file: rmh_jboss.zip from: http://www.jboss.org/doco_files/ PS. I don't know how up-to-date those files are, since I haven't used them. Just remembered I saw them there. Comments and alternative answers
no file Author: jignesh patel (http://www.jguru.com/guru/viewbio.jsp?EID=972821), Sep 3, 2002 there is no .zip file available on the given link Re: no file Author: Thomas Laresch (http://www.jguru.com/guru/viewbio.jsp?EID=958761), Sep 26, 2002 For the third edition (latest), you can get: the JBoss code (free beta) the JBoss workbook (free beta)
other workbooks (not JBoss) Good luck! Re[2]: no file Author: Thomas Laresch (http://www.jguru.com/guru/viewbio.jsp?EID=958761), Jun 14, 2004 The JBoss code and workbook are now done and have been moved to the O'Reilly web site, co-located with the other EJB workbooks. The first two links in my previous post are no longer valid - instead, go straight to Enterprise JavaBeans, 3rd Edition: Exercise Workbooks and Examples. How to implement an entity bean which the PrimaryKey is an autonumeric field Location: http://www.jguru.com/faq/view.jsp?EID=807820 Created: Mar 22, 2002 Author: anupama jagadeesh (http://www.jguru.com/guru/viewbio.jsp?EID=805279) Question originally posed by David Fernandez (http://www.jguru.com/guru/viewbio.jsp?EID=806139 The EJB 2 Spec (10.8.3 - Special case: Unknown primary key class) says that in cases where the PrimaryKeys are generated automatically by the underlying database, the bean provider must declare the findByPrimaryKey method to return java.lang.Object and specify the Primary Key Class as java.lang.Object in the Deployment Descriptor. When defining the Primary Key for the Enterprise Bean, the Deployer using the Container Provider's tools will typically add additional container-managed fields to the concrete subclass of the entity bean class. In this case, the Container must generate the Primary Key value when the entity bean instance is created (and before ejbPostCreate is invoked on the instance.) I have not tried this yet. Comments and alternative answers
Special case: Unknown primary key class Author: Ramesh Chinthakuntla (http://www.jguru.com/guru/viewbio.jsp?EID=830974), Apr 10, 2002 I really didn't understand this special case:Unknown primary key class in ejb spec. I appreciate if anybody can eloborate. and I don't think this is the right answer for above auestion asked. In case of BMP we can use the auto generated data base seqence object in ejbCreate() method. In case of CMP how to get the auto generated sequence no? Autonumeric Primary Key
Author: Manish Kharkar (http://www.jguru.com/guru/viewbio.jsp?EID=256265), Apr 22, 2002 Create a primary key class with the variable type as that of the primary key. Say int id The create method takes all the values as arguments except the primary key. Within the create method generate the new primary key. 1. select max(id) + 1 from table_name; 2. select sequence.next() from dual; Use this value as the primary key. Proceed as per the persistance type. Re: Autonumeric Primary Key Author: Klaus Dirlewanger (http://www.jguru.com/guru/viewbio.jsp?EID=842393), Apr 25, 2002 The first solution described in the last reply does probably not work with parallel access. The key is not surely distinct. But because CMP will assert that there are no two or more beans with the same primary key, there will be exceptions, which should be catched. The second solution works well but not independant of the underlying database. I think a sequence ist not standard sql nor is the virtual table dual. Re[2]: Autonumeric Primary Key Author: prashant jani (http://www.jguru.com/guru/viewbio.jsp?EID=100991), May 30, 2002 Well folks, here is a simple solution. Map a SequenceGen EJB (entity) to the sequence gen table. have the returnNextSequence() implemented.. THe table will have the numeric field to store the sequence id. U can use a different table for each reqd sequence or a sequence table with BeanName, SequenceVal columns in EJB Create call the SequenceGen.returnNextSequence() to get the PK sequence Jani
Primary Key Generation Strategies Author: Dipanjan Sengupta (http://www.jguru.com/guru/viewbio.jsp?EID=1155744), Mar 19, 2004 You may refer to Floyd Marinescu's book on EJB Design Patterns (specifically the
chapter on Primary Key Generation Strategies). The solution given for CMP Beans works, but I personally feel it defeats the very purpose of CMP Beans, if you really consider the additional code it requires and the resource it hogs. What is clustering? What are the different algorithms used for clustering? Location: http://www.jguru.com/faq/view.jsp?EID=813950 Created: Mar 27, 2002 Author: Jeroen Voogt (http://www.jguru.com/guru/viewbio.jsp?EID=423345) Question originally posed by devseal devseal (http://www.jguru.com/guru/viewbio.jsp?EID=71093 Clustering is grouping machines together to transparantly provide enterprise services. The client does not now the difference between approaching one server or approaching a cluster of servers. Clusters provide two benefits: scalability and high availability. Further information can be found in the JavaWorld article J2EE Clustering. Comments and alternative answers
Clustering Author: josyula srikanth (http://www.jguru.com/guru/viewbio.jsp?EID=888425), May 22, 2002 For at least two reasons you often want your web site to be served by more than one web server: Fault tolerance Handling larger loads than one server can survive The act of letting two individual servers work together to perform one task is often referred to as clustering. Clustering is an essential piece to solving the needs for today's large websites. Re: Clustering Author: Sandeep Shilawat (http://www.jguru.com/guru/viewbio.jsp?EID=1017906), Jan 18, 2003 http://www.onjava.com/pub/a/onjava/2000/12/15/ejb_clustering.html Re[2]: Clustering Author: ravi vedala (http://www.jguru.com/guru/viewbio.jsp?EID=1143327), Feb 4, 2004 Typically there are 3 algorithms followed by Weblogic : a. Round robin algorithm. b. Random allocation algorithm. c. Weight-based algorith. Is it possible to share an HttpSession between a JSP and EJB? What happens when I change a value in the HttpSession from inside an EJB? Location: http://www.jguru.com/faq/view.jsp?EID=813951 Created: Mar 27, 2002 Author: Luigi Viggiano (http://www.jguru.com/guru/viewbio.jsp?EID=101985)
Question originally posed by Manu Manickalal (http://www.jguru.com/guru/viewbio.jsp?EID=705897 You can pass the HttpSession as parameter to an EJB method, only if all objects in session are serializable. This has to be consider as "passed-by-value", that means that it's read-only in the EJB. If anything is altered from inside the EJB, it won't be reflected back to the HttpSession of the Servlet Container. The "pass-by-reference" can be used between EJBs Remote Interfaces, as they are remote references. Comments and alternative answers
Sharing httpSessions between JSP and EJB. Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589), Apr 20, 2002 While it IS possible to pass an HttpSession as a parameter to an EJB object, it is considered to be "bad practice (1)" in terms of object oriented design. This is because you are creating an unnecessary coupling between back-end objects (ejbs) and frontend objects (HttpSession). Create a higher-level of abstraction for your ejb's api. Rather than passing the whole, fat, HttpSession (which carries with it a bunch of http semantics), create a class that acts as a value object (or structure) that holds all the data you need to pass back and forth between front-end/back-end. Consider the case where your ejb needs to support a non-http-based client. This higher level of abstraction will be flexible enough to support it. (1) Core J2EE design patterns (2001) Re: Sharing httpSessions between JSP and EJB. Author: Shahriar Hooshangi (http://www.jguru.com/guru/viewbio.jsp?EID=856514), Apr 26, 2002 I agree with Nick and further add... The EJB and Servlet engines run in separate JVMs (... they could be called and/or accessed by specifying their URLs either through Http (for servlet) or iiop connections for (EJBs) independent of one another). A change to HttpSession in one JVM (i.e. the EJB side) should not be reflected in the other JVM (i.e. the servlet side). Re[2]: Sharing httpSessions between JSP and EJB. Author: Tomcy John (http://www.jguru.com/guru/viewbio.jsp?EID=1137214), Mar 23, 2004 A web application has only one Httpsession Object whether its distributed or not.If a httpsession is to be used in another JVM running in another machine the same session object can be migrated across to the new JVM. Re: Sharing httpSessions between JSP and EJB. Author: siva pathiwada (http://www.jguru.com/guru/viewbio.jsp?EID=1217309), Dec 24, 2004
i acced with MrNick Maiorano he is Absolute correct answer he has given Is there a way to get the original exception object from inside a nested or wrapped Exception (for example an EJBException or RemoteException)? Location: http://www.jguru.com/faq/view.jsp?EID=813959 Created: Mar 27, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Prasoon Choudhary (http://www.jguru.com/guru/viewbio.jsp?EID=264897 Hi, Absolutely yes, but the way to do that depends on the Exception, since there are no standards for that. Some examples: • • • •
When you have an javax.ejb.EJBException, you can use the getCausedByException() that returns a java.lang.Exception. A java.rmi.RemoteException there is a public field called detail of type java.lang.Throwable With a java.sql.SQLException you need to use the method getNextException() to get the chained java.sql.SQLException. When you have an java.lang.reflect.InvocationtargetException, you can get the thrown target java.lang.Throwable using the getTargetException() method.
As usual, the best way to check how to get that piece of information is to read the documentation of the specific Exception. Problem inserting records with CLOB column with Oracle in EJB 2.0. Location: http://www.jguru.com/faq/view.jsp?EID=826293 Created: Apr 5, 2002 Author: Gabriel Jufer (http://www.jguru.com/guru/viewbio.jsp?EID=822382) Question originally posed by Amitava Ghosh (http://www.jguru.com/guru/viewbio.jsp?EID=822343 Additional Info EJB2.0 with an Oracle 8i, with a table containing a CLOB column. In the entity bean of that table the get and set methods are defined to return and accept java.lang.String resp. for that particular CLOB column. That particular field is specified as OracleClob using the tag of the vendor specific descriptor (weblogic-cmp-rdbms-jar.xml). But when trying to insert a record using create method, Oracle returns an error saying: record containing LOB column is not locked. LOB's in Oracle are different than in other databases! LOB mean Locator. Follow these SQL Steps to insert a Row in Oracle: 1. Insert a row with all your data. All lobs (BLOB, CLOB) must have the value empty_blob() or byte[]{1}
2. Lock the row and get it (we need a result set!) Select * from your_table for update 3. Parse the result set to get the BLOB or CLOB Object oracle.jdbs.CLOB myCLOB = (CLOB) myResultSet.getObject( /*column index*/ 1);> 4. With this object you can fill data into the db! get the CharArrayOutputStream, fill your data, flash it and close it!! 5. Unlock the row with a SQL update.
Note: to update the row, you must call trim from the CLOB object before you fill in the data! Make sure you have the right Oracle thin driver! Further info can be found on Oracle TechNet! [It seems that all these steps would require a BMP bean, rather than a CMP. - AAG] Comments and alternative answers
Example code for dealing with Oracle CLOBs Author: John Sidney-Woollett (http://www.jguru.com/guru/viewbio.jsp?EID=336035), Apr 5, 2002 Here is some example code for writing data to an ORACLE clob.
public static void addContentText(Connection conn, long contentID, String displayText, String searchText) throws SQLException { PreparedStatement ps = null; ResultSet rset = null; String qry = null; oracle.sql.CLOB displayClob = null; oracle.sql.CLOB searchClob = null; try { //switch off commits conn.setAutoCommit(false); qry = "select PAGE_TEXT, SEARCH_TEXT from CONTENT where CONTENT_ID = ? for update"; ps = conn.prepareStatement(qry); //set the parameters ps.setLong(1, contentID); rset = ps.executeQuery(); if (rset.next()) { //get the CLOB locators displayClob = ((OracleResultSet) rset).getCLOB(1); searchClob = ((OracleResultSet) rset).getCLOB(2);
if ((displayClob != null) && (displayText != null))
writeTextToCLOB(displayClob,
displayText); if ((searchClob != null) && (searchText !=
null))
writeTextToCLOB(searchClob,
searchText); }
//reinstate auto commit conn.setAutoCommit(true); //commit changes conn.commit(); //close the resultset rset.close(); rset = null; //close the statement ps.close(); ps = null;
} catch (SQLException ex) { System.out.println("SQLMaker.addContentText"); System.out.println(ex); throw ex; } finally {
//reinstate auto commit if (!conn.getAutoCommit()) { conn.rollback(); }
conn.setAutoCommit(true);
//close the resultset if (rset != null) rset.close(); //close the statement if (ps != null) ps.close(); }
}
public static void writeTextToCLOB(CLOB c, String text) {
if (c == null) return; Writer w = null; try {
//get the writer from the clob (locator) w = c.getCharacterOutputStream(); //write the page text w.write(text); //flush and close w.flush(); w.close();
} catch (Exception ex) { System.out.println("ERROR writeDataToCLOB"); System.out.println(ex.toString()); try { //try closing again w.close(); } catch (Exception ex2) {;} }
}
If you're accessing or writing data back to CLOBs you may be required to use BMP as opposed to CMP... Hope the above helps. Re: Example code for dealing with Oracle CLOBs Author: Praveen Allam (http://www.jguru.com/guru/viewbio.jsp?EID=1045499), Jan 12, 2003 I dont agree John's last statement. You can freely use CMPs even if you have CLOBs in the database. Populate/Update the CLOB column in ejbPostCreate/ejbStore methods by using JDBC calls. For the last two years I am doing the same in dealing with CLOBs and BLOBs Re[2]: Example code for dealing with Oracle CLOBs Author: zhidong zhao (http://www.jguru.com/guru/viewbio.jsp?EID=1049276), Jan 22, 2003 not if your data for lobs exceed 4000 bytes Re[2]: Example code for dealing with Oracle CLOBs Author: Christopher Randall (http://www.jguru.com/guru/viewbio.jsp?EID=899332), Feb 6, 2003 I'd sure appreciate seeing a code sample. I have CMP entity beans, and have some CLOB-management code in the ejbLoad() and ejbStore() methods (just
doing selects and updates right now, not doing inserts). Thanks, Chris Re[3]: Example code for dealing with Oracle CLOBs Author: Nikhil Silsarma (http://www.jguru.com/guru/viewbio.jsp?EID=1177142), Jun 8, 2004 There is one problem I am facing. Using CMP I am tryiong to insert around 1000 recs in a table which contain a column of type CLOB and facing the problem ORA-01000: maximum open cursors exceeded and what I feel is that before inserting any rec it fires one SELECT stmt to lock the table and and this explicit cursor is not closed properly. Can anyone please answer this how to solve. Niks How can I implement toString() method in my EJB? Location: http://www.jguru.com/faq/view.jsp?EID=850846 Created: Apr 23, 2002 Author: Joseph vijay Raj (http://www.jguru.com/guru/viewbio.jsp?EID=841513) Question originally posed by dachih naraw (http://www.jguru.com/guru/viewbio.jsp?EID=521162 I have implementation in my ejb-implementation class: public String toString() { return new String(" User id =" + m_id +"; "); } and in the remote interface public java.lang.String toString() throws RemoteException; But I got this error message: ... method toString() in interface userEntity cannot override method toString() in class java.lang.Object, overridden method does not throw java.rmi.RemoteException at line 12, column 27 I think this is not possible because the toString() defined in the Remote Interface should throw RemoteException. It will not be compatible with java.lang.String java.lang.Object.toString() method. Hence I think its not possible. Comments and alternative answers
You can try this solution Author: srikanth pindi (http://www.jguru.com/guru/viewbio.jsp?EID=517287), Apr 28, 2002 You donot need to declare the method in the remote interface.Since every class extends java.lang.Object,you need to override the toString() method in the bean class. Re: You can try this solution
Author: antony louis (http://www.jguru.com/guru/viewbio.jsp?EID=1160566), Apr 6, 2004 Yes U r right, no need to declare in remote. U can override the method toString(); Remote Interface only provides declarations for Business Methods Author: Tiru Bathula (http://www.jguru.com/guru/viewbio.jsp?EID=853436), May 5, 2002 As every object in java extends from java.lang.Object class, we can directly override the toString() method in EJB Bean. One more thing is Remote Interface only provides declarations for Business Methods. EJB bean class need to provide implementions for the same Business methods. toString() method implementation Author: Sheikh Azad (http://www.jguru.com/guru/viewbio.jsp?EID=967553), Jul 28, 2002 There is no point implementing toString() in your remote interface.We write those methods in the remote interface which client calls explicitly.since u are not calling this method explicitly ,Implement ur toString() method directly in your bean class.It can only throw exceptions which are thrown in it's super class,again there is no point throwing RemoteException. How u map a composite Primary Key in CMP Entity Bean and how u handle the same composite primary key in primary key class? What is the usage of HashCode() and Equals() methods? They return only one single primary key value? Location: http://www.jguru.com/faq/view.jsp?EID=854006 Created: Apr 25, 2002 Modified: 2002-04-26 00:30:22.28 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by pavan kumar tammara (http://www.jguru.com/guru/viewbio.jsp?EID=780028 I think you are making some confusion on the purpose of the equals() and hashCode(): they do not return a "single primary key value". equals() returns a boolean that indicates whether another object is "equal" to this one, while hashCode() returns an int that represent the hashcode of an object, that is used for the benefit of hashtables, like java.util.Hashtable. anand narang also added that the reason why we have 2 methods is that hashcode may not always return unique values. So the container also calls the equals method to verify the uniqueness. Check out the javadoc for those two methods Comments and alternative answers
Composite Primary key in CMP Author: anand narang (http://www.jguru.com/guru/viewbio.jsp?EID=503174), Apr 25, 2002 Hi, First the ejbCreate function declaration returns the primary key class. But the actual return value is null as the container does the job of returning the PK class in some way. While creating the primary key class one need to override the hashcode method and equals method for uniqeness between entity bean instances. The reason why we have 2 methods is hashcode may not always return unique values which isthe reaon the container also calls the equals method to verify the uniqueness. hashcode returns int value whereas equals returns a boolean. Hope this answers ur question. Regards
EntityBean:Primary Keys Author: Manjula Gundluri (http://www.jguru.com/guru/viewbio.jsp?EID=738246), Jun 4, 2002 HashCode:By supplying this method,our primarykey class can be stored in a Hashtable.The container need this because inside the container it may use a Hashtable or similar structure to store a list of all entity beans it has in memory,keyed on their primary keys Equals:The container calls this to compare this primary key to others when determining internally if two cached entity beans(which each have a primary key) are representing the same database data Re: EntityBean:Primary Keys Author: sravan reddy (http://www.jguru.com/guru/viewbio.jsp?EID=962689), Jul 24, 2002 Manjula's answer is quite informative.Thanks for the info. regds Sravan Composite Primary Key Usage in HashCode and equals method of Primary Key class. Author: Jiten Taluja (http://www.jguru.com/guru/viewbio.jsp?EID=1102000), Jul 17, 2003 The following has been taken from an EJB link in java.sun.com and hence is not my proprietary: In the following example, the XXXKey class implements a composite key for the XXXEJB entity bean. The key is composed of two fields, keyModel and keyId, whose names must match two of the persistent fields in the entity bean class. public class XXXKey implements java.io.Serializable
{ public String keyModel; public String keyId; public XXXKey() { }; public String getKeyModel() { return keyModel; } public String getKeyId() { return keyId; } public boolean equals(Object other) { if (other instanceof XXXKey) { return (keyModel.equals( ((XXXKey)other).keyModel) && keyId.equals( ((XXXKey)other).keyId)); } return false; } public int hashCode() { return keyModel.concat(keyId).hashCode(); } } In addition, for container-managed persistence, a primary key class must meet the following requirements:
1) The access control modifier of the class is public. 2) All fields are declared as public. 3) The fields are a subset of the bean's persistent fields. 4) The class has a public default constructor. 5) The class implements the hashCode() and equals(Object other) methods. 6) The class is serializable. Hope this helps.
Re: Composite Primary Key Usage in HashCode and equals method of Primary Key class. Author: sandeep vaid (http://www.jguru.com/guru/viewbio.jsp?EID=1136787), Jan 3, 2004 In the class that we use to define as composite primary key, the equals method should be implemented because there should be some mothod to compare the equality of two object if we don't give this method the java.lang.Object class's equal method will call which will only compare the equlaity of the object refrences,But it is required to get the equality of two distinct objects of same class so the equals method should be overriden in our composite primary key class which is custom defined class(eg. this is same as the case we give the equals method in String class.) As per the case of the hashcode method if we don't override the Object class's hashCode()in subclass (say Composite primary key class)the Object class's hashCode() will be called when we need the key in the java.util.Hashtable. as i think the Java Apllication server uses Hastable to store the rows in key/Value pair for entity beans.Where the Key is composite primary key and value is object of the entity bean(object view of the row), so the composite primary key will easily distinguish the row. But we should implement the hashCode() logic to get the key for particuler key instance. when we have to retrive the value from the Hashtable the equals method of the key class is used to compare the key with the required key. Hence we need the equals method for the Hashtable which we will overide in our composite primary key class. composite primary key with 2 integers Author: Amol Umate (http://www.jguru.com/guru/viewbio.jsp?EID=1231354), Mar 8, 2005 What happens when we have a composite primary key a1 and a2 (both integers) How i can i provide the hascode implementation of this ? public int hashCode(){ return a1 +a2; } In this case, scenario 1 is if a1 = 1 and a2 = 0 scenario 2 is if a1 = 0 and a2 = 1 The addition is always 1. How can this be maintained in hastable If my session bean with single method insert record into 2 entity beans, how can know that the process is done in same transaction (the attributes
for these beans are Required)? Location: http://www.jguru.com/faq/view.jsp?EID=854012 Created: Apr 25, 2002 Author: Jesper Lai Petersen (http://www.jguru.com/guru/viewbio.jsp?EID=817052) Question originally posed by NG SWEE TIONG (http://www.jguru.com/guru/viewbio.jsp?EID=816768 If yor method in the session bean is already running under a transaction the calls to any other bean which have been deployed with trans-attribute 'Required' will be executed within the same transaction context. So if your session bean is using container-managed transactions and your method is deployed with 'Required', 'RequiresNew' or 'Mandatory', you can safely assume that the calls to your entity beans are handled under same transaction. If you're not running in a transaction, a separate transaction will be set up for each call to your entity beans. If your session bean is using bean-managed transactions, you can ensure that the calls are handled in the same transaction by : javax.transaction.UserTransaction tran= null; try{ tran=ctx.getUserTransaction(); tran.begin(); myBeanHome1.create(....); myBeanHome2.create(...); tran.commit(); }catch(...){} You may want to check if you're already running in a transaction by calling tran.getStatus(). Comments and alternative answers
SessionSynchronization Interface Author: Avi Abrami (http://www.jguru.com/guru/viewbio.jsp?EID=31214), Apr 27, 2002 If your session bean is a stateful session bean that uses container meneged transactions, it can also implement the (optional) SessionSynchronization interface. This interface consists of callback methods that are invoked at certain stages in a transaction's life cycle. See section 7.5.3 of the EJB specification for more details. correction to above answer Author: Ashok Chitiprolu (http://www.jguru.com/guru/viewbio.jsp?EID=858240), Apr 28, 2002 With 'RequiredNew' transaction value, container always creates a new transaction before executing the business method. If current process is already participating in a transaction then existing transaction will be suspended until the call to business method is complete. Re: correction to above answer Author: dipankar datta (http://www.jguru.com/guru/viewbio.jsp?EID=763044), May 7, 2002
if I go by BMP is it necessary to set transaction attribute as "required" for beans? Re[2]: correction to above answer Author: Snigdha Singh (http://www.jguru.com/guru/viewbio.jsp?EID=926606), Jun 24, 2002 The transaction value for Session Bean should be "RequiredNew" and for the entity beans "Required". This will guarantee that the two entity beans are in the same transcation context. Re[3]: correction to above answer Author: Dileep Dharma (http://www.jguru.com/guru/viewbio.jsp?EID=1081692), Jul 22, 2003 Well, I am trying to do the following: Have a stateful session bean, that has method m1. Invoking the create method of an entity bean , TWICE , with same parameters. Thus, this will throw an DuplicateKeyException when called second time with same parameters. I want to know that when this exception is thrown , will the container rollback the first insertion also ? Like : home.create(1,"Something"); home.create(1,"Something"); So in this case, when the above 2 stmts are executed, since 2nd one will raise an exception will first one get rolled back - I Think it must bcos thats what is txn mgt that either the whole group of stmt must be committed or nothing ? But when i tried it doesnt ! The txn attr set for the method is required in the stateful session bean. I am sure i am missing something somewhere ! Can anyone throw some light on this please ! <1 Doubt> I read somewhere that when a EJBException is thrown, the transaction is rolledback by the container. But then this will make us catch DuplicateKeyException and then throw EJBException which wud not really mean Transaction Management using declaration. 1 Doubt> Kindly help in getting the thing clear ! Regards, Dileep Re[4]: correction to above answer Author: Deepak Kalra (http://www.jguru.com/guru/viewbio.jsp?EID=1152019), Mar 10, 2004
Well, Application Exception do not automatically cause the container to Rollback. You need to use Context.setRollBackOnly method in each Catch Block ejb rollback insert mysql + jboss Author: Jason Long (http://www.jguru.com/guru/viewbio.jsp?EID=1061660), Nov 29, 2004 Does anyone really know how to make this work? It seems like such a simple thing to ask for. I cannot get my home.create() statements to roll back either. I need an answer badly. Can anyone help? I have a session bean that call an entity bean that creates another entity. This will never roll back. All other operations are rolled back and I am left with extra bogus records. Re: ejb rollback insert mysql + jboss Author: Jason Long (http://www.jguru.com/guru/viewbio.jsp?EID=1061660), Nov 30, 2004 My problem was the default table type was MyISAM. I switched to BDB tables this corrected the problem. What is secondary storage area? Location: http://www.jguru.com/faq/view.jsp?EID=858525 Created: Apr 29, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by mandeep baruah (http://www.jguru.com/guru/viewbio.jsp?EID=781969 In an Entity Bean the passivation process has to be considered as a simple notification that the instance is going to be dissociated from the object. Saving the bean state (synchronizing it with the database), on an entity bean, is something that is done through ejbStore(). With Stateful Session Bean the passivation process of a bean it does saves the state of the bean in a secondary storage. The reason is because a stateful session bean do maintain the state between calls. In order to do that, the container has to save that state somewere. It uses its own storage area, that could be memory or a cache or the disk, and it calls this "secondary storage area", since the database is considered to be the first storage area. With EJB 1.1 specs, why is unsetSessionContext() not provided in Session Beans, like unsetEntityContext() in Entity Beans? Location: http://www.jguru.com/faq/view.jsp?EID=860689 Created: Apr 30, 2002 Author: Noel Byron (http://www.jguru.com/guru/viewbio.jsp?EID=755836) Question originally posed by Geof P (http://www.jguru.com/guru/viewbio.jsp?EID=482943
ejbRemove() is called for session beans every time the container destroyes the bean. So you can use this method to do the stuff you typically would do in unsetEntityContext(). For entity beans ejbRemove() is only called if the user explicitly deletes the bean. I think that is the reason why the engineers at SUN invented the unsetEntityContext() for this kind of bean. Comments and alternative answers unsetEntityContext()
Author: Ramachandra Kondawar (http://www.jguru.com/guru/viewbio.jsp?EID=868788), May 7, 2002 when ejbRemove() is called , the row represented by the entity bean is removed from the database and the bean instance is returned to the instance pool. Only when unsetEntityContext is invoked, the bean instance is destroyed. Re: unsetEntityContext() Author: Sheikh Azad (http://www.jguru.com/guru/viewbio.jsp?EID=967553), Jul 28, 2002 In Entity bean ejbRemove() does 2 things:(1)-unsetEntityContext(),(2)-Delete Row from the DataBase.In Session Beans you are not worried about the Data Base synchronisation so ejbRemove() alone can perform the work without side effects. Sesssion Author: Govindu Ravikumar (http://www.jguru.com/guru/viewbio.jsp?EID=93067), Jan 20, 2003 Because, session beans called transcation beans, so does;t matter abt conext. How is Stateful Session bean maintain their states with client? Location: http://www.jguru.com/faq/view.jsp?EID=860692 Created: Apr 30, 2002 Author: Jesper Lai Petersen (http://www.jguru.com/guru/viewbio.jsp?EID=817052) Question originally posed by Venkat Muthusamy (http://www.jguru.com/guru/viewbio.jsp?EID=816578 When a client refers to a Stateful Session object reference, all calls are directed to the same object on the EJB container. The container does not require client identity information or any cookie object to use the correct object. This means that for a client to ensure that calls are directed to the same object on the container, all it has to do is to use same reference for every call. For example the following holds for all stateful session beans:
StatefulHome sfh = ...//get home interface for stateful bean Stateful bean1 = sfh.create(); Stateful bean2 = sfh.create();
if (bean1.isIdentical(bean1)){} //this is true! if (bean1.isIdentical(bean2)){} //this is false! //Note that the second test would evaluate to true for stateless beans Thus, if you're calling a Stateful Session Bean from a servlet, your servlet need to keep the reference to the remote object in the HttpSession object between client calls for you to be able to direct calls to the same object on the container. Likewise, if you're calling from an application, you only obtain the reference to the bean once and reuse the object throughout the application session. Comments and alternative answers
Stateful Session bean Author: Manjula Gundluri (http://www.jguru.com/guru/viewbio.jsp?EID=738246), Jun 4, 2002 If the stateful session bean is going to passivate,its state is written to harddisk and then the bean instance will be freed to serve other request.When the same client is active again,bean instance will read the state from hard disk to regain the state.But how the bean instance knows that for which client which file it has to read to maintain the state Re: Stateful Session bean Author: Vadiraj A (http://www.jguru.com/guru/viewbio.jsp?EID=954198), Jul 17, 2002 Actually, Stateful session beans, when it is passivated it will not go into the pool usually. It depends on the server.Usually stateful sessin beans r destroyed after passivated to release the resourdce. Container will maintain the record of all these things. When the client comes back it will create the statefull session bean and restore the values from the secondary storage where it has written its state. If a stateful session beans wants to know about its client, it has to use the SessionContext object, which has been passed by the container through setSesssionContext() method. Re: Stateful Session bean Author: Razvan Matei (http://www.jguru.com/guru/viewbio.jsp?EID=283464), Mar 4, 2003 Hi. Actually the key is in the name: SESSION statefull bean. There is always assumed that a session spawns across a client so a 1:1 correspondence. But it might not be like that always thus the state is maintained as long as the reference to the bean is maintained (or remove called by user of container due timeout).More directly the session lasts from:begin=your bean.create(args) till end=your bean.remove().In between these two calls, many "clients" can ask services from the SAME work session. W Re: Stateful Session bean Author: ravi shankar (http://www.jguru.com/guru/viewbio.jsp?EID=1163137), Apr 15, 2004
When the stateful session bean is going to passivate, which the ejbobject does it automatically.. the state of the client will be stored into a serializable file along with the session id(which is unique across the clients). so when the same client comes after the threshold time, ejbobject will create a new bean instance and based on the session id it will read the state from the serializable file and restore the state of the client. So the session id is the key which helps the ejbobject to restore the client state from serializable file. Re[2]: Stateful Session bean Author: Ch Srinivas (http://www.jguru.com/guru/viewbio.jsp?EID=1203489), Oct 5, 2004 After the threshold time session will be closed. A new session will be created and no guarantee that previous session id and newly created session id is same. Then how could session id is the key...........? Choosing among ejbSelect or find? Location: http://www.jguru.com/faq/view.jsp?EID=864724 Created: May 3, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by zhebin cong PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=568853 The ejbSelectXXX() and findXXX are very similar methods, and the main difference is that the first one is not exposed through the client interface, that means that it cannot be called by a client directly, unless wrapped in a method. There is another interesting difference related to the transaction context under wich an ejbSelectXXX() or findXXX() method is executed. The ejbSelectXXX() methods are executed in the transaction context of the method that is actually using it, while the findXXX() execute according to their own attributes (as specified by the bean provider). Nikos Argiropoulos has also added two additional differences: The ejbSelectXXX() method can return a single or a collection of objects of any type e.g Strings when the finded returns only single or collection of component or local component interfaces. When calling the ejbSelectXXX method from the wrapping business method, you can pass to it arguments related with the particular instance of the EJB. In the findXXX this cannot be done. Deciding when to use one and when the other, is really up to the developer. The ejbSelectXXX() seems to be a little bit more powerful. Is important to remember that it cannot be used by the client. Comments and alternative answers
hoosing among ejbSelect or Find Author: pramod talesara (http://www.jguru.com/guru/viewbio.jsp?EID=1067448), Mar 19, 2003
I was also tryingto write a ejb select method for my project and i noticed another quite obvious difference.Finder methods can be called by remote home interface but select can only be called by remote bean interface. Is it possible to invoke multiple Session Beans from one Session Bean, using Reflection? Location: http://www.jguru.com/faq/view.jsp?EID=868735 Created: May 7, 2002 Author: Viral Shah (http://www.jguru.com/guru/viewbio.jsp?EID=278910) Question originally posed by jyoti rath (http://www.jguru.com/guru/viewbio.jsp?EID=836863 You use reflection when you actually instantiate the objects or invoke the method. In the EJB Scenario Beans invoke other Beans as clients. The client only looks up the objects (not instantiating) and the operations are invoked on the stubs only. So, no question of reflection :) Comments and alternative answers
invoking session bean from another session bean Author: Vaks Mahesh (http://www.jguru.com/guru/viewbio.jsp?EID=906761), Jun 7, 2002 Since all the EJBs are invoked and can't be instantiated from the client, one can't use reflection for invoking any EJB kind of parallel programming Author: rahul Mawkin (http://www.jguru.com/guru/viewbio.jsp?EID=938820), Jul 5, 2002 if u need a ejb to call multiple ejb of same kind u can use the method which i followed Use a queue Suppose EJB1 wanna call EJB2 EJB1 produce messages to Queue and EJB2 is called by multiple MDB. Its a kind of way of producing parallel processing inside the container forcefully. It worked out for me try it cheers Rahul Mawkins Using reflection to invoke session beans Author: T Cheng (http://www.jguru.com/guru/viewbio.jsp?EID=843459), Oct 4, 2002 Yes, its possible. Example: InitialContext ctx = new InitialContext(); Object value = ctx.lookup(BEAN_JNDI_NAME); EJBHome ejbHome = (EJBHome) javax.rmi.PortableRemoteObject.narrow(value, EJBHome.class); EJBMetaData metaData = ejbHome.getEJBMetaData(); Class homeClass = metaData.getHomeInterfaceClass(); Class remoteClass = metaData.getRemoteInterfaceClass(); // add this line, so you get an object of the home interface type ejbHome = (EJBHome) javax.rmi.PortableRemoteObject.narrow(ejbHome,
homeClass); // create the remote object Method methodCreate = homeClass.getDeclaredMethod("create", null); //Call a method on the remote interface EJBObject remoteObj = (EJBObject)methodCreate.invoke(ejbHome, null); Method methodGet = remoteClass.getDeclaredMethod(METHOD_NAME, params);
Hope this helps! EJB-And-Reflection.YES.Why NOT? Author: vimarsh vasavada (http://www.jguru.com/guru/viewbio.jsp?EID=972756), Jan 21, 2004 As Mr. Chang has described one can use reflection with EJB also.Strictly disagree with author Viral on this point. The same idea i would like to extend for EJBObject...i.e. how a particluar client[servlet/pojo/session] can invoke a method on another session bean without importing its Home/Remote?i.e. the client is linked to EJB at compile time but at run-time. In Plain Java world one needs to delegate call to instances that are in same JVM. In EJB instances are distributed and ,as Viral said,the client does not have reference to instances.But client does have reference to STUB.A stub by defination is proxy for remote aka distributed instances.So if you can delegate calls to stub...youcan delegate call to remote instances.. Then the question is how does one get access to Stub... ..the answer is with the help of EJBMetaData..for example you have a session bean : MySessionHome/MyRemote/MyBean..3 classes.. Now MyRemote has a simple method :"getYourMessage()" now study the code without reflection and then with reflection.. --------------------------------------------------------//NORMAL-WITHOUT-REFLECTION import MyHome; import MyRemote; import javax.ejb.*; public Class client_without_reflection { public static void main(String args[]){ //1. create initial context Properties h = new Properties(); h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); h.put(Context.PROVIDER_URL, url); Context c = new InitialContext(h); //2. look-up home Object home = ctx.lookup(JNDI_NAME); MyHome myHome =(MyHome)
PortableRemoteObject.narrow(home, MyHome.class)
}
//3. create the remote MyRemote myRemote = (MyRemote) myHome.create(); //4. use the remote String message = myRemote.getMessage();
}
--------------------------------------------------------//REFLECT EJB..REFLECT.. import javax.ejb.*; //no-need to import anything..!! public Class client_ejb_reflection {
public static void main(String args[]){ //1. create initial context Properties h = new Properties(); h.put(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); h.put(Context.PROVIDER_URL, url); Context c = new InitialContext(h); //2. look-up home Object home = ctx.lookup(JNDI_NAME); EJBHome theHome =(EJBHome) PortableRemoteObject.narrow(home, MyHome.class) //3. create the remote EJBMetaData md = this.theHome.getEJBMetaData(); Class homeClass = md.getHomeInterfaceClass(); EJBObject theRemote = (EJBObject) this.invoke(homeClass,theHome,"create"); //4. use the remote Class remoteClass = md.getRemoteInterfaceClass(); String message = this.invoke(remoteClass,theRemote,"getMessage"); } static Object invoke(Class c,Object obj,String mname){ Method[] methods = c.getMethods(); String name=null; Object r= null; try { for(int i = 0; i<methods.length ;i++) { name = methods[i].getName(); if(name.startsWith(mname)) { r = methods[i].invoke(obj,null); } }
} catch(Exception e){ e.printStackTrace();
}
} return r;
}
Now how does it work?back to question:"how does one get access to Stub...?" What does LookUp return: Object -->EJBHome WHat is this EJBHome actually?->internally it refers to Stub returned by distributed server. What does create return: Object -->EJBObject WHat is this EJBObject actually?->internally it refers to Stub returned by distributed server. ok.so client is holding a stub only.and hence can invoke on it.stub any talks to server..!!so it works.The crux is EJBMetaData which gives you access to ACTUAL REMOTE CLASS...!! Rarley one would use such reflection-techniques to right the business code..then where it is usefull.. 1. IDE/Deployment Tools.. Just refere EJBMetaData javadoc.its enlightning. 2. Scheduler products like Kronova...can invoke any method on any Session bean..as per schedule...it allows GUI to define an EJBTask.visit http://www.kronova.com/documentation.html 3. Business-Rule-Engine. 4. !!! 5. !!! So it's possible.Not every application needs it.it has its domain. Re: EJB-And-Reflection.YES.Why NOT? Author: Itoyjaved C (http://www.jguru.com/guru/viewbio.jsp?EID=871478), Jan 21, 2004 Hi, I agree with Mr. Vimars Vasavada and Mr. Chang. Reflection is one of the possible ways to invoke Session Bean services.I have tried using the same technique to invoke services using reflection and it works. So I c no apparent problem, going ahead with this strategy. Any insight into the con's of this appraoch is welcome. Cheers With what transaction level are ejbCreate and ejbRemove method called for Entity Beans? Location: http://www.jguru.com/faq/view.jsp?EID=942752 Created: Jul 9, 2002 Author: G M (http://www.jguru.com/guru/viewbio.jsp?EID=802175) Question originally posed by ani ani (http://www.jguru.com/guru/viewbio.jsp?EID=706510 Additional info: What is the transaction level with which the ejbCreate and ejbRemove will be
executed? For business method I can have any attributes in my DD, as TX.Reqd, TX.Reqd_New, TX.Support etc... Does ejbCreate and ejbRemove methods have any default transaction levels? If not can we set it as we do for other business methods? <method> <ejb-name>myBean <method-name>* Required In the above, do all the methods including ejbCreate ejbRemove will have transaction attribute of Required? If not then with what transaction level these methods are executed (if they have any default transaction level)? ejbCreate() and ejbRemove are called using an unspecified transaction context. In short, you can't set a tx attribute for these. Refer sections 7.5.7 - "Transaction context of session bean methods" and 17.6.5 "Handling of methods that run with “an unspecified transaction context" of EJB 2.0 spec. Comments and alternative answers
EBs are different Author: Fyodor Dostal (http://www.jguru.com/guru/viewbio.jsp?EID=988519), Sep 10, 2002 For Entity Beans you must specify a TA attrib in the deployment descriptor. ejbCreateXxx() and ejbRemove() are executed in the TA context specified for the corresponding createXxx() and remove() methods. See EJB 2.0 spec, chapter 10.5.2 Regs, Fyodos ejbCreate() -- Transaction LEvel Author: Seetharaman Narayanan (http://www.jguru.com/guru/viewbio.jsp?EID=75778), Sep 17, 2002 If this is the case, then should we at all put our insert(transactional) statements in ejbCreate() method ? I put all my insert statements and executed them from ejbCreate() method and found that the transactions are committed no matter how the depending transactions ended! This is very interesting and has provided a satisfactory reason for what was happening to my ejbs! Problem with orion.jar in oc4j Location: http://www.jguru.com/faq/view.jsp?EID=947167 Created: Jul 12, 2002 Author: Ranga S (http://www.jguru.com/guru/viewbio.jsp?EID=728738) Question originally posed by nimit shah (http://www.jguru.com/guru/viewbio.jsp?EID=459796
Additional info. I have downloaded oc4j from following link http://otn.oracle.com/software/products/ias/devuse.html which runs on all platforms. It is a zip file of about 19MB. According to installation instructions I have unzipped it and given command % java -jar orion. jar -install ,but there is no file named orion.jar. How can I get orion.jar or entire oc4j which can be insalled on win98? It depends on the version. This could work> java -jar oc4j.jar -install Retrieving user name from inside each bean. Location: http://www.jguru.com/faq/view.jsp?EID=993239 Created: Sep 3, 2002 Author: Riccardo Bongiovanni (http://www.jguru.com/guru/viewbio.jsp?EID=873205) Question originally posed by Riccardo Bongiovanni PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=873205 How can I retrive from inside my Bean (Stateless Session and Entity CMP) the user name which I'm serving (the user name of user just logged in my web application)? I need to know user name because I have a "logger Class" in my enterprise application that automatically generates logs files for tracking transactions for each user that logs in. Inside an EJB you may retrieve the "Caller" name, that is the login id by invoking: sessionContext.getCallerIdentity().getName() where sessionContext is the instance of "SessionContext" (setSessionContext) passed to the Session Bean, or the instance of "EntityContext" (setEntityContext) passed to the Entity Bean. Comments and alternative answers
session context .. webserver / appserver Author: prashant jani (http://www.jguru.com/guru/viewbio.jsp?EID=100991), Sep 3, 2002 Well, i suppose the webserver sessionContext is different from the app server context. The caller will give the identity of the calling method and not the name of the 'user login'.
Can a primitive data type be specified as a method parameter, in the deployment descriptor? Location: http://www.jguru.com/faq/view.jsp?EID=997061 Created: Sep 10, 2002 Author: Alessandro A. Garbagnati
(http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Shafique Razzaque (http://www.jguru.com/guru/viewbio.jsp?EID=996569 There are no specific restriction for using Java primitive types in the <methodparams> tag in the Deployment descriptor. The EJB 2.0 specifications, describe the <method-params> by saying: "[...] are the fully-qualified Java types of the method’s input parameters [...]". In addition there are few examples where the types used are both classes (i.e. java.lang.String) or simple primitives: <method-params> <method-param>char <method-param>int [...] Is it possible to integrate TIBCO system with EJB or, generally, with J2EE? Is this done through the JMS-TIBCO connector? Is it possible to deploy EJB directly on TIBCO? Location: http://www.jguru.com/faq/view.jsp?EID=997068 Created: Sep 10, 2002 Modified: 2002-09-11 04:34:57.777 Author: Jon Dart (http://www.jguru.com/guru/viewbio.jsp?EID=996845) Question originally posed by Francesco Marchioni (http://www.jguru.com/guru/viewbio.jsp?EID=59707 TIBCO has a product called TIBCO Adapter for EJB that facilitates communication between EJBs and services that use TIBCO's Rendezvous messaging system. TIBCO also has a full-featured JMS implementation that can gateway JMS messsages into and out of TIBCO Rendezvous. You cannot deploy EJB directly on TIBCO, since TIBCO isn't a deployment platform for EJBs. anthony warden has also added the link to the TIBCO Enterprise for JMS, that provides a standardized interface for enabling communications between J2EEcompliant applications, Enterprise Java Beans, and application servers. The integration with JBoss and weblogic is documented in the help files. Info about EJB, SNMP and SUN JDMK package. Location: http://www.jguru.com/faq/view.jsp?EID=1003249 Created: Sep 24, 2002 Author: Philipp Meier (http://www.jguru.com/guru/viewbio.jsp?EID=98883) Question originally posed by Ramesh Babu (http://www.jguru.com/guru/viewbio.jsp?EID=793359 How do I use EJB with SUN JDMK package? Because JDMK uses sockets, is that mean I can't use in my bean? What is the exact reason? What are all the 3rd party packages/API I can use with EJB ? How the restrictions comes? The reason that opening sockets is forbidden with EJB is that e.g. your EJB could run in a clustered environment and multiple call to the same EJB might be executed on different hosts which could lead to problems.
Therefore it's the application container's job to manage e.g. JDBC Connections which are guaranteed to work in a clustered environment. Additional info: What restrictions are imposed on an EJB? That is, what can't an EJB do?. Comments and alternative answers
Socket and ServerSocket Author: Pavan Keely (http://www.jguru.com/guru/viewbio.jsp?EID=1029086), Nov 22, 2002 Does JDMK use ServerSocket ??? If yes, then you can not use that API. But if JDMK uses only Sockets (not ServerSockets) then you can use that. Why there is no getEJBMetaData() function in EJBLocalHome? Location: http://www.jguru.com/faq/view.jsp?EID=1006407 Created: Oct 1, 2002 Author: jaivir singh (http://www.jguru.com/guru/viewbio.jsp?EID=219831) Question originally posed by Mohammad Rizwan (http://www.jguru.com/guru/viewbio.jsp?EID=989793 Home interface is basically ment to define the methods that allow a remote client to create, find, and remove EJB objects, as well as home business methods that are not specific to a bean instance. Where as EJBMetaData interface is intended for development tools used for building applications that use deployed enterprise Beans, and for clients using a scripting language to access the enterprise Bean, and that is why its has methods like getHomeInterfaceClass() getRemoteInterfaceClass() isSession() ...etc that provide info regarding there classes and types etc. Hence providing meta-data info is not in scope of home interface and thus it does not have any methods like getMetadataInfo(). Comments and alternative answers
Reasonable answer Author: Arun Thomas (http://www.jguru.com/guru/viewbio.jsp?EID=1084056), May 12, 2003 I'm quite confused by this response to the question regarding why EJBMetaData is not accessible from the EJBLocalHome. As far as I can see, the response gives a reason why home interfaces in general do not provide any metadata information. While the argument may have merit, it certainly is not the pattern or the logic followed by the spec writers, as the remote HOME interface does have an accessor for the EJBMetaData.
Re: Reasonable answer Author: Tomcy John (http://www.jguru.com/guru/viewbio.jsp?EID=1078595), Jun 10, 2004 getEJBMetaData() is used to get a sort of interrogation into the bean as a whole...in the case of local bean since it exists in the same heap in a JVM....we can use java reflection to get the various details about the bean...thats the reason we dont have getEJBMetaData() method in the case of local beans..... Hope it helps... Tomcy John When should I adopt BMP and when I should use CMP? Can I use both of them? Location: http://www.jguru.com/faq/view.jsp?EID=1020896 Created: Nov 3, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by sundarv varadarajan (http://www.jguru.com/guru/viewbio.jsp?EID=29816 Hi, Well, the quick answer to your second question is "Yes". You can use CMP and BMP beans in the same application... obviously, a bean can be BMP or CMP, not both at the same time (they are mutually exclusive). The answer to your first question cannot be easy at all. There are so many players in the game that is almost impossible provides a complete and always-valid answer. As somebody else has said in some threads or other FAQs (i.e.: Should I use CMP or BMP for an application with complex data manipulation & relations>) there is a common approach that is normally used and considered a good one. You should start developing CMP beans, unless you require some kind of special bean, like multi-tables, that cannot be completely realized with a single bean. Then, when you realize that you need something more or that you would prefer handling the persistence (performanbce issue are the most common reason), you can change the bean from a CMP to a BMP. Take also a look to this faq: Is there a difference between container managed and bean managed persistence in terms of performance? How can I use Connection Pool? Location: http://www.jguru.com/faq/view.jsp?EID=1020897 Created: Nov 3, 2002 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by Belgundi Abhijit (http://www.jguru.com/guru/viewbio.jsp?EID=46545 Additional info: I am using Oracle 9ias server. I have given max-connections to 50 in datasources.xml file. And the class i am using is "oracle.jdbc.pool.OracleConnectionCacheImpl". I have also tried with
OracleConnectionPoolDataSource class in data-sources.xml. But i feel that connection pool is not utilised, because in the middle of the retrieval, the server hangs as there will no be connections left for opening... In entity beans, I have created connections in setEntityContext and releasing them in unsetEntityContext... Do not get the connection in the setEntityContext. Get the connection only when you need it. If you get the connection in setEntityContext with the pool of 50 connections and you retrieve 50 different entity beans each bean will hang on to the connection and you will hang. So, get the connection when you need it and release the connection as soon as you have no need for it any longer. There is no reason to get the connection in setEntityContext. Comments and alternative answers
database connection Author: P Manchanda (http://www.jguru.com/guru/viewbio.jsp?EID=344357), Feb 28, 2003 you should get the database connection in the ejbActivate() method and release it in the ejbPassivate() method. Hope this makes sense. What is the best way to generate a universally unique object ID? Do I need to use an external resource like a file or database, or can I do it all in memory? Location: http://www.jguru.com/faq/view.jsp?EID=1030397 Created: Nov 25, 2002 Modified: 2003-02-28 08:01:34.258 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Andy Brown (http://www.jguru.com/guru/viewbio.jsp?EID=1027054 [I need to generate unique id's that will be used for node 'ID' attribute values within XML documents. This id must be unique system-wide. The generator must be available to a number of servlets that add various node structures to my XML docs as a service. What is the best way to tackle this? The 'possible' ways I can see: • • •
Keep the maximum ID value in a flat-file where the service would read it upon start-up and increment it. Upon shutdown or failure, it would write the latest max id to the file. Calculate the max id by searching the XML itself. This will be tougher since XML requires an alpha-numeric value (not strictly numeric). Use a database (MySQL) with a two-field table where one field is the incremental counter.
I just have this feeling that none of the above are the most efficient ways of doing this. Regards, -Andy]
There is an additional way to do that that doesn't rely on an external file (or database) like the one you have presentred. If has been presented in the EJB Design Patterns book, written by Floyd Marinescu, and available in a pdf format for free from the given link. The suggested solution is based on the UUID for EJB pattern, that comes out from this question: How can universally unique primary keys can be generated in menory without requiring a database or a singleton? Without enetring in the specifics (you can fully check out the pattern by reading the appropriate chapter), the solution is to generate a 32 digit key, encoded in hexadecimal composed as follows: 1: Unique down to the millisecond. Digits 1-8 are are the hex encoded lower 32 bits of the System.currentTimeMillis() call. 2: Unique across a cluster. Digits 9-16 are the encoded representation of the 32 bit integer of the underlying IP address. 3: Unique down to the object in a JVM. Digits 17-24 are the hex representation of the call to System.identityHashCode(), which is guaranteed to return distinct integers for distinct objects within a JVM. 4: Unique within an object within a millisecond. Finally digits 25-32 represent a random 32 bit integer generated on every method call using the cryptographically strong java.security.SecureRandom class. [See also the following FAQs: • • • •
I need to generate a GUID and have seen suggestions about using an RMI server but nothing about how to actually generate the GUID itself. What is the best way to provide a unique identifier as a primary key that will work in a database independent manner? I'm looking for functionality similar to Oracle's proprietary MY_SEQ.NEXTVAL. How do I automatically generate primary keys? and the original thread: What is the best way to implement a system-wide object ID generator?
- Alex Chaffee] Comments and alternative answers
Random class Author: P Manchanda (http://www.jguru.com/guru/viewbio.jsp?EID=344357), Feb 28, 2003 Hi, Try using the java.util.Random class to generate random numbers that can be used as IDs.
Re: Random class Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727), Feb 28, 2003 Hi, java.util.Random will generate random numbers, not unique numbers. Re[2]: Random class Author: Prashanth Nandavanam (http://www.jguru.com/guru/viewbio.jsp?EID=818802), Apr 24, 2003 Look at the JUG class by Tatu Saloranta: http://www.doomdark.org/doomdark/proj/jug/index.html It is based on the IETF UUID drafts, and works wonderfully. Re: Random class Author: Nathan Ciliberto (http://www.jguru.com/guru/viewbio.jsp?EID=1139136), Jan 14, 2004 You can also use some built-in java classes: java.rmi.server.UID or java.rmi.dgc.VMID
I'm guessing the UID class is the one you want though. (BTW,you don't need to use rmi nor know anything about rmi to use these classes) -Nathan Making it Faster Author: Kimbo Mundy (http://www.jguru.com/guru/viewbio.jsp?EID=1120338), Oct 8, 2003 It seems to me that you could speed up the algorithm above by modifying step #4. Instead of computing the random number every time, just compute it the first time, and then increment it after that. 2 different JVMs should still just have a 1 in 4 billion chance of overlap. Re: Making it Faster Author: Scott Carlson (http://www.jguru.com/guru/viewbio.jsp?EID=1085622), Oct 8, 2003 There are two reasons to use the random number instead of incrementing your last. 1. The number would be predictable and, depending on what this is used for, you could be opening up a potential security issue. This is why ProcessIDs are randomized on some OSes (AIX for one). 2. You must synchronize on that counter to guarantee that your number isn't reused. Your random number generator need not be synchronized, (though its implementation may be). There are Three possible ways Author: Narayana Prasad (http://www.jguru.com/guru/viewbio.jsp?EID=1142103),
Jan 29, 2004 1) If ur using Oracle You can create a sequence ,by which u can generate unique primary key or universal primary key. 2) U can generate by using random nunmbers but u may have to check the range and check for unique id. ie random number generate 0.0 to 1.0 u may have to make some logic which suits ur unique id 3) Set the maximum value into an XML file and read that file at the time of loding ur application from xml . thanks and regards prasad UUID and Random IDs Author: Wesley Theobalds (http://www.jguru.com/guru/viewbio.jsp?EID=1165144), Apr 22, 2004 Hi, I've just finished implementing the Sequence Block pattern a la Marinescu using a Session bean and an entity bean representing the sequence, and its working well. Using a UUID makes life harder for any Data analysis further down the line, having to enter a 32 bit number for the key for any ad hoc SQL queries you may need to write, and I've often found it helpful to have an incremental key as it indicates when the record was created in the absence of a timestamp. hashcode isn't unique Author: x x (http://www.jguru.com/guru/viewbio.jsp?EID=1174058), May 27, 2004 > System.identityHashCode(), which is guaranteed to return > distinct integers for distinct objects within a JVM. Sorry, but it isn't true. See http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4990451 Tomas Millisecond overlap Author: Thomas Paré (http://www.jguru.com/guru/viewbio.jsp?EID=1238395), Apr 14, 2005 Thanks for the very interesting pointer on 'Ejb design patterns'. I've read the implementation details and found something troublesome. In step 1 : "Unique down to the millisecond. Digits 1-8 are are the hex encoded lower 32 bits of the System.currentTimeMillis() call". Only the lower 32 bits of time are considered, which makes the uniqueness of that part only valuable for a period of 50 days. Looks like a serious issue.
Extremely Slow Finder Query My Finder query is extremly slow. After reviewing the Log files, it appears that the Bean is making an initial query to the database and then a separate query for each subsequent rows. Is there any way to get the Collection at once? Location: http://www.jguru.com/faq/view.jsp?EID=1035228 Created: Dec 7, 2002 Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589)
Question originally posed by Andy Doerr (http://www.jguru.com/guru/viewbio.jsp?EID=1025392 Congratulations! You've just described the infamous n+1 entity bean problem. Let me explain what's happening. First, your application container is querying the database and retrieving the keys to all of the rows that match the WHERE clause. Second, for each matching row, it is taking an entity bean instance from the pool and assigning the key to it. When you call the getXXX() on the entity bean, the entity bean is fetching all the field values from the row it represents. So if your query found 15 rows, the "n" value is 15 and represents the getXXX() methods you will call on your 15 entity beans. The +1 is the initial query on the database. You will have a total of 16 database dips. By now, you're probably disgusted with entity beans. However, consider this: entity beans cut down the amount of code dramatically. You avoid having to write JDBC (except in special cases) and reduce the amount of bugs you generate. I'm not trying to over dramatize this but our team just spent days fixing tons of JDBC code which had no close statements on result sets and JDBC connections. This caused our application to crash. Some application containers have something called field groups which allow you to group fields together. If, for example, you have a field named XXX in the same group as the key field, calling getXXX() on the entity bean will avoid a second database dip because XXX will have already been read in with the initial query. Comments and alternative answers
There is very little justification for the Entity Bean Specification Author: Jonathan Felch (http://www.jguru.com/guru/viewbio.jsp?EID=1035703), Dec 9, 2002 Developing an generalized object persistance scheme has been one of the holy grails of OOP. The CORBA Object Persistance spec, numerous object database products, and the Entity Bean specification are all attempts to allow the object model to map to a relational database without any effort or coding. The EJB Entity Bean specification is likely to doom any truely robust application for the following reasons: 1) Application Servers and EJB Servers are designed to yield high-performance responses to distributed requests, to dynamically generally web pages, and to provide business logic to a larger number of concurrent clients quickly. The very nature of mapping an instance of a class to a database entry is very expensive and must mirror the state of the backend database. Generally, in a serious production environment, the Entity beans be shared (or worse re-created) across a number of application servers on a farm. Now, the state of the object (or database entity) has to be maintained (or at least marked as dirty) in two (or more) places. This by definition limits that scalability of the application. My Advise: Learn the JDBC API. It is simple. Let's the database
manage concurrency. Keep state in one place. If this is impossible, use a write-through cache only for those queries that need it and work to seperate read-only from read-write data. 2.) An object tree or graph or map can take on any data model the programmer can imagine. Not all of these will map well to a relational model. My writing the JDBC explicitly, you must consider the painful aspects of object-to-relational modeling. Painful, yes, but not very hard. You will have much better performance. 3.) Even for those app servers with the best mechanism for marked "dirty" objects, high performance systems will change the state of an object or entity quickly and often. Unless these are implemented as a two-phase committ, the state of an object's "dirtiness" will have some (slight) delay with respect to the database itself. If it is implemented as a two-phase committ this get very expensive very fast. If your application is displaying the family photo album, fine. If you are dealing with money over a farm of multiple EJB servers, you will not be able to maintain transactional consistancy. Not appropriate for business. 4.) The Entity Bean 2.0 specification with dynamic loading of foreign keys and cascading updates / deletes is a nightmere. It is a perfect example of why people try (the same approach)to solving object persistance once and for all and almost always fail. Just an opinion, Jonathan n+1 entity bean problem Author: Manoj Krishnan (http://www.jguru.com/guru/viewbio.jsp?EID=1089665), May 30, 2003 I would like to know whether this n+1 entity problem is associated with EJB 2.0 also. Has the introduction of local interfaces solved this problem? Thanks in advance Regards Manoj In a Session Bean, is opening database connection through resource reference the only way to go? I find it very hard. Are there alternatives? Location: http://www.jguru.com/faq/view.jsp?EID=1036883 Created: Dec 11, 2002 Author: Bozidar Dangubic (http://www.jguru.com/guru/viewbio.jsp?EID=433955) Question originally posed by Mark Joshua (http://www.jguru.com/guru/viewbio.jsp?EID=883609
It is not very hard to use resource reference. Just declare the resource reference in your ejb-jar.xml file and you are ready to go. The alternative would be to package the JDBC driver that is required to connect to the database inside your jar file along with the Session EJB and then to load the driver and get a connection from the DriverManager. This is really not a way to go. There is nothing in the spec that will prohibit this kind of programming but it is really a horrible way of doing things. In addition, it is much harder than it would be to simply create a resource reference to your data source and get a connection that way. Comments and alternative answers
Alternative to get Databse connection Author: Sachin Popli (http://www.jguru.com/guru/viewbio.jsp?EID=1172707), Jun 6, 2004 Another alternative is, we can define the Database resources in app server and we can do the lookup of the datasource we want using it's nickname with which we have registred datasource in app server. //Form the default contect object Context ctx = new InitialContext(); //Lookup datasource from app server using ctx object DataSource ds = ctx.lookup("myDS"); //Get the connection from data source Connection conn = ds.getConnection(); //rest of the code ---What is the diffrence between ejbCreate() and ejbPostCreate() in EntityBean? Location: http://www.jguru.com/faq/view.jsp?EID=1036904 Created: Dec 11, 2002 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by SaraswatiBhatla Chakradhar (http://www.jguru.com/guru/viewbio.jsp?EID=998739 ejbCreate() is called before the state of the bean is written to the persistence storage (database). After this method is completed, a new record (based on the persistence fields) is created and written. If the Entity EJB is BMP, then this method must contain the code for writing the new record to the persistence storage. If you are developing an EJB following 2.0 specs, you can have overloading methods in the form of ejbCreateXXX(). This will improve the development so you can have different behaviour for creating a bean, if the parameters differs. The only requirement is that for each ejbCreateXXX() you need to have corrisponding createXXX() methods in the home or local interface.
ejbPostCreate() is called after the bean has been written to the database and the bean data has been assigned to an EJB object, so when the bean is available. In an CMP Entity EJB, this method is normally used to manage the beans' containermanaged relationship fields. Comments and alternative answers
ejbCreate(), ejbPostCreate() Author: Sheikh Azad (http://www.jguru.com/guru/viewbio.jsp?EID=967553), Mar 9, 2003 In short:Primary Key is available only after execution of ejbPostCreate(),not after the ejbCreate(). :) Re: ejbCreate(), ejbPostCreate() Author: deepak jairath (http://www.jguru.com/guru/viewbio.jsp?EID=1138414), Jan 12, 2004 I think u have the primary key in the ejbPostCreate().Pimary key is created once the ejbCreate() finishes executing. Re: ejbCreate(), ejbPostCreate() Author: san re (http://www.jguru.com/guru/viewbio.jsp?EID=1255630), Jul 29, 2005 u stupid wts this Record is inserted after ejbStore() not after ejbCreate() Author: Deepak Kalra (http://www.jguru.com/guru/viewbio.jsp?EID=1152019), Mar 8, 2004 Hi, I am not agree with this statement that "ejbCreate() is called before the state of the bean is written to the persistence storage (database). After this method is completed, a new record (based on the persistence fields) is created and written." Life cycle of entity bean works this way. When the client calls the craete method on entity home interface, Container calls the ejbCreate() and ejbPostCreate() method and that time Container associate the bean instance with Entity Object and moved the bean instance from Pooled State to Ready State. So That time no record is inserted in the database Only bean instance is associated with Entity Object. After this Container calls the ejbStore method to synchronize the bean instance with database so It writes the bean instance to database. This way the container calls the method in this sequence ejbCreate() ejbPostCreate() ejbStore() This is what I am able to figure it out. Please correct me If I am wrong
Thanks Deepak ejbPostCreate Author: Manoj Dhanji (http://www.jguru.com/guru/viewbio.jsp?EID=1153157), Mar 10, 2004 "ejbPostCreate() is called after the bean has been written to the database and the bean data has been assigned to an EJB object, so when the bean is available." The explanation above is really good. I would like to extend it a bit. ejbPostCreate() is called after the bean has been written to the database (record inserted) and the bean data has been assigned to the bean's proxy EJBObject. You have the primary key available after ejbCreate and a reference to the bean's proxy. It is between ejbCreate and ejbPostCreate that the bean's proxy EJBObject is created. Re: ejbPostCreate Author: Sachin Popli (http://www.jguru.com/guru/viewbio.jsp?EID=1172707), Jun 6, 2004 My doubt is, if we are doing ejbCreate() then that means we are inserting new set of data in DB. Then where does question of bringing bean instance in synch with DB arises when the data does not exist in DB at first instance. So why should ejbStore() be called for that. Shouldn't it be ejbCreate(), ejbPostCreate() first time. Later on in life cycle of entity bean to bring in memory object state in synch with db state ejbStore can be called by container. (I am new to EJB concepts,so please excuse my ignorance about the subject)-Thanks Is there some kind of Design pattern which would make it possible to use the Same code base in EJB and non EJB context? Location: http://www.jguru.com/faq/view.jsp?EID=1050393 Created: Jan 26, 2003 Author: Jan Matèrne (http://www.jguru.com/guru/viewbio.jsp?EID=567992) Question originally posed by Sandeep Shilawat (http://www.jguru.com/guru/viewbio.jsp?EID=1017906 A good suggestion would be using Delegation class PieceOfCode { public Object myMethod() {} } class EJBImpl ... { PieceOfCode poc = new PieceOfCode(); public Object myMethod() { return poc.myMethod(); }
} This should not be a violation of EJB specs, since EJBs can use simple java classes for their use. Think about Dependant Objects and so on. Comments and alternative answers
ejb Author: madhavi latha (http://www.jguru.com/guru/viewbio.jsp?EID=1194493), Aug 20, 2004 what happened when the data is updated if the object is in the passivated state? means data is commited or rollbacked? Use EJB Wrappers on normal non EJB classes Author: hari p (http://www.jguru.com/guru/viewbio.jsp?EID=1223056), Jan 24, 2005 Define and implement all your methods in a Manager class. This way you can test your code in non EJB context. You can use the same code base just by wrapping them in a BeanManager class, where in you instantiate the Manager class call the methods on it from inside your bean methods. What is the default time for transaction manager? And how to set maximum time(timeout) for transaction?. Location: http://www.jguru.com/faq/view.jsp?EID=1050395 Created: Jan 26, 2003 Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589) Question originally posed by venkata devi prasad kankanalapalli (http://www.jguru.com/guru/viewbio.jsp?EID=1034636 The default time depends on your app server. It is usually around 30 seconds. If you are using bean-managed transactions, you can set it like this: // One of the methods from the SessionBean interface public void setSessionContext(SessionContext context) throws EJBException { sessionContext = context; } // Then, when starting a new transaction UserTransaction userTransaction = sessionContext.getUserTransaction(); userTransaction.setTransactionTimeout(60); userTransaction.begin(); // do stuff userTransaction.commit(); If you are using container-managed transactions, this value is set in a app server specific way. Check your app server's deployment descriptor DTD. The Singleton pattern is not permitted by the J2EE spec, so How can I cache EJB home interfaces across EJBs in my application and avoid having each EJB get its own home interfaces? Location: http://www.jguru.com/faq/view.jsp?EID=1051835 Created: Jan 30, 2003
Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589) Question originally posed by Eric Snyder (http://www.jguru.com/guru/viewbio.jsp?EID=806379 This is one of those grey areas in the J2EE spec. Yes, it's true that theoretically, static objects (hence, singleton patterns) are not permitted. This is because you never know how many class loaders there are in your ejb container - unless you know the inner working of your container. Therefore, the singleton object will be unique in the class loader only. If there are multiple class loaders, your singleton object will exist more than once (1 instance per class loader). However, if you are ready to accept the fact that your ejb stub may be cached multiple times (as much as once in every class loader), the singleton pattern will still work. Ithe ejb container's responsibility to cache ejb stubs. However, some implementation of jndi are very slow to lookup. Repeatedly performing jndi lookups can actually slow down your app considerably. In fact, I have written that exact singleton class you are contemplating and this has increased performance. Anyway, those are the facts. It's up to you to decide if you want to remain "J2EE pure" or make a deal with the devil. ;-) [Alex: Also check the comments on this FAQ: Can a bean act as a singleton to provide logging and other services?] Comments and alternative answers
Use Static Class Author: Deepak Kalra (http://www.jguru.com/guru/viewbio.jsp?EID=1152019), Mar 10, 2004 Hi, Its possible to cache the EJB Home Object. You can create a static class and in the class you can define the method which will take the argument JNDI Name and Home interface class name.In the method you can use the MAP and check the JNDI name in Map, If JNDI name is not existing in the MAP, then lookup for the Home Object and then add that JNDI Name in the MAP. So when you come next time, you will able to find the JNDI name and Home Object Re: Use Static Class Author: Rajagopal Y (http://www.jguru.com/guru/viewbio.jsp?EID=1232914), Mar 16, 2005 Hi Deepak, But According to the EJB Spec We Can't use Static Fields / method / classes in our EJB. Right? How can you Suggest the Usage of Static Class? Regds Rajagopal Y Use Static Class - and synchronize it // PLEASE, DON'T DO! Author: Chris Duerr (http://www.jguru.com/guru/viewbio.jsp?EID=1234080), Mar 22, 2005 Somehow this will work. But you need to synchronize the get() of the map, for many bean instances will enter the get() of your static map-instance.
Synchronizing then may interfer with the containers work and you're left with exactly the singleton-problem. One solution is to initialize the map in the static initialization block of the class. Then the map is read only and there is no need to synchronize. In the case of home objects stored in a map there is still an open issue: is create...() and remove() threadsafe? I don't know about such a requirement in the ejb specification and would suggest to avoid caching of home objects. (Please, refer to my second comment for details.) Chris Investigate the problem thouroughly - maybe there isn't one. Author: Chris Duerr (http://www.jguru.com/guru/viewbio.jsp?EID=1234080), Mar 22, 2005 Orthogonal to the discussion how to implement (or simulate) a singleton in a container managed environment: is the performance decrease realy dramatic? What you're planning is to have one home instance in a static member of your bean class (and that's puzzling you). Well, containers are keen in keeping the numbers of beans as small as possible. This is where the concept of pooling for statefull session beans and entity beans comes from. A limited number of beans which are reused means a limited number of calls to the JNDI to get the home interfaces when you just store the reference in a member of the bean instance. Doing so means you can forget about the problems with mutable static fields, singleton-implementations and so on and I promise you: there isn't any scaling performance problem with that. chris Are there any tools for porting EJB Applications from one Application Server to another? Location: http://www.jguru.com/faq/view.jsp?EID=1051912 Created: Jan 30, 2003 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by GANESHAN KALEMBETH (http://www.jguru.com/guru/viewbio.jsp?EID=1005460 In theory, you should not need any tools for that task. If you have developed a fully compliant J2EE application, you will be able to deploy it on any Application Server that follows Sun J2EE Specifications. That is one of the biggest advantages of using standards and following the spceifications. Maybe, then, you will probably have to spend some time in tuning and fixing the configuration of the specific server. Comments and alternative answers
Porting from Weblogic to JBOSS Author: Alireza Taherkordi (http://www.jguru.com/guru/viewbio.jsp?EID=240974), Feb 11, 2003 if you consider porting from Weblogic to JBOSS from the following location you can download the tools:
http://www.jboss.org/services/bea-port.jsp Are there any tools for porting EJB Applications from one Application Server to another? Author: Nagarjun Chevula (http://www.jguru.com/guru/viewbio.jsp?EID=1059450), Feb 22, 2003 Usually the Application Server vendor should provide such tools if they are needed. EJB Applications are supposed to be portable across all application servers. This is based on the fact that you did not use any vendor specific classes while building your EJB application. If you did then your code becomes not-portable. You may have to do some configuration changes to the Datasources/JDBC drivers/JMS providers/ Security Roles etc to match what is in the new environment. Performance tuning is something that you have to do always while porting code to other application servers, Re: Are there any tools for porting EJB Applications from one Application Server to another? Author: Jeff Luszcz (http://www.jguru.com/guru/viewbio.jsp?EID=1091881), Jun 6, 2003 You should check out the Cacheon Migrator It's a rule based Java to Java transformation tool that comes with rule sets for App server to App server migration. Jeff Are there any tools for porting EJB Applications from one Application Server to another? Author: Paulo Noreña (http://www.jguru.com/guru/viewbio.jsp?EID=1113812), Sep 8, 2003 And what about the entity-relationship mapping descriptors in CMP? They are vendor specific then CMP is not a standard? How can I get the references of all active objects of a particular EJB class? Location: http://www.jguru.com/faq/view.jsp?EID=1059079 Created: Feb 21, 2003 Author: Vinay Salehithal (http://www.jguru.com/guru/viewbio.jsp?EID=1039322) Question originally posed by Angel Bata (http://www.jguru.com/guru/viewbio.jsp?EID=480237 Whats the intention behind doing this? What kind of EJB's are u talking about? In any case, I dont think such kind of functionality is provided ready made by any application server. Some may provide this as a additional feature in an application server monitoring console. At best, if an application server has any JMX hooks to do such kind of stuff, you may be able to utilize that. What are the differences of Container Managed Persitence 1.1 and 2.0 Location: http://www.jguru.com/faq/view.jsp?EID=1059871 Created: Feb 24, 2003
Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by RaviKiran Sristy (http://www.jguru.com/guru/viewbio.jsp?EID=1031174 The main difference is that in EJB 2.0, the persistence manager is responsible for mapping the entity bean to the database based on the newly introduced abstract persistence schema. In other words, you can say that the persistence manager handles persistence of your CMP entity beans at runtime. Plus, thanks to the EJB Query Language, the persistence manager is also responsible for implementing and executing find methods based on it. In the previous CMP EJB 1.1, is the developer that must declare the bean class' persistent fields as either Java primitive or serializable types, providing getters and setters for all of them. In CMP EJB 2.0, its persistent fields are not defined directly in the bean class, thanks to the new abstract persistent schema. This schema has been developed to allow the bean provider to declare the persistent fields (and bean relationships, eventually) indirectly. An interesting example can be found at Read all about EJB 2.0. Session Bean transactions. Why EJB 1.1 specs says that Session Beans can have BM or CM transaction, but not both in same bean? Location: http://www.jguru.com/faq/view.jsp?EID=1059876 Created: Feb 24, 2003 Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589) Question originally posed by Durgadatt kamath (http://www.jguru.com/guru/viewbio.jsp?EID=1034889 CMTs and BMTs are 2 different animals. Mixing them in the same bean would require the application container to potentially start a transaction at the beginning of the method while the BMT bean itself would start another. Things could get quickly get out of hand. Even mixing CMT beans and BMT beans in the same process flow can be tricky. For example, a BMT bean cannot participate in transactions started by a CMT bean (although the opposite is allowed). The real is question is why would you need to do this? Most of the time, you will use CMTs. BMTs are used in special circumstances where you need fine-grained transaction control. Comments and alternative answers
Session bean transaction? Author: Ramesh chanda (http://www.jguru.com/guru/viewbio.jsp?EID=1179809), Jun 18, 2004 Are session beans also use transaction management? Except by using SessionSynchronization interface.
What is session facade? Location: http://www.jguru.com/faq/view.jsp?EID=1060330 Created: Feb 25, 2003 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by sabu vs PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=476248 Session facade is one design pattern that is often used while developing enterprise applications. It is implemented as a higher level component (i.e.: Session EJB), and it contains all the iteractions between low level components (i.e.: Entity EJB). It then provides a single interface for the functionality of an application or part of it, and it decouples lower level components simplifying the design. Think of a bank situation, where you have someone that would like to transfer money from one account to another. In this type of scenario, the client has to check that the user is authorized, get the status of the two accounts, check that there are enough money on the first one, and then call the transfer. The entire transfer has to be done in a single transaction otherwise is something goes south, the situation has to be restored. As you can see, multiple server-side objects need to be accessed and possibly modified. Multiple fine-grained invocations of Entity (or even Session) Beans add the overhead of network calls, even multiple transaction. In other words, the risk is to have a solution that has a high network overhead, high coupling, poor reusability and mantainability. The best solution is then to wrap all the calls inside a Session Bean, so the clients will have a single point to access (that is the session bean) that will take care of handling all the rest. Obviously you need to be very careful when writing Session Facades, to avoid the abusing of it (often called "God-Bean"). For a detailed description of this pattern, check this page: Core J2EE Patterns - Session Facade or get Floyd Marinescu's EJB Design Patterns, in PDF format. What are the differences between EJB 1.1 and EJB 2.0? Location: http://www.jguru.com/faq/view.jsp?EID=1061674 Created: Feb 28, 2003 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by venugopal k (http://www.jguru.com/guru/viewbio.jsp?EID=1060133 There are many differences, all of them should give different type of advantages among the previous 1.1 version. •
New CMP Model. It is based on a new contract called the abstract persistence schema, that will allow to the container to handle the persistence automatically at runtime.
• • • •
EJB Query Language. It is a sql-based language that will allow the new persistence schema to implement and execute finder methods. Local interfaces. These are beans that can be used locally, that means by the same Java Virtual Machines, so they do not requires to be wrapped like remote beans, and arguments between those interfaces are passed directly. ejbHome methods. Entity beans can declare ejbHome methods that perform operations related to the EJB component but that are not specific to a bean instance. Message Driven Beans (MDB). Is a completely new enterprise bean type, that is designed specifically to handle incoming JMS messages.
I hope I haven't forgotten anything...
Comments and alternative answers
Differences between EJB1.1 and EJB2.0 Author: Sachin Popli (http://www.jguru.com/guru/viewbio.jsp?EID=1172707), Jun 6, 2004 Adding to the above mentioned differences; We also have ejbSelect in entity beans. This method is neither exposed by remote interface nor by home interface. It is called by ejbHome() internally to get access to data unrelated to entity bean instance. How to register a connection to a database with a JNDI name and use the JNDI name specified? Location: http://www.jguru.com/faq/view.jsp?EID=1061802 Created: Feb 28, 2003 Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589) Question originally posed by Arun Sista (http://www.jguru.com/guru/viewbio.jsp?EID=1060253 First, let's say that the way in which you do this will vary depending on whether you are using an Entity Bean or a Session Bean. The way in which you access your database from an Application Server is vendor specific. Usually, you define a connection by specifying a JDBCdriver in your Application Server's config file. You supply the driver along with a user/password to your database (although this too is database and driver specific). Once you've done this, your Application Server will automatically register the connection in JNDI and possibly create a pool of connections. With Entity Beans, you can define which connection you wish to use inside the deployment descriptor. With Session Beans using JDBC, you lookup the name of the connection you've configured with JNDI. Since much of this is really Application Server dependant, I recommend you look at sample code from your Application Server vendor. Vendors, in fact, usually include basic examples for stuff like this. Can JavaMail be used from a Message Driven Bean? The EJB specifictation requires that the bean implementation must be single-threaded. Isn't JavaMail multi-threaded? If so, can it be used from a Message Driver Bean?
Location: http://www.jguru.com/faq/view.jsp?EID=1063436 Created: Mar 5, 2003 Author: Jens Dibbern (http://www.jguru.com/guru/viewbio.jsp?EID=9896) Question originally posed by Shiv Kumar (http://www.jguru.com/guru/viewbio.jsp?EID=844764 You should configure a JavaMail resource for your EJB container and access it by JNDI. It works just like JavaMail in an application without setting up the connection first. You just get it from the JNDI tree. This should work for your MDB just like it workes for my stateless session bean Comments and alternative answers
JavaMail and Message Driven Bean Author: Ram V.L.T (http://www.jguru.com/guru/viewbio.jsp?EID=449849), Dec 17, 2004 Click Here for a good example of Working with the new Message Driven Beans and JMS How many EJB Objects are created for a Bean Location: http://www.jguru.com/faq/view.jsp?EID=1074301 Created: Apr 8, 2003 Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589) Question originally posed by Vinu Chandran (http://www.jguru.com/guru/viewbio.jsp?EID=1073703 There is absolutely no relationship between the amount of EJBObjects you create on the client side and the amount of bean instances that actually exist on the server side. When a client invokes a method on the stub, the container will look into the bean pool and see if there are any available bean instances that can satisfy that request. It will create more instances if all instances are currently being used by other clients. You can control the size of the pool thru the deployment descriptor. Comments and alternative answers
EJb objects? Author: saravanan Balasundaram (http://www.jguru.com/guru/viewbio.jsp?EID=1084714), May 14, 2003 Hey there is a strong relation ship between EJb objects and ur bean instance.Ofcourse both couple together to service a client request. One more important thing is that EJBobject is a vendor tool generated one.[By the container provider.]So its not mandatory that a EJB object should be created at the same time a bean instance is created.During passivation and activation a decoupling occurs when the Ejb object
decouples from a bean instance.
Re: EJb objects? Author: Ram V.L.T (http://www.jguru.com/guru/viewbio.jsp?EID=449849), Dec 17, 2004 Hey Balasundaram.. u urself has given a contradictory answer .. How is JDO different from VO ? Location: http://www.jguru.com/faq/view.jsp?EID=1078764 Created: Apr 23, 2003 Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589) Question originally posed by Prakash Venkataramani (http://www.jguru.com/guru/viewbio.jsp?EID=997244 JDO is a persistence technology that competes against entity beans in enterprise application development. It allows you to create POJOs (plain old java objects) and persist them to the database - letting JDO take care of the storage. Value objects, on the other hand, represent an abstract design pattern used in conjuction with entity beans, jdbc, and possibly even JDO to overcome commonly found isolation and transactional problems in enterprise apps. Value objects alone do not allow you to persist objects - they are simple data holders used to transfer data from the database to the client and back to the database. Side note: I know that many books out there still refer to these data holders as value objects but the correct term is DTO: data transfer objects. Value objects refer to objects that hold a value. A good example of this java.lang.Integer object which holds an int. Comments and alternative answers
How is JDO different from VO ? Author: Ram V.L.T (http://www.jguru.com/guru/viewbio.jsp?EID=449849), Dec 17, 2004 In short we can say that JDO = EntityBean + VO why we use home interface in EJB. In RMI we dont have any concept like home interface.why we particularly go for Home Interface Both RMI and EJB are distributed applications. In EJB we use Home interface which is not avaliable in RMI. There must be several reasons for using Home Interface of EJB. can any one give reason for this? Location: http://www.jguru.com/faq/view.jsp?EID=1081979 Created: May 5, 2003 Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589)
Question originally posed by vishnu rajan t k (http://www.jguru.com/guru/viewbio.jsp?EID=1075172 By posing this question, you seem to be comparing RMI and EJB as if they were the same type of technology and they are definately not. RMI is a lower level technology that allows java objects to be distributed across multiple JVMs. Essentially, RMI abstracts sockets and inter-JVM communications. EJB, on the other hand, is a technology built atop of RMI but does so much more than allow java objects to be distributed. It is a framework that allows you to build enterprise applications by (among other things) abstracting transactions, database access and concurent processing. Having said this, the answer to your question is the following. The home interface is EJB's way of creating an object. Home interfaces act as factories to create session beans and entity beans. These factories are provided by the application container and take care of many low level details. Since RMI is a lower level technology, it does not offer the home interface. You would have to create it yourself. Comments and alternative answers
more EJB/RMI Author: Laurent Mihalkovic (http://www.jguru.com/guru/viewbio.jsp?EID=407112), Jun 8, 2003 couple things... Although EJB originally started as a technology for remoting, and therefore made use of RMI for containers implementations, the technology has now outgrown its original intent. The introduction of local interfaces geve EJBs a boost for situations where remoting was not necessary, leading to faster intra-VM calls. In view of this departure form the remoting nature of EJBs, I do believe that the real defining feature of EJBs is the life cycle management provided by the application server. In recent years, the JVM itself has received many improvements in the area of memory management and garbage collection. Sun and IBM have both studied carefully the usage patterns on the servers and built agressive optimization strategies. Marc Fleury (the vibrant voice behind JBoss) recently published an interesting white paper about the optimizations built into modern EJB containers, as well as an interesting view (I happen to share it) that with the flexibility introduced by CMP 2.0, EJB containers are rapidly becoming elaborate caches. These caches keep the raw database data in a format directly usable by Java code, taking care of synchronizing memory and database when necessary. The paper is really interesting, and it gived an interesting glimpse at what modern technilogy based on dynamic class instrumentation has in store for the future of EJB containers.
cheers, laurent just want to add Author: Shashank B (http://www.jguru.com/guru/viewbio.jsp?EID=1134131), Dec 16, 2003 RMI is basically used to serve the distributed object same as EJB...but the main difference is RMI serves only one object which is registered with RMI registry.No creation of object takes place..whereas in EJB we use the object from factory/pool.. TO get the EJBObjectref we call the create method which requires home interface because of EJB Object Author: Deepak Kalra (http://www.jguru.com/guru/viewbio.jsp?EID=1152019), Mar 10, 2004 Well We Know Client invokes the method on EJB Object rather than on actual bean instance. Now to get the reference of EJB Object, Client use Home Object i.e. lookup the Home Object through JNDI. Now to give the reference of EJB Object, Home Object should know How to initialise the Object and Home Object Class is provided by the conatiner.So we write a Home interface in EJB to provide this information i.e. create method in home interface In RMI we do not have any concept of conatiner services and in EJB, container use the EJB Object to provide all the services like transacion, security etc. So this way we use Home interface in EJB, in order to get the reference of EJB object and container services Re:why we use home interface in EJB........ Author: Ram V.L.T (http://www.jguru.com/guru/viewbio.jsp?EID=449849), Jun 28, 2004 It can be said that EJB is an advacned version of RMI. RMI is used for method invocation. EJB is object invocation. i.e an instance of an object will be created and assinged to the client through which several business methods will be invoked. I have a related question Author: efrat n (http://www.jguru.com/guru/viewbio.jsp?EID=1205091), Oct 13, 2004 Why can't the creation of the ejb (create()) be called on the server side? instead we have to make 2 remote calls - one to get the home stub, and one to call "create". Instead, this could be implemented on the server - our lookup could do the lookup+create on the server side, and return with the ejb object - why do we need the 2 separate steps? do we ever use the home stub for anything but "create" (or find)??? Thanks
Re: I have a related question Author: Praveen Dunna (http://www.jguru.com/guru/viewbio.jsp?EID=142919), Oct 18, 2004 In the case of entity beans , find methods are used apart from create. So lookup need to be seperated from creation. In the case of session beans creation is a must. To be more meaningful and generic, I think the authors of the EJB specification seperated the Creation from Lookup What's difference between Servlet/JSP session and EJB session? Location: http://www.jguru.com/faq/view.jsp?EID=1082544 Created: May 7, 2003 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by guru prasanth PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=847725 From a logical point of view, a Servlet/JSP session is similar to an EJB session. Using a session, in fact, a client can connect to a server and maintain his state. But, is important to understand, that the session is maintained in different ways and, in theory, for different scopes. A session in a Servlet, is maintained by the Servlet Container through the HttpSession object, that is acquired through the request object. You cannot really instantiate a new HttpSession object, and it doesn't contains any business logic, but is more of a place where to store objects. A session in EJB is maintained using the SessionBeans. You design beans that can contain business logic, and that can be used by the clients. You have two different session beans: Stateful and Stateless. The first one is somehow connected with a single client. It maintains the state for that client, can be used only by that client and when the client "dies" then the session bean is "lost". A Stateless Session Bean doesn't maintain any state and there is no guarantee that the same client will use the same stateless bean, even for two calls one after the other. The lifecycle of a Stateless Session EJB is slightly different from the one of a Stateful Session EJB. Is EJB Container's responsability to take care of knowing exactly how to track each session and redirect the request from a client to the correct instance of a Session Bean. The way this is done is vendor dependant, and is part of the contract. Comments and alternative answers
which will be of high performance,maintaining the session in http/jsp or EJB. Author: munish kumar (http://www.jguru.com/guru/viewbio.jsp?EID=1101096), Jul 14, 2003 if we simply have to place the objects required in session , then which will be faster.As we have to implement the scrolling in the pages.I think that accessing the object from http/jsp session will be faster then the EJB session. Am i right pls let me
know. Thanks. Munish Re: which will be of high performance,maintaining the session in http/jsp or EJB. Author: Nanda Kumar (http://www.jguru.com/guru/viewbio.jsp?EID=1116828), Sep 22, 2003 Hi, I have one question regarding this... If Httpsession Object is Expired, what will happen Stateless or Stateful session bean ??? Any idea. Thanks in advance, Nanda Re[2]: If Httpsession Object is Expired, what will happen Stateless or Stateful session bean Author: Sergey Pomytkin (http://www.jguru.com/guru/viewbio.jsp?EID=1045816), Oct 29, 2003 With Stateless - nothing, once it done with your method invocation it's don't care about you. About satefull it’s up to particular app sever implementation/configuration .. Chances are if you hold reference to it in httpsession and it’s get expired (= user will never be able to release this EJB) server eventually will recycle this instance Re[2]: which will be of high performance,maintaining the session in http/jsp or EJB. Author: Ram V.L.T (http://www.jguru.com/guru/viewbio.jsp?EID=449849), Jun 28, 2004 If Httpsession is expired irrespective of the type of the bean all the references stored in the Httpsession will be lost. Re: which will be of high performance,maintaining the session in http/jsp or EJB. Author: Murthy VVVS (http://www.jguru.com/guru/viewbio.jsp?EID=1243697), May 11, 2005 It is more of design issue rather than performance. The concept/scope of both HTTPSession and EJB Session Bean are different from each other. What if ? Author: rachna chadha (http://www.jguru.com/guru/viewbio.jsp?EID=1077370), Oct 8, 2003 I have seen that many times JSP session is still there but session bean's session expires ? Is there any way to manage this problem ? Re: What if ? Author: Bill Schnellinger (http://www.jguru.com/guru/viewbio.jsp?EID=1120424), Oct 8, 2003 you have to match the <session-timeout> in your web.xml with the statefull session timeout parameter in your application servers xml file. For example, weblogic-ejb-jar.xml has a <stateful-session-descriptor>
<stateful-session-cache> <max-beans-in-cache>100 0
entry. In JBoss you will have to look at standardjboss.xml and http://www.jboss.org/j2ee/dtd/jboss_3_0.dtd and for others, you will have to look at that containers documentation to see how to set that. hope that helps An Alternative Description Author: vimarsh vasavada (http://www.jguru.com/guru/viewbio.jsp?EID=972756), Oct 8, 2003 The earlier explaination has cleared my clouds.Representing in different way . Container View Point : 1. Servlet Container A HttpServlet.service() represents a client thread. A logical session is maintaied per such different client threads.The container manages the association rather then the Servlet.Hence Servlet from the pool of servlet instances are reusable for different threads and can be swaped in between client threads.This is why Servlet Instance variable are not thread-safe. 2. EJB Container : Stateful Session Bean. The Stateful Session Bean LOGICALLY is a "client thread with State".This thread can be Activated/Passivated as per the situation.But during this activation/passivation essentially the state is saved plus anything else instructed by the bean developer in respective methods. In other words the state mangement control is available to Bean developer also.This is what missing in servlet.In other words for Stateful Session Bean instance variable are thread safe. Designers Perspective : 1. Servlet Helps the session management but the servlet developer needs to invoke SessionManagement API to read/write.
Right candidate for UserInfo,AuthInfo etc. 2.SFB A well designed component for the stateful processes. An object state is automaticaly managed by container.Threadsaftey is guranteed.Developer need not to bother.Right candidate for Order/Shopping Process. Performance wise it is a FEELING that SFB are slower then simple http sessions.Hence needs to be used with care. which is the best way to pass the value from one screen to another either hiddenor session Author: lekoria martin (http://www.jguru.com/guru/viewbio.jsp?EID=1124801), Oct 30, 2003 According to theory concept says, session is best way to pass the the value from one screen to another since there is no limitation in session. what i feel is if u keep so many data in session will it affect the network. all the session is going to be in memory in application server only know. pls suggest me when to use hidden, cookie, session. Re: which is the best way to pass the value from one screen to another either hiddenor session Author: Kimbo Mundy (http://www.jguru.com/guru/viewbio.jsp?EID=1120338), Nov 15, 2003 Perhaps it's obvious, but don't forget about the simplest way of passing state: For small bits of data, like the page # in a list of search results, just use a parameter in the URL. Re[2]: which is the best way to pass the value from one screen to another either hiddenor session Author: sridhar Tirumala (http://www.jguru.com/guru/viewbio.jsp?EID=1139770), Jan 18, 2004 URL rewriting gives moderate performance because the data has to pass between the client and server for every request but there is a limitation on amount of data that can pass through URL rewriting. It gives moderate performance because of overhead involved on the network for passing data on every request. But session object mechanism gives better performance because it stores the session data in memory and reduces overhead on network. Only session id will be passed between client and server. But it does not scale well up on increasing session data and concurrent users because of increase in memory overhead and also increase in overhead on garbage collection. There choosing the session mechanism out of one of the above approaches not only depends on performance but also depends on scaling and security factor . The
best approach to maintain a balance between performance, scalability and security. Mixture of session mechanism and Hidden fields gives both performance and scalability. By putting secure data in session and non secure data in hidden fields you can achieve better security Re[3]: which is the best way to pass the value from one screen to another either hiddenor session Author: Bill Bruns (http://www.jguru.com/guru/viewbio.jsp?EID=1150451), Mar 1, 2004 Isn't it true that there are circumstances where the session variables cannot be used? In other words, that some items must be passed by means of URL rewriting because they are being changed by javaScript code instead of JSP code. The difference is that javaScript executes on the client but JSP exectues on the server. For example, consider a page that asks if the user is a man or a woman, and has a dropdown list that changes depending on if a man or a woman is choosing (clothing types: blouse versus shirt). The dropdown list might only change at the client, not at the server. But the session variables only exist at the server. In this case, the data can only be passed by URL parameters. Unless someone knows of a way to use javaScript to change items at the server, without using parameter passing (aka, URL rewriting)? Bill Re[4]: which is the best way to pass the value from one screen to another either hiddenor session Author: Shrinivas Vadavadagi (http://www.jguru.com/guru/viewbio.jsp?EID=1170700), May 17, 2004 You can give the same name in the form, so that you can recognise what the user has selected. Hence what ever you can do in URL re-writing can be done through the session management. But there is a limitation in this as this is no scalable. One study suggests that one can store upto 3K of data in the session after whicg there will be drop in the performance. Hence should store the data in the session which are necessary and clear the session data, if not necessary. Re[5]: which is the best way to pass the value from one screen to another either hiddenor session Author: sathish kumar (http://www.jguru.com/guru/viewbio.jsp?EID=1185907), Jul 18, 2004 i AM ACCEPTING ANY FIVE DIFFERENCE BETWEEN THEM.PLEASE IF ANY ONE FOR THIS...
What are the additional features of EJB 2.1 over EJB 2.0 Location: http://www.jguru.com/faq/view.jsp?EID=1083000 Created: May 8, 2003 Modified: 2003-12-01 07:24:14.337 Author: Alessandro A. Garbagnati (http://www.jguru.com/guru/viewbio.jsp?EID=32727) Question originally posed by Thrihesh Rai (http://www.jguru.com/guru/viewbio.jsp?EID=1080402 Compared to the 2.0 specifications, EJB 2.1 have focused the attention in trying to be more "web-services" oriented, and with the improving of some important features where the community have found some design or implementation issue, like the Query Language, the addition of a Timer service, and other improvement like Message-Driven Beans. Everybody has noticed that the biggest addition in EJB 2.1 is the new support for the Web-Services technology. With this new specifications, in fact, developers can expose their Stateless Session and Message-Driven EJBs as Web Services based on SOAP. This will mean that any client that complies with SOAP 1.1 will be able to access to the exposed EJBs. The APIs that will allow this and that have been added, are JAXM and JAX-RPC. The first one, JAX-RPC, stands for Java API for XML-RPC, and it can be considered as Java RMI, but unsing SOAP as the protocol. The second one, JAXM, stands for Java API for XML Messaging, and it is a SOAP messaging API similar to JMS (Java Message Service). JAXM is an API for sending and receiving messages via Web services, conceptually similar to JMS that is an API for sending and receiving messages via message-oriented middleware. Another addition is the Timer Service, that can be seen as a scheduling built right inside the EJB Container. With EJB 2.1, any Stateless Session or Entity Bean can register itself with the Timer Service, requesting a notification or when a given timeframe has elapsed, or at a specific point in time. From a developer point of view, the Timer Service uses a very simple programming model based on the implementation of the TimedObject interface. From the enhancement side, the Query Language is definitely the topic where the improvements are definitely more visible. The ORDER BY clause has finally been added. This will improve performance on orederd queries, because this will be handled by the underneath database, and not through the code by sorting the resulting collection. The WHERE clause has been improved with the addition of MOD, while the SELECT clause has been improved by adding aggregate functions, like COUNT, SUM, AVG, MIN and MAX. Other enhancements can be noticed on the Message-Driven Beans or the Destination Linking. Additional information can be found at the Enterprise JavaBeans official page at Sun. Synchronization of Stateless Session bean instances. Is there anyway by which we can update/modify (not on server start up but at actual application run time) value of instance variables of ll stateless session bean instances present in the pool??
Location: http://www.jguru.com/faq/view.jsp?EID=1096326 Created: Jun 23, 2003 Author: Nick Maiorano (http://www.jguru.com/guru/viewbio.jsp?EID=780589) Question originally posed by Sheikh Azad PREMIUM (http://www.jguru.com/guru/viewbio.jsp?EID=967553 Additional Note This is something related to snchronizing all the instances. If a user modify a variable in Stateless Session Bean can it be reflected to all other instances in the pool? so that if next/other user access the variable he/she will get the updated value. This is a little messy because you don't always know how many instances the EJB Container has deployed in memory. Furthermore, you need to broadcast this message to each and every instance. Session bean were not designed to be called individually because the Container dynamically assigns an instance to handle the method invocation before each invocation. Because of this, I would suggest you move the data contained in your instance variables outside the session bean. It could be placed into a database table which is accessed by a read-only entity bean. The session bean can read the values before every request. Plus, since these are read-only entity beans, the values are cached in memory (provided you have a big enough cache) and the database is only accessed once or after a configurable amount of time. This solution also works in a clustered environment and is portable across other app servers. If you don't like entity beans, you can always use static objects to store the data of the instance variables. These would be stored in a static object in memory thereby accessible and shareable by any and all instances of the session bean. This is a more complex solution and you need to understand how classloaders work. Plus, it may not work in a cluster nor be portable. Comments and alternative answers
How about using static variables? Author: Ramneek Handa (http://www.jguru.com/guru/viewbio.jsp?EID=1116945), Sep 22, 2003 How about using static variables in the session bean itself, instead of using static objects for sharing the information across the bean instance. Re: How about using static variables? Author: Avi Abrami (http://www.jguru.com/guru/viewbio.jsp?EID=31214), Dec 17, 2003 Not allowed (by EJB specification). Re[2]: How about using static variables? Author: ashutosh shinde (http://www.jguru.com/guru/viewbio.jsp?EID=556615), Dec 18, 2003 The reason the specification prohibits EJB's to have static variables is because the EJB's are supposed to be distributable components. The static variables are
limited to a JVM and hence using the static variables/methods impairs the notion of "distributable" objects. If a static variable is changed in one server instance then it is not reflected in the other server. --Ashutosh Re[3]: How about using static variables? Author: ravi vedala (http://www.jguru.com/guru/viewbio.jsp?EID=1177955), Jun 11, 2004 Any way Static variables cant be used !! :)- But, why cant we take help of the session. As in a cluster "session replication" happens, we can store the values in the session. What do u say ? Re[4]: How about using static variables? Author: Ram V.L.T (http://www.jguru.com/guru/viewbio.jsp?EID=449849), Jun 28, 2004 Do agree with you for using session's . But,it's better to make use of the existing technology i.e stateful session beans which was already defined for the above scenario instead of defining the session's etc. Re: How about using static variables? Author: Sachin Patel (http://www.jguru.com/guru/viewbio.jsp?EID=1235868), Mar 31, 2005 Tell me If I m wrong., Use helper class, which carry that variable, make it static. Every instance of StatelessSessionBean should take the value from that helper class..,,Again, tell me if I m wrong. Sachin Patel basic problem Author: Shashank B (http://www.jguru.com/guru/viewbio.jsp?EID=1134131), Dec 16, 2003 Basically the difference offered from sun for stateless and statefull is to maintain a state of object or not.. If you want to maintain a instance variable value..so you should not go for stateless things..The design problem of this things can be patched with using static variables ..but it is not considered as best practice Re: basic problem Author: Nafis Alam (http://www.jguru.com/guru/viewbio.jsp?EID=1164400), Apr 20, 2004 I am very much agreed with some of the replies.That when ever you want to maintain a state between method you will have to take the help of state variables.And thats is only possible when you define a ejb statelfull in nature.Now to define a bean to be statefull you will have to define it in its deployment descriptor that the bean is statefull.similary for the stateless bean. EJB and scalability EJB is scalable because it can run in cluster environment. What is there in EJB specification and in Application Server that supports this feature ? Location: http://www.jguru.com/faq/view.jsp?EID=1105231 Created: Jul 31, 2003
Author: Satish Kumar Tedla (http://www.jguru.com/guru/viewbio.jsp?EID=1077558) Question originally posed by devang parikh (http://www.jguru.com/guru/viewbio.jsp?EID=427162 Capability is the current processing capability of an application. Like the No. of requests an application can handle with fair/good performance. Scalability is the rate at which the Capability of an application can be increased without any degradation of the current processing capabilities. For example, if an application was developed to handle 100 concurrent users with a performance of x. After sometime, the number of users/customers get doubled. In this case, we have to increase the current processing capability of the application with no degradation of the performance. We increase the number of application server instances and cluster them. Clustering is not part of EJB or J2EE specification. It is the feature provided by Application Server vendors. Through clustering feature, an app. server would support Load Balancing, High Avaialbility and Scalability. Multiple server instances are created in the Application Server and client requests are distributed among all the server instances. By doing this, we are making sure that a particular server is not overloaded with too many requests and also in case of a server instance going down, other server instances will take over the failed server instance's requests. Comments and alternative answers
about javabeans Author: deeptichaitanya malapati (http://www.jguru.com/guru/viewbio.jsp?EID=1145386), Feb 11, 2004 send a sample code how to create a sessionbean so that it must connect to the database(oracle). Brief description on the 4 interfaces applicable to EJBs (Remote, Local, Home, LocalHome): when to use them and the differences between them? Location: http://www.jguru.com/faq/view.jsp?EID=1166568 Created: Apr 28, 2004 Author: Sean Owen (http://www.jguru.com/guru/viewbio.jsp?EID=1164188) Question originally posed by James Halpin (http://www.jguru.com/guru/viewbio.jsp?EID=1166067 The Remote and Home interfaces have somewhat misleading names, because both interfaces are used by the EJB client, which may be on a "remote" machine. You will need to use both when working with EJBs. In very general terms, the Home interface has methods that relate to all EJBs of a certain class as a whole. For example, you will find the create() methods in the Home interface, which create new beans. You'll also see the find() methods, in the case of entity beans, which return handles on certain beans. The Remote interface has the methods that relate to a particular bean instance. This is usually where all the business methods go. For example, the Remote interface for
an entity bean will have all of the "getFoo()", "getBar()" methods that return properties of a particular bean. In some sense Home interface methods are analagous to the constructor and static methods of a regular Java class, and Remote interface methods are like instance methods of a regular Java class. The Local and LocalHome interfaces are entirely analagous, but are used to more efficiently access EJBs that are deployed in the same container. Comments and alternative answers
Brief description on the 4 interfaces applicable to EJBs (Remote, Local, Home, LocalHome): when to use them and the differences between them? Author: Max Goff (http://www.jguru.com/guru/viewbio.jsp?EID=1167788), May 2, 2004 Try to think of a remote object that can provide some service for you. To use this remote object, you need to basically do two things: Locate the remote object Call method(s) on the located remote object Home interfaces allow you to do step #1. Remote interfaces allow you to do step #2. Re: Brief description on the 4 interfaces applicable to EJBs (Remote, Local, Home, LocalHome): when to use them and the differences between them? Author: Sanjay Patel (http://www.jguru.com/guru/viewbio.jsp?EID=1219544), Jan 5, 2005 We can use either romote interface and home interface or local interface and local home interface. Now question is what to use ? If the client accessing the EJB is on the same JVM then use local interface and local home interface otherwise use remote interface and home interface. use of remote interface is expensive as it dows marshling and demarshling of arguments and return value and network call is requred. So, if client is on same JVM then use of local interface leads to performance improvement. Re: Brief description on the 4 interfaces applicable to EJBs (Remote, Local, Home, LocalHome): when to use them and the differences between them? Author: anjali jyo (http://www.jguru.com/guru/viewbio.jsp?EID=1223435), Jan 26, 2005 We use either Remote &Home Interfaces or Local&localHome Interfaces. If the client accessing the EJB is on the same JVM then use local&local home interfaces otherwise use remote& home interfaces. Remote Interface:It contains declaration of BusinessLogic methods.It must extends the EJBObject. Home Interface:It contains Create statements.It is a factory generator for objects.It must extends EJBHome.
Local and Remote Interfaces Author: bijukumar k v (http://www.jguru.com/guru/viewbio.jsp?EID=1169512), May 9, 2004 Note that the client of a bean can be another bean. By mentioning that the interface is local , we are telling the container that the bean and its client are in the same machine , so that the container can do internal optimizations. This is useful while using the Session Facade pattern where we use a session bean as a facade to encapsulate the complexity of interactions between the business objects participating in a workflow. Here the facade session bean which is directly interacting with client will have Remote interface and all other underlying beans with which facede interact will have Local interfaces. Brief description on the 4 interfaces applicable to EJBs (Remote, Local, Home, LocalHome): when to use them and the differences between them? Author: Ram V.L.T (http://www.jguru.com/guru/viewbio.jsp?EID=449849), Jun 28, 2004 EJB's will implement the Factory pattern. Home interface will consists the methodology of creating the products i.e instances of beans. Remote interfaces (i.e products generated by the home interface)are used to invoke the business methods. Local interfaces can be used if that bean will be invoked by an application residing on the same App Server and vise versa. Generally Remote and Local bean combination are used in the applications where Session Facade has been implemented. Re: Brief description on the 4 interfaces applicable to EJBs (Remote, Local, Home, LocalHome): when to use them and the differences between them? Author: Jaimin Patel (http://www.jguru.com/guru/viewbio.jsp?EID=1216450), Dec 15, 2004 The home interface defines the methods a client uses to create, locate, and destroy instances of an enterprise bean. The remote or local interface defines the business methods implemented in the bean. A client accesses these methods through the remote interface.
Once the bean is deployed in the EJB container, the client calls the create() method defined in the home interface to instantiate the bean. The home interface isn't implemented in the bean itself, but by the container. Other methods declared in the home interface permit the client to locate an instance of a bean and to remove a bean instance when it is no longer needed. EJB 2.0 beans also allow the home interface to have business methods called ejbHome methods. When the enterprise bean is instantiated, the client can call the business methods within the bean. The client never calls a method in the bean instance directly, however. The methods available to the client are defined in the remote or local interface of the bean, and the remote or local interface is implemented by the container. When the client calls a method, the container receives the request and delegates it to the bean instance. Re[2]: Brief description on the 4 interfaces applicable to EJBs (Remote, Local, Home, LocalHome): when to use them and the differences between them? Author: Omindra Rana (http://www.jguru.com/guru/viewbio.jsp?EID=1164665), Mar 13, 2005 Remote EJB means that it extends remote interface so that client communicates with EJB through RMI/RMI-IIOP which involves serialization, marshalling/unmarshalling for every method call and this has costs associated which can be avoided if the client is on the same machine/JVM. So if you want to deploy your EJB client and EJB in the same server/JVM then you don't need the remote EJB but can use the local EJB .The local EJB does not use RMI/RMI-IIOP for communication, it bypasses this overhead and uses pass-by-reference as normal java mechanism and hence is faster and efficient when compared to remote EJBs.
What is GlassFish? Location: http://www.jguru.com/faq/view.jsp?EID=1255621 Created: Jul 29, 2005 Author: John Zukowski (http://www.jguru.com/guru/viewbio.jsp?EID=7) The GlassFish Project is Sun's open source application server project. Found at https://glassfish.dev.java.net/, you can participate in the development of the latest version of Sun's Java System Application Server PE 9.0. It is based on Java Enterprise Edition 5.