首页 > 解决方案 > 在一个 EJB 事务期间占用了一个池中的多少个数据库连接?

问题描述

我想知道在调用以下示例代码期间占用了我的数据库池中的数据库连接数。

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.annotation.Resource;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.sql.DataSource;

@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public class SomeDbBean {

    @Resource(name = "jdbc/mydatabase")
    private DataSource database;

    public void updateSomeValues() throws SQLException, InterruptedException {

        // Connection 1, normally this is done in another method
        try (Connection conn = database.getConnection();
                PreparedStatement ps = conn.prepareStatement("update some where id = 1")) {
            ps.executeUpdate();
        }

        // Sleep to mimic some long processing logic
        Thread.sleep(30000);

        // Connection 2, normally this is done in another method
        try (Connection conn = database.getConnection();
                PreparedStatement ps = conn.prepareStatement("update some where id = 2")) {
            ps.executeUpdate();
        }
    }
}

一旦方法完成,数据库提交就会发生,但是我从连接池收到的两个数据库连接会做什么呢?资源尝试调用关闭连接。在事务完成之前,连接会一直被占用吗?还是它们被释放到数据库连接池并且 JEE 以不可见的方式处理提交?

当我有一个有 50 个连接的连接池时,我可以毫无问题地调用此方法 50 次,还是可以在池用完连接之前调用此方法 25 次?

注意:我没有将 JEE 应用程序服务器配置为使用“Pinned-To-Thread”或“associate-with-thread”应用程序服务器特定的数据库连接池设置。

看的时候我真的找不到答案

我非常接近:应用程序服务器如何处理来自应用程序的连接请求

  1. 应用程序服务器调用 getConnection 方法。
  2. 应用程序服务器将 Connection 对象引用返回给应用程序。
  3. 应用程序对连接执行一项或多项操作。
  4. 应用程序关闭连接。
  5. 当资源适配器通知连接关闭时,应用程序服务器会删除资源。
  6. 事务管理器调用 XAResource.end 以解除事务与 XAResource 的关联。
  7. 应用服务器要求事务管理器提交事务。
  8. 事务管理器调用 XAResource.prepare 来通知资源管理器准备事务工作以进行提交。
  9. 事务管理器调用 XAResource.commit 来提交事务。

这似乎表明 Connection1 在提交 EJB 事务之前被归还给资源池以供重用。

标签: jakarta-ee

解决方案


推荐阅读