如何在 Google App Engine 中使用 CachedRowSet?

How to use CachedRowSet in Google App Engine?

我正在使用 Google App Engine(端点)生成一个简单的 API 服务。

我目前正在尝试更快、更高效地查询数据库,因此我决定仔细检查调用 ResultSet 和 Connections 的位置并关闭它们。

但是我想使用 CachedRowSet 并且这几乎是不可能的,因为当我尝试访问 CachedRowSetImpl() 记录器时 returns:

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

这有意义吗?不然我怎么能initialize/useCachedRowSet

我的代码:

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;

}

任何帮助 would/guidance 将不胜感激。

更新 1 (09/06/2015):
进一步调查,我发现您可以使用 RowSetProvider.newFactory().createCachedRowSet();

实现 CachedRowSetImpl 的功能

但是,Google 限制使用 RowSetProvider()

这给我留下了唯一的另一个列入白名单的库 RowSetFactory。所以我自己做了,根据 Oracle's implementation:

实现 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();

然而,即使这样也失败了。上面的示例 returns 当我尝试用工作结果集填充它时出现空指针异常。我猜工厂实现不是 100% 正确,或者我跳过了一些明显的东西。

更新 2 (11/06/2015):
我尝试通过手动复制一些库并删除 App Engines 白名单中未涵盖的库来滚动我自己的 CachedRowSetImpl 和 RowSetProvider 实现。没有成功。我知道我需要放弃,但我决心完成这项工作。

CahecRowSet 是一个接口,所以很明显这是白名单。

Interface CachedRowSet

我猜您正在连接一个 Google 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.

在我看来,您正在尝试做的事情没有意义。 AppEngine 不会在不同的请求之间保持状态,当然在您的应用程序自动缩放和新实例启动时也不会。

为什么不将结果缓存在 Memcache 中,这将在后续请求和不同的实例中持续存在。