I would like to understand about relationship between Stateless Sessionneans and DB Connections. Can someone give me information to the following questions based on the Scenaraios below? Thanks in advance.
- When does a Stateless sessionbean gets a database connection in case of Container Managed Transactions and its lifetime?
- How many DB connections will be acquired OR how many times a DB connection will be fetched and released in each scenario?
Scenaraio 1:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
// DEFAULT TRANSACTION ATTRIBUTE IS "REQUIRED"
public class StatelessSessionBeanA {
.....
@TransactionAttribute(TransactionAttributeType.NOT_REQUIRED)
public void methodA() {
methodB();
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
private void methodB() {
methodC();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void methodC() {
.....
}
.....
}
Scenaraio 2:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.NOT_REQUIRED) // THIS IS IMPORTANT HERE
public class StatelessSessionBeanB {
.....
@TransactionAttribute(TransactionAttributeType.NOT_REQUIRED)
public void methodA() {
methodB();
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
private void methodB() {
methodC();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void methodC() {
.....
}
.....
}
Scenaraio 3:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
// DEFAULT TRANSACTION ATTRIBUTE IS "REQUIRED"
public class StatelessSessionBeanC {
.....
@TransactionAttribute(TransactionAttributeType.NOT_REQUIRED)
public void methodA() {
methodB();
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
private void methodB() {
methodC();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void methodC() {
.....
}
.....
}
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.NOT_REQUIRED) // THIS IS IMPORTANT HERE
public class StatelessSessionBeanD {
@Inject
private StatelessSessionBeanC beanC;
.....
@TransactionAttribute(TransactionAttributeType.NOT_REQUIRED)
public void methodA() {
methodB();
beanC.methodA();
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
private void methodB() {
methodC();
beanC.methodA();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void methodC() {
.....
}
.....
}
Scenaraio 4:
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
@TransactionAttribute(TransactionAttributeType.NOT_REQUIRED) // THIS IS IMPORTANT HERE
public class StatelessSessionBeanE {
.....
@TransactionAttribute(TransactionAttributeType.NOT_REQUIRED)
public void methodA() {
methodB();
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
private void methodB() {
methodC();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void methodC() {
.....
}
.....
}
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
// DEFAULT TRANSACTION ATTRIBUTE IS "REQUIRED"
public class StatelessSessionBeanF {
@Inject
private StatelessSessionBeanE beanE;
.....
@TransactionAttribute(TransactionAttributeType.NOT_REQUIRED)
public void methodA() {
methodB();
beanE.methodA();
}
@TransactionAttribute(TransactionAttributeType.REQUIRED)
private void methodB() {
methodC();
beanE.methodA();
}
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
private void methodC() {
.....
}
.....
}