在一个EJB事务期间,一个池占用了多少数据库连接?

时间:2018-08-01 10:08:17

标签: java-ee

我想知道在调用以下示例代码期间,数据库池中有多少个数据库连接被占用。

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应用程序服务器配置为使用“固定线程”或“与线程关联”应用程序服务器特定的数据库连接池设置。

看着我真的找不到答案

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

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

似乎建议将Connection1交还给资源池,以便在提交EJB事务之前重用它。

0 个答案:

没有答案