我正在接受有关JAVA EE的培训,我们正在谈论连接池。 Adam Bien在他的书中写道" 真实世界Java EE模式 - 重新思考最佳实践"在JAVA EE应用程序中,容器为每个模块处理一个数据库连接。为了证明这一点,我们使用了您在下面看到的两个EJB。
MainBean
@Stateless
@TransactionManagement(TransactionManagementType.CONTAINER)
public class MainBean implements MainBeanRemote {
@Resource(lookup = "jdbc/sample")
DataSource dataSource1;
@Resource(lookup = "jdbc/sample")
DataSource dataSource2;
@EJB
HelperBean hb;
public void taking2ConnectionsFromThePool() {
try {
Connection con1 = dataSource1.getConnection();
Connection con2 = dataSource1.getConnection();
} catch (SQLException ex) {
// ...
}
}
public void taking1ConnectionEachFrom2DataSources() {
try {
Connection con1 = dataSource1.getConnection();
Connection con2 = dataSource2.getConnection();
} catch (SQLException ex) {
// ...
}
}
public void compareMainBeanWIthHelperBean() {
try {
Connection con1 = dataSource1.getConnection();
Connection con2 = hb.getConnection();
} catch (SQLException ex) {
// ...
}
}
}
HelperBean:
@Stateless
@TransactionAttribute(TransactionAttributeType.REQUIRED)
public class HelperBean {
@Resource(lookup = "jdbc/sample")
private DataSource dataSource2;
public DataSource getDataSource() {
return dataSource2;
}
public Connection getConnection() throws SQLException {
Connection con = dataSource2.getConnection();
return con;
}
}
当我们对这三个功能进行调试时,我们发现了以下几点:
taking2ConnectionsFromThePool
中,两个连接都与预期的相同。taking1ConnectionEachFrom2DataSources
中的内容相同。到目前为止一切顺利,但
compareMainBeanWIthHelperBean
函数中,con1
与HelperBean
内部的连接相同(如预期),但con2
的连接不同。当我问我的讲解员为什么在这种情况下连接不同时他并不知道。任何人都可以解释为什么在最后一个函数中连接是不同的吗?
P.S。我知道第三种方法并不是真实情况,但在所有情况下,Adam Bien的连接应该是相同的,这就是为什么我们在培训中编写了这三种方法。
P.P.S:我们使用了当前的glassfish应用服务器和Java(JDA和JRE)(u77)