2016-12-12 126 views
-1

我正在尝试使用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异常的托管连接。

有什么办法可以访问Wildfly连接池来获得连接吗?并在SQL运行后返回到连接池?如果Wildfly有一个连接池机制,我不想实现连接池机制。

+0

不,我想尝试新的东西。我使用了约两年的JPA。 – goku91

+0

谢谢你的回答@BususC。我理解你的意见,但我寻找替代解决方案,而不是使用Hibernate或EclipseLink的JPA,并且Querydsl看起来不错。这样我仍然需要Hibernate和实体管理器。 – goku91

+0

也许我错过了它的一点,我的脑子也错过了它。但是在过去,我们在JPA和Hibernate方面遇到了很多问题(例如:难以理解的查询,查询问题等)。 – goku91

回答

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

相关问题