2015-11-26 21 views
2

我知道statement.cancel()可以用來取消正在運行的SQL查詢,但是我想知道的是,我將如何在另一個線程中獲得這個語句對象。如何取消正在運行的SQL查詢?

使用案例:

  • 我請求開始運行語句的線程。
  • 然後從一個單獨的請求(另一個線程)我可能要取消此線程。

如何在此新請求我會得到聲明調用它的取消方法。

有可能會有我運行多個語句的情況。

附加信息,它是一個使用spring框架,hibernate和JPA的web應用程序。現在在用戶界面中有2個按鈕,按鈕1將觸發SQL查詢,按鈕2必須取消該查詢

我參考this示例,但它使用相同的線程來調用新線程,我不能這樣做。

這是查詢是如何開始:

Query query = mEntityManager.createNativeQuery(globalQuery.toString()); 
    List<Object[]> results = query.getResultList(); 

編輯:

  1. 的一種方式,我能想到的是保持所有正在運行的語句的歌曲,然後找到一個SQL語句必須被取消。
+0

爲什麼不說這個地方「SQL查詢」是從調用開始? –

+0

所以我有2個客戶端請求,第一個將啓動查詢,第二個應該取消它 – rd22

+0

附加信息,它是一個Web應用程序,使用spring框架,休眠和JPA。現在在用戶界面中有2個按鈕,按鈕1將觸發SQL查詢,而按鈕2必須取消該查詢。 – rd22

回答

3

有兩種不同的會話,這將有助於你:

如果你想從同一個用戶,如果在平行或陸續運行這些請求兩個請求之間交換的對象喜歡你的聲明,獨立,您通常將它們存儲在HttpServletRequestHttpSession中。

你也可以使用Hibernate的Session取消當前查詢:

public void startLongRunningStatement() { 
    EntityManager entityManager = ... 

    // Aquire session 
    Session hibernateSession = ((HibernateEntityManager) em.getDelegate()).getSession(); 

    // Store the HibernateSession in the HttpSession 
    HttpSession httpSession = servletRequest.getSession() 
    httpSession.setAttribute("hibernateSession", hibernateSession); 

    try { 
    // Run your query 
    Query query = mEntityManager.createNativeQuery(globalQuery.toString()); 
    List<?> results = query.getResultList(); 

    } finally { 
    // Clear the session object, if it is still ours 
    if (httpSession.getAttribute("hibernateSession") == hibernateSession) { 
     httpSession.removeAttribute("hibernateSession"); 
    } 
    } 
} 

public void cancel() { 
    // Get the Hibernate session from the HTTP session 
    HttpSession httpSession = servletRequest.getSession() 
    Session hibernateSession = (Session) httpSession.getAttribute("hibernateSession"); 
    if (hibernateSession != null) { 
    // Cancel the previous query 
    hibernateSession.cancelQuery(); 
    } 

} 
+0

你測試過了嗎?我試圖以類似的方式實現,區別在於使用Global Map來存儲與請求相對應的會話對象。但是我沒有完全測試它。所以我想知道這是否有效? – rd22

+0

是的,我不止一次地使用過這個。正如我所說的,'HttpSession'是跨請求存儲數據的常用方法。您的全球請求地圖存在的問題是,您需要爲當前用戶查找先前的請求 - 如果您有匿名用戶,這並不容易。 –