簡體   English   中英

如何在 Google App Engine 中使用 CachedRowSet?

[英]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 是一個接口,所以顯然這是白名單。

接口 CachedRowSet

我猜您正在連接 Google CloudSQL 實例。

從 javadoc :

CachedRowSet 對象是數據行的容器,將其行緩存在內存中,這使得在不始終連接到其數據源的情況下進行操作成為可能。

您嘗試做的事情對 IMO 沒有意義。 AppEngine 不會在不同請求之間保持狀態,當然也不會在您的應用程序自動擴展和新實例啟動時保持狀態。

為什么不將結果緩存在 Memcache 中,這將在后續請求和不同實例中持續存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM