2013-06-24 117 views
3

我嘗試在一個項目中使用jooq,但出於性能原因,我想緩存查詢。在performance consideration section的用戶手冊中,提到了查詢緩存,但沒有關於如何實現的示例。所以我儘量緩存查詢(例如SimpleSelectConditionStep)如下:在Jooq中緩存查詢

SimpleSelectConditionStep query = getFromPool(); 
if(query != null) { 
    factory.attach(query); 
    query.bind(1,"John"); 
} else { 
    // create query 
    factory.select(PERSON).where(PERSON.NAME.equal("Michael")); 
} 
// fetch and use query 
result = query.fetchOne(); 
..... 
putToPool(query); 

我的軟件是一個多線程的web應用程序,但它是保證不是兩個不同的線程在同一時間不能使用相同的查詢(池不在再次放入池之前返回相同的查詢)。

我知道比工廠不是一個線程安全的對象,但我不知道在代碼中使用這樣的查詢可能會導致問題?

+0

您確定需要緩存查詢嗎?即使在手冊中提到過,只有在經常執行查詢時才需要這樣做,在這種情況下,甚至可能需要緩存「PreparedStatement」或至少SQL String ... –

+0

其中一頁該應用程序具有快速響應的要求。我測量了操作所花費的時間,最長的準備語句正在提取數據。我嘗試緩存SQL字符串,但重新執行SQL字符串後,我只能得到一個通用的結果,而不是生成的記錄。 –

+0

你的例子是真實的嗎?或者你的查詢真的很大?我懷疑你是否需要這種簡單情況下的緩存。你有沒有分析數據,顯示查詢執行的熱點? –

回答

0

如果準備語句需要很長的時間,你也許能夠使用jOOQ的聲明重用功能:

http://www.jooq.org/doc/latest/manual/sql-execution/reusing-statements

這將在內部保持在查詢中的公開聲明,如果執行相同的查詢常常。除此之外,我懷疑在你的例子中,對於一個簡單的查詢,你應該需要一個jOOQ對象的緩存。