jakarta-ee - 在一个 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”应用程序服务器特定的数据库连接池设置。
看的时候我真的找不到答案
- https://javaee.github.io/javaee-spec/Specifications
- https://github.com/javaee/jta-spec
- https://github.com/javaee/jta-spec/blob/master/JTA1.3Specification.pdf
我非常接近:应用程序服务器如何处理来自应用程序的连接请求
- 应用程序服务器调用 getConnection 方法。
- 应用程序服务器将 Connection 对象引用返回给应用程序。
- 应用程序对连接执行一项或多项操作。
- 应用程序关闭连接。
- 当资源适配器通知连接关闭时,应用程序服务器会删除资源。
- 事务管理器调用 XAResource.end 以解除事务与 XAResource 的关联。
- 应用服务器要求事务管理器提交事务。
- 事务管理器调用 XAResource.prepare 来通知资源管理器准备事务工作以进行提交。
- 事务管理器调用 XAResource.commit 来提交事务。
这似乎表明 Connection1 在提交 EJB 事务之前被归还给资源池以供重用。
解决方案
推荐阅读
- ios - 使用 Swift 导航到 Facebook 页面
- python - Python Tkinter 如何调整 x,y 默认 0,0 坐标
- php - 如何在 PHP 上正确计算 XML
- c++ - 有没有办法列出所有支持的语言环境,无论是 C 还是 C++ 运行时?
- flutter - 即使我在提示文本上使用 AutoSizeText 小部件,为什么我的下拉菜单会溢出?
- python - 为一维 numpy 数组创建成对二维数组的更有效方法是什么?
- javascript - 如何在Javascript es6中过滤对象数组
- google-apps-script - 如何使用它们的索引选择两列 - GetRangeList
- python - 如何在 y 轴上绘制高斯分布?
- javascript - 一个在相等数量的真或假值之间进行排序的函数