Java 为什么从Oracle花费的时间不一致?
我正在编写一个java应用程序,它从Oracle获取UTC时间,然后查询表中是否有行与该时间匹配。如果没有结果,请再次使用UTC,以此类推 但有时时间会倒流,或者花1到2分钟,然后在正确的时间继续 这是所用UTC时间的日志:Java 为什么从Oracle花费的时间不一致?,java,oracle,Java,Oracle,我正在编写一个java应用程序,它从Oracle获取UTC时间,然后查询表中是否有行与该时间匹配。如果没有结果,请再次使用UTC,以此类推 但有时时间会倒流,或者花1到2分钟,然后在正确的时间继续 这是所用UTC时间的日志: 15/03/2016 16:42:59 [INFO] Time (UTC): 21:42:25 {1} 15/03/2016 16:42:59 [INFO] Time (UTC): 21:42:25 {2} 15/03/2016 16:42:59 [INFO] T
15/03/2016 16:42:59 [INFO] Time (UTC): 21:42:25 {1}
15/03/2016 16:42:59 [INFO] Time (UTC): 21:42:25 {2}
15/03/2016 16:42:59 [INFO] Time (UTC): 21:42:25 {3}
15/03/2016 16:42:59 [INFO] Time (UTC): 21:42:25 {4}
15/03/2016 16:42:59 [INFO] Time (UTC): 21:42:25 {5}
15/03/2016 16:43:00 [INFO] Time (UTC): 21:44:12 {6}
15/03/2016 16:43:00 [INFO] Time (UTC): 21:42:26 {7}
15/03/2016 16:43:00 [INFO] Time (UTC): 21:42:26 {8}
15/03/2016 16:43:00 [INFO] Time (UTC): 21:42:26 {9}
15/03/2016 16:43:00 [INFO] Time (UTC): 21:42:26 {10}
15/03/2016 16:43:00 [INFO] Time (UTC): 21:42:26 {11}
15/03/2016 16:43:01 [INFO] Time (UTC): 21:42:27 {12}
15/03/2016 16:43:01 [INFO] Time (UTC): 21:42:27 {13}
15/03/2016 16:43:01 [INFO] Time (UTC): 21:42:27 {14}
15/03/2016 16:43:01 [INFO] Time (UTC): 21:42:27 {15}
15/03/2016 16:43:01 [INFO] Time (UTC): 21:42:27 {16}
15/03/2016 16:43:01 [INFO] Time (UTC): 21:42:27 {17}
15/03/2016 16:43:02 [INFO] Time (UTC): 21:42:28 {18}
15/03/2016 16:43:02 [INFO] Time (UTC): 21:42:28 {19}
15/03/2016 16:43:02 [INFO] Time (UTC): 21:42:28 {20}
15/03/2016 16:43:02 [INFO] Time (UTC): 21:42:28 {21}
15/03/2016 16:43:02 [INFO] Time (UTC): 21:42:28 {22}
15/03/2016 16:43:02 [INFO] Time (UTC): 21:42:28 {23}
15/03/2016 16:43:03 [INFO] Time (UTC): 21:44:15 {24}
15/03/2016 16:43:03 [INFO] Time (UTC): 21:44:15 {25}
15/03/2016 16:43:03 [INFO] Time (UTC): 21:44:15 {26}
15/03/2016 16:43:03 [INFO] Time (UTC): 21:44:15 {27}
15/03/2016 16:43:03 [INFO] Time (UTC): 21:44:16 {28}
15/03/2016 16:43:04 [INFO] Time (UTC): 21:44:16 {29}
15/03/2016 16:43:04 [INFO] Time (UTC): 21:42:30 {30}
这是我代码的一部分:
int arraycounter = 0;
int index = 0;
while (arraycounter = 0)
{
Connection con = null;
Statement stmt = null;
ResultSet rs = null;
String utc_time = "";
String querytime = "select to_char(sys_extract_utc(systimestamp),'HH24:MI:SS') from dual";
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:"+ConnectionString);
stmt = con.createStatement();
rs = stmt.executeQuery(querytime);
while(rs.next()) {
utc_time = rs.getString(1);
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
stmt.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
String query = "select * from table where to_char(date, 'hh24:mi:ss') = '"+utc_time+"'";
index++;
logger.info("Time (UTC): "+ utc_time +" {"+(index)+"}");
try {
Class.forName("oracle.jdbc.driver.OracleDriver");
con = DriverManager.getConnection("jdbc:oracle:thin:"+ConnectionString);
stmt = con.createStatement();
rs = stmt.executeQuery(querytime);
while( rs.next() ){
//save the result into an arraylist
arraycounter++;
}
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (SQLException e) {
e.printStackTrace();
} finally {
try {
rs.close();
stmt.close();
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
为什么会这样?
是否有更好的方法使用UTC时间 我的Oracle DB在RAC上,实例的时间不同步。 我检查输入一个实例并检查时间,然后输入另一个实例并检查时间 要了解您是在什么情况下运行的,可以执行以下操作:
从v$instance中选择实例名称代码>
为了连接到数据库的特定实例,还可以在连接描述符中指定特定实例的实例名称。如果您具有Oracle Real Application Clusters配置,则此功能非常有用。例如,以下连接描述符指定与sales.us.acme.com关联的sales1的实例名称
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=sales-server)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=sales.us.acme.com)
(INSTANCE_NAME=sales1)))
您可以在Oracle SQL Developer上指定,因为您的SID=sales1我的Oracle DB位于RAC上,并且实例的时间不同步。
我检查输入一个实例并检查时间,然后输入另一个实例并检查时间
要了解您是在什么情况下运行的,可以执行以下操作:
从v$instance中选择实例名称代码>
为了连接到数据库的特定实例,还可以在连接描述符中指定特定实例的实例名称。如果您具有Oracle Real Application Clusters配置,则此功能非常有用。例如,以下连接描述符指定与sales.us.acme.com关联的sales1的实例名称
(DESCRIPTION=
(ADDRESS=(PROTOCOL=tcp)(HOST=sales-server)(PORT=1521))
(CONNECT_DATA=
(SERVICE_NAME=sales.us.acme.com)
(INSTANCE_NAME=sales1)))
您可以在Oracle SQL Developer上指定作为SID=sales1的数据库服务器是否与代码位于同一个框中?如果将连接con
对象保持在循环之外,仍然会发生吗?不会。@biziclop数据库服务器是远程的。如果您在rac上,则一些查询在第一个实例上,其他查询在第二个实例上。如果实例具有不同的日期时间设置,则会得到不同的结果。调用您的DBA。不要从v$instance中选择instance\u name
返回实例名称,或者这是一个完全不同的东西?数据库服务器是否与代码位于同一个框中?如果将连接con
对象保持在循环之外,仍然会发生吗?不会。@biziclop数据库服务器是远程的。如果您在rac上,则一些查询在第一个实例上,其他查询在第二个实例上。如果实例具有不同的日期时间设置,则会得到不同的结果。调用您的DBA。不要从v$instance中选择instance\u name代码>返回实例名,或者这是完全不同的事情?