繁体   English   中英

具有JDBC结果集和MDB的EJB容器管理的事务

[英]EJB Container Managed Transaction with JDBC Result Set and MDB

我有一个无状态会话bean。 在以下方法中,我循环列表以将每个用户插入表“ user”中。

void saveUserList(List<User> users) {
  try {
    conn = dataSource.getConnection();
    PreparedStatement ps;

    try {
      ps = conn.prepareStatement(INSERT_USER_LIST);

      for (User user : users) {
        ps.setString(1, user.getName);

        if (ps.executeUpdate() > 0) {
          sendJMSMessage();
        }
      }
    }
  } catch (SQLException e) {
    // catch error!!
  } finally {
    closeResource(conn);
  }
}

每次成功插入后,触发标志都将发送到MDB。 这是sendJMSMessage方法...

void sendJMSMessage() {
  conn = connectionFactory.createQueueConnection();
  qsession = conn.createQueueSession(false, Session.AUTO_ACKNOWLEDGE);
  QueueSender sender = qsession.createSender(queue);
  conn.start();

  TextMessage flag = qsession.createTextMessage("triggerFlag");
  flag.setJMSDeliveryMode(DeliveryMode.NON_PERSISTENT);
  sender.send(flag);
}

然后它将调用MDB的onMessage方法。 在这里,我想在onMessage中从表“ user”中获取所有用户,包括最后插入的用户(当循环仍在迭代列表时,可能尚未提交)。 提取过程发生在由onMessage调用的另一个无状态EJB中。 我希望那里有唱片。 但是结果集什么也没有。

void onMessage(Message message) {
  TextMessage obj = (TextMessage) message;

  if (obj.getText.equals("triggerFlag")) {
    ArrayList<User> users = someBean.getUsers();
    // Do something with them, as well as the new user.
  }
}

使用当前代码,我通常需要通过传递不同的列表来重新执行saveUserList()以获得预期的结果。 我想知道的是:

  1. 有可能这样做吗?
  2. 第一次插入事务什么时候提交?
  3. MDB可以读取表中未提交的更改吗?
  4. 从EJB触发的MDB中读取表更改的正确方法是什么?
  5. 有替代方法可以做到这一点吗?
  1. 对的,这是可能的。
  2. 这实际上取决于您如何获得连接(或数据源)。 如果您从注入的EntityManager解开包装,那么在您(第一个输入的)EJB方法返回时,事务将自动提交(默认情况下是这样,即如果没有其他注释!)
  3. 是的,如果MDB的连接使用最低的事务隔离级别“ READ_UNCOMMITTED”。 这并非易事,并且再次取决于您如何获得连接。
  4. (&5)解决问题的最干净的方法可能是手动控制事务(使用注入的UserTransaction ,而不是Container Managed Transactions(CMT))。 仅当整个用户列表(不是现在的每个用户)以及提交事务(通过UserTransaction编程)后,您才完成,您的第二个无状态Bean将看到您的所有用户都是100%。 在这种情况下,您应该只发送一次消息。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM