有没有办法从wildfly连接池获取连接?

时间:2016-12-12 14:06:31

标签: java-ee wildfly querydsl

我正在尝试使用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有一个连接池机制,我不想实现连接池机制。

1 个答案:

答案 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()因为连接永远不会返回池。