2016-12-12 183 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(),因爲連接永遠不會返回到池。

相關問題