[英]How to use CachedRowSet in Google App Engine?
我正在使用 Google App Engine (Endpoints) 來生成一個簡單的 API 服務。
我目前正在嘗試使我對數據庫的查詢更快更有效,因此我決定仔細檢查我在哪里調用 ResultSet 和 Connections 並關閉它們。
但是,我想使用CachedRowSet
並且幾乎不可能,因為當我嘗試訪問CachedRowSetImpl()
,記錄器返回:
java.lang.NoClassDefFoundError: com.sun.rowset.CachedRowSetImpl 是一個受限類。 有關詳細信息,請參閱 Google App Engine 開發人員指南
所以我做了一些調查, Google App Engine 的 JRE 白名單包括:
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 (09/06/2015):
進一步調查,我發現您可以使用RowSetProvider.newFactory().createCachedRowSet();
實現 CachedRowSetImpl 的功能RowSetProvider.newFactory().createCachedRowSet();
但是,Google也限制了對RowSetProvider()
。
這給我留下了唯一的其他白名單庫RowSetFactory
。 所以我自己做了,根據Oracle 的實現來實現 RowSetFactory :
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 (11/06/2015):
我嘗試通過手動復制一些庫並消除 App Engines 白名單中未涵蓋的庫來滾動我自己的 CachedRowSetImpl 和 RowSetProvider 實現。 沒有成功。 我知道我需要放棄這一點,但我決心完成這項工作。
CahecRowSet 是一個接口,所以顯然這是白名單。
我猜您正在連接 Google CloudSQL 實例。
從 javadoc :
CachedRowSet 對象是數據行的容器,將其行緩存在內存中,這使得在不始終連接到其數據源的情況下進行操作成為可能。
您嘗試做的事情對 IMO 沒有意義。 AppEngine 不會在不同請求之間保持狀態,當然也不會在您的應用程序自動擴展和新實例啟動時保持狀態。
為什么不將結果緩存在 Memcache 中,這將在后續請求和不同實例中持續存在。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.