3

我正在使用Google App Engine(端點)來生成一個簡單的API服務。如何在Google App Engine中使用CachedRowSet?

我目前正試圖讓我的查詢更快,更高效,因此我決定仔細檢查我在哪裏調用ResultSet和Connections並關閉它們。

不過,我想用CachedRowSet,並賦予它看起來幾乎是不可能的,當我嘗試訪問CachedRowSetImpl()記錄儀的回報:

java.lang.NoClassDefFoundError: com.sun.rowset.CachedRowSetImpl is a restricted class. Please see the Google App Engine developer's guide for more details

所以我做了一些調查和Google App Engine's JRE whitelist包括:

javax.sql.rowset.CachedRowSet

但不是

com.sun.rowset.CachedRowSetImpl

這有什麼意義嗎?如何初始化/使用CachedRowSet

我的代碼:

public ResultSet getRecordsWhereInt(String table, String where, int condition) throws SQLException { 

    c = DatabaseConnect(); 

    preStatement = c.prepareStatement("SELECT * FROM " + table + " WHERE " + where + " = ?"); 

    preStatement.setInt(1, condition); 

    CachedRowSet rowset = new CachedRowSetImpl(); 

    rowset.populate(preStatement.executeQuery()); 

    c.close(); 

    return rowset; 

} 

任何幫助/指導,將不勝感激。

更新1(2015年9月6日):
進一步調查,我發現,你可以使用RowSetProvider.newFactory().createCachedRowSet();

但是實現對CachedRowSetImpl的功能,谷歌已經限制使用到RowSetProvider()

這留下了我唯一的其他白名單圖書館RowSetFactory。所以我做了我自己,實現RowSetFactory中根據Oracle's implementation

public class CachedRowSetFactory implements RowSetFactory { 


    public CachedRowSet createCachedRowSet() throws SQLException { 
     return new CachedRowSetImpl(); 
    } 

    public FilteredRowSet createFilteredRowSet() throws SQLException { 
     return null; 
    } 

    public JdbcRowSet createJdbcRowSet() throws SQLException { 
     return null; 
    } 

    public JoinRowSet createJoinRowSet() throws SQLException { 
     return null; 
    } 

    public WebRowSet createWebRowSet() throws SQLException { 
     return null; 
    } 
} 

然後用它是這樣的:

CachedRowSet crs = new CachedRowSetFactory().createCachedRowSet(); 

然而,即使失敗。當我嘗試用一​​個工作結果集填充它時,上面的例子返回一個空指針異常。我猜工廠的實施不是100%正確的,或者我正在跳過明顯的事情。

更新2(2015年11月6日):
我試過我自己的滾動實施對CachedRowSetImpl,並通過手動複製一些庫和消除未涵蓋的應用程序引擎白名單庫的RowSetProvider的。沒有成功。我知道我需要放棄這一點,但我決心做到這一點。

回答

1

CahecRowSet是一個界面,很明顯這是一個白名單。

Interface CachedRowSet

我猜你連接的是谷歌CLOUDSQL實例。

從的Javadoc:

A CachedRowSet object is a container for rows of data that caches its rows in memory, which makes it possible to operate without always being connected to its data source.

你正在嘗試做沒有意義IMO。 AppEngine不會在不同請求之間保持狀態,當您的應用程序自動縮放和新實例旋轉時,肯定不會。

爲什麼不將結果緩存在Memcache中,這會在後續請求和不同實例中保留。

+0

感謝您的回覆。 我對使用CachedRowSet的興趣主要在於上面實現的方法'getRecordsWhereInt'。如果我返回一個結果集,而不是一個緩存的行集,我該如何正確關閉結果集? 我已經對我的查詢使用了memcache。 感謝您的幫助。 – markbratanov

+1

您必須複製DTO中結果集的元素,並在返回HTTP響應之前關閉結果集和連接。使DTO可串行化,以便將它們存儲在Memcache中。在一天結束時,這是緩存連續... – koma