我想知道在调用以下示例代码期间,数据库池中有多少个数据库连接被占用。
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应用程序服务器配置为使用“固定线程”或“与线程关联”应用程序服务器特定的数据库连接池设置。
看着我真的找不到答案
我尽可能接近:应用服务器如何处理 来自应用程序的连接请求
- 应用程序服务器调用getConnection方法。
- 应用程序服务器将Connection对象引用返回给应用程序。
- 应用程序对连接执行一个或多个操作。
- 应用程序关闭连接。
- 当资源适配器通知连接关闭时,应用程序服务器会分发资源。
- 事务管理器调用XAResource.end以使事务与XAResource解除关联。
- 应用程序服务器要求事务管理器提交事务。
- 事务管理器调用XAResource.prepare通知资源管理器准备事务工作以进行提交。
- 事务管理器调用XAResource.commit提交事务。
似乎建议将Connection1交还给资源池,以便在提交EJB事务之前重用它。