我正在使用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的。沒有成功。我知道我需要放棄這一點,但我決心做到這一點。
感謝您的回覆。 我對使用CachedRowSet的興趣主要在於上面實現的方法'getRecordsWhereInt'。如果我返回一個結果集,而不是一個緩存的行集,我該如何正確關閉結果集? 我已經對我的查詢使用了memcache。 感謝您的幫助。 – markbratanov
您必須複製DTO中結果集的元素,並在返回HTTP響應之前關閉結果集和連接。使DTO可串行化,以便將它們存儲在Memcache中。在一天結束時,這是緩存連續... – koma