私の質問:プリペアドステートメントからのクエリの結果が実行ごとに一貫していないのはなぜか疑問に思っています。
先に奇妙なものを警告します。
私はOracleデータベースを使用しています。ojdbc6.jar
ドライバーを使用しています。約1300行を返すクエリがあります(にwhere
依存する句があるため、時間の経過とともに変化しますsysdate
)。Toad(SQL Developerツール)とNetbeans Servicesツール(データベースとの別のインターフェース)で実行すると、うまく機能します。私の結果は一貫しています。しかし、Javaコードでクエリを実行すると、結果に一貫性がなくなります。各結果カウントが返される頻度を確認するために、forループに入れて10回繰り返しました。各実行内には比較的一貫した行数がありますが、実行間ではありません。私の出力とコードは以下の通りです。これ以上の情報が役立つかどうか教えてください。
試行が機能する場合(sorta ...):
Got real queries (1308)
Got real queries (1308)
Got real queries (1308)
Got real queries (1307)
Got real queries (1307)
Got real queries (1317)
Got real queries (1317)
Got real queries (1317)
Got real queries (1317)
Got real queries (1315)
試行が機能しない場合:
Got real queries (212)
Got real queries (212)
Got real queries (212)
Got real queries (212)
Got real queries (212)
Got real queries (212)
Got real queries (212)
Got real queries (212)
Got real queries (212)
Got real queries (212)
私のコード:
public static void main(String[] args) throws Exception {
for (int i = 0; i < 10; i++) {
List<String> realQueries = new ArrayList<>();
String sqlAllRealQueries = "select V.SQL_FULLTEXT" + StringHelper.newline
+ "from v$sql v" + StringHelper.newline
+ "where V.PARSING_SCHEMA_NAME = 'DSS1_PTC'" + StringHelper.newline
+ "and to_number(replace(replace(replace(v.last_load_time,'-',''), '/',''), ':','')) > to_number(to_char(sysdate - (24/24),'yyyymmddHH24mmss'))" + StringHelper.newline
+ "order by V.LAST_LOAD_TIME desc";
try (ResultSet rs = getInstance().executeQuery(sqlAllRealQueries)) {
while (rs.next()) {
realQueries.add(rs.getString(1));
}
}
System.out.println("Got real queries (" + realQueries.size() + ")");
}
System.exit(0);
}
public ResultSet executeQuery(String connection, String query, QueryParameter... params) throws DataException, SQLException {
Connection conn = ConnectionPool.getInstance().get(connection);
PreparedStatement pstmt = conn.prepareStatement(query);
for (int i = 1; i <= params.length; i++) {
//... stuff to fill in the '?'s of the query (in this case, there are none).
}
}
ResultSet rs = pstmt.executeQuery();
ConnectionPool.getInstance().release(conn);
return rs;
}