gpt4 book ai didi

java - 使用 JDBC 结果集和 MDB 的 EJB 容器管理事务

转载 作者:行者123 更新时间:2023-12-01 10:51:13 25 4
gpt4 key购买 nike

我有一个无状态 session 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. 这实际上取决于您如何获得连接(或数据源)。如果您从注入(inject)的 EntityManager 中解开它,那么当您(第一次输入的)EJB 方法返回时,事务会自动提交(默认情况下就是这样,即如果没有其他注释!)
  3. 是,如果 MDB 的连接使用最低事务隔离级别“READ_UNCOMMITTED”。这实现起来并不简单,并且再次取决于您如何获得连接。
  4. (&5)解决问题的最简洁方法可能是手动控制事务(使用注入(inject)的 UserTransaction,而不是容器管理事务 (CMT))。只有当整个用户列表(不是像现在这样针对每个用户)并且在提交事务(使用UserTransaction以编程方式)之后,您的第二个无状态bean 100%将完成时,您才完成。查看您的所有用户。在这种情况下,您应该只发送一次消息。

关于java - 使用 JDBC 结果集和 MDB 的 EJB 容器管理事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33888593/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com