-2

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.

  1. When does a Stateless sessionbean gets a database connection in case of Container Managed Transactions and its lifetime?
  2. 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() {
        .....
    }
    .....
}
Mr. M
  • 1

1 Answers1

0

I think you can figure this out by trying.
Do something like this:

@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
// DEFAULT TRANSACTION ATTRIBUTE IS "REQUIRED"
public class StatelessSessionBeanA {

    @Resource
    TransactionSynchronizationRegistry tsRegistry;

    private static final Logger LOGGER = Logger.Logger.getLogger(StatelessSessionBeanA.class.getName());

    .....

    private  void logTransaction(){
        Object tsKey = tsRegistry.getTransactionKey();
        LOGGER.info("Transaction: " + tsKey == null ? "none" : tskey.toString());
    }

    @TransactionAttribute(TransactionAttributeType.NOT_REQUIRED)
    public void methodA() {
        logTransaction()
        methodB();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    private void methodB() {
         logTransaction();
        methodC();
    }

    @TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
    private void methodC() {
        logTransaction();
        .....
    }
    .....
}

Do the same in the Bean where your Methods are called, then you can compare the log outputs.

frank
  • 1,007
  • 1
  • 6
  • 13
  • Thank you so much for your response Frank. I understand where a Transaction starts and where it ends and its lifetime. But what I'm trying to understand is how many number of Connections, NOT Transaction blocks. For example: Does each sessionbean gets a separate connection or it shares the same connection in Scenario 3 and 4? Or each method annotated "REQUIRES_NEW" will get a new connection (not just starting a Transaction)? Does this makes sense? – Mr. M Sep 21 '20 at 13:12
  • Not for every method annotated with REQUIRES NEW will get a new Transaction. The number of Connections to the Database depends on what you are doing inside your methods and on the Settings of the JDBC Connection Pool in your Applicationserver – frank Sep 22 '20 at 07:55