我正在尝试使用Wildfly 10.0应用服务器和Querydsl。我的问题是Querydsl需要一个连接来评估SQL查询。我可以获得连接的唯一方法显示在此代码段中。
@ConcurrencyManagement(ConcurrencyManagementType.BEAN)
@Singleton
public class ServiceTest {
@Resource(lookup = "java:jboss/datasources/postgresDS")
private DataSource ds;
public Memeber getMemeberById(final int id) {
try {
Connection connection = ds.getConnection();
Memeber member = new SQLQuery<Memeber>(new Configuration(new PostgreSQLTemplates()))
.select(Projections.bean(Memeber.class, QMember.member.id.as(Memeber.ID),
QMember.member.name.as(Memeber.NAME)))
.from(QMember.member).where(QMember.member.id.eq(id)).fetchOne();
connection.close();
return member;
} catch (SQLException e) {
throw new RuntimeException(e);
}
}
}
此解决方案有效,但会产生一些问题。如果正在使用所有连接,则ds.getConnection()会抛出javax.resource.ResourceException:IJ000453:无法获取java的托管连接:jboss / datasources / postgresDS exception。
有没有办法访问Wildfly连接池以获得连接?并在SQL运行后返回池连接?如果Wildfly有一个连接池机制,我不想实现连接池机制。
答案 0 :(得分:0)
问题的答案就在于此。当ds.getConnection()
调用它时,它会从池中提供连接,因为它调用了org.jboss.jca.core.connectionmanager.pool.AbstractPool#getConnection
方法。 bean方法结束后,connection.close()
调用org.jboss.jca.core.connectionmanager.pool.AbstractPool#returnConnection
方法返回到池的连接。所以connection.close()
没有关闭连接。重要的是调用connection.close()
因为连接永远不会返回池。