我正在使用(端点)来生成一个简单的API服务。
目前,我正试图使对数据库的查询速度更快、效率更高,因此我决定再次检查调用ResultSet和连接的位置,并关闭它们。
但是,我想使用CachedRowSet,而且考虑到当我试图访问CachedRowSetImpl()时,记录器返回的内容几乎是不可能的:
java.lang.NoClassDefFoundError: com.sun.rowset.CachedRowSetImpl是一个受限类。有关详细信息,请参阅开发人员指南
所以我做了一些调查,的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()的使用。
这给我留下了唯一的白名单库RowSetFactory。所以我自己做了,根据RowSetFactory实现了Oracle的实现
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):
我尝试通过手工复制一些库来实现CachedRowSetImpl和RowSetProvider的实现,并消除App白名单中没有涵盖的库。并没有成功。我知道我需要放弃这件事,但我决心让这件事成功。
发布于 2015-06-11 22:03:38
CahecRowSet是一个接口,所以很明显,这是白名单。
接口CachedRowSet
我猜你正在连接一个Google CloudSQL实例。
来自javadoc:
CachedRowSet对象是存储在内存中的行的数据行的容器,这样就可以在不总是连接到数据源的情况下操作。
你想做的事毫无意义。AppEngine不会在不同的请求之间保持状态,当然也不会在应用程序自动缩放和新实例出现时保持状态。
为什么不将结果缓存在Memcache中,这将在后续的请求和不同的实例中持续存在。
https://stackoverflow.com/questions/30722221
复制相似问题