EJB tem muita bagagem. Parte dessa bagagem vem do fato de ter sido direcionada ao público errado. A outra parte era que as duas primeiras versões eram uma porcaria total.
Se você olhar as versões EJB originais, o design era que um desenvolvedor de EJB poderia criar uma solução empacotada que poderia ser usada em qualquer contêiner compatível com EJB. Para uma loja própria, esse nível de abstração era desnecessário. Era uma solução perfeita para criar um mercado próspero para fornecedores de componentes EJB de terceiros. No entanto, os fornecedores de contêineres eram excessivamente zelosos em seu marketing e estavam produzindo toneladas vendendo seu produto como uma solução viável para o desenvolvimento diário. Isso seria o equivalente a criar todo o código do aplicativo como componentes do COM +.
Para obter mais informações sobre as especificações originais do J2EE, a maioria dos fornecedores envolvidos tinha servidores CORBA e queria aproveitar esses produtos no futuro. A especificação EJB foi construída sobre o protocolo IIOP (na verdade, Java RMI, que era uma camada fina sobre IIOP). O CORBA já havia sido rejeitado devido à sua complexidade, e o EJB estava apenas disfarçado pelo CORBA, o que trouxe muitos dos problemas que o CORBA apresentava. Na verdade, as abstrações do EJB tornaram mais difícil trabalhar do que uma implementação pura do CORBA teria sido.
Quando a borracha atingiu o asfalto, as pessoas perceberam que o desempenho com o EJB era atroz. Com cada chamada sendo remota e com a dificuldade de colocar o aplicativo em funcionamento corretamente, as pessoas rapidamente procuraram alternativas. Hibernate e Spring em execução em um contêiner JSP se tornaram a solução.
O EJB 3 "adotou" essa abordagem. Mas ainda é um compromisso genérico que não oferece muitos benefícios. Ainda não existe um mercado de componentes EJB de terceiros, portanto não faz sentido usar um contêiner EJB para criar sua solução.
Longa história curta. Embora o EJB 3 seja uma grande melhoria nas duas primeiras iterações, ele ainda não fornece benefícios suficientes para compensar os custos.