我正在处理一个项目,该项目将有许多语句连接到数据库 我想重用语句而不是每次连接都创建一个新语句 并且最重要的是我不想在使用后关闭每个结果集
我希望在重用之前关闭语句上的结果集
我的代码看起来像这样
ArrayList<Statement> BackStatements = new ArrayList();
int lastStatementIndex = 0;
private Statement GetStatement() throws SQLException {
Statement SM;
int MaxStatements = 5;
if (BackStatements.size() < MaxStatements) {
SM = Connection.createStatement();
BackStatements.add(SM);
lastStatementIndex = BackStatements.size() - 1;
} else {
lastStatementIndex = lastStatementIndex + 1;
if (lastStatementIndex == MaxStatements) {
lastStatementIndex = 0;
}
SM = BackStatements.get(lastStatementIndex);
/// i want to close resultset generated by SM now and i do this before return this SM
SM.getResultSet().close();
}
System.out.println("Last Index:" + lastStatementIndex + "---- Size:" + BackStatements.size());
return SM;
}
但此方法通过logger
返回此错误Caused by: java.sql.SQLException: ResultSet already requested
答案 0 :(得分:1)
一般来说,这是个坏主意。 Statement是一个接口,实际的类可以是任何JDBC驱动程序返回的。 通常,您不能将一个语句类重用于另一个类型。例如, CallableStatement和PreparedStatement(对于oracle JDBC)是不兼容的。
对于ResultSet,关闭它会释放数据库游标,至少在某些情况下是这样。推迟使用resultSet.close()会对数据库服务器容量产生负面影响。
通常,如果您的JDBC驱动程序支持连接池,那么就可以了。通常,网络往返比创建语句更昂贵。
答案 1 :(得分:0)
这对我来说看起来很糟糕。
强制关闭时,无法确保最旧的Statement(和ResultSet)不再使用。你没有提示Exeption发生的地方,但我认为这可能是原因。
如果您想使用语句池,那么您应该在使用后主动回复它。
答案 2 :(得分:0)
您应该使用驱动程序提供的语句缓存,而不是构建自己的语句缓存。例如,在Oracle JDBC瘦驱动程序中,有一个隐式语句缓存,它将负责优化语句和游标的分配和释放方式。它需要打开。该文档是here。要启用它,只需设置属性&#34; oracle.jdbc.implicitStatementCacheSize &#34;例如&#34; 10 &#34;这通常是语句缓存的一个很好的大小。