Java Quartz计划程序未在dropwizard应用程序中执行SQL查询
我已经使用dropwizard框架创建了一个应用程序,其中我注册了一个quartz调度程序作业,计划在每个指定的持续时间后运行。此作业向SQL Server DB触发SQL查询,并迭代结果集,并将数据设置为POJO类,该类随后被推送到队列中 SQL查询具有联合连接多个表的功能,这些表使用where子句中相关表的last_modified_time列获取在增量时间内修改的记录的数据。pom.xml中包含的DB jar是sqljdbc-4.4.0,quartz版本是2.2.1 查询如下所示:Java Quartz计划程序未在dropwizard应用程序中执行SQL查询,java,sql-server,database,quartz-scheduler,dropwizard,Java,Sql Server,Database,Quartz Scheduler,Dropwizard,我已经使用dropwizard框架创建了一个应用程序,其中我注册了一个quartz调度程序作业,计划在每个指定的持续时间后运行。此作业向SQL Server DB触发SQL查询,并迭代结果集,并将数据设置为POJO类,该类随后被推送到队列中 SQL查询具有联合连接多个表的功能,这些表使用where子句中相关表的last_modified_time列获取在增量时间内修改的记录的数据。pom.xml中包含的DB jar是sqljdbc-4.4.0,quartz版本是2.2.1 查询如下所示: SEL
SELECT
u.last_modified_date,
u.account_id,
u.user_id,
ud.is_active
FROM user u WITH (NOLOCK)
JOIN user_details ud with (NOLOCK) ON u.account_id = ud.account_id AND u.user_id = ud.user_id
WHERE u.last_modifed_date > ? AND ud.last_modifed_date <= ?
UNION
SELECT
u.last_modified_date,
u.account_id,
u.user_id,
ud.is_active
FROM user u WITH (NOLOCK)
JOIN user_details ud with (NOLOCK) ON u.account_id = ud.account_id AND u.user_id = ud.user_id
JOIN user_registration_details urd WITH (NOLOCK) ON urd.account_id = u.account_id AND urd.user_id = u.user_id AND urd.reg_id = ud.reg_id
WHERE urd.last_modifed_date > ? AND urd.last_modifed_date <= ?
在一个简单的执行中,它打印日志“开始执行”,然后处理记录并打印“完成执行”。但有时在执行过程中,它会打印日志“开始执行”和“完成执行”,但此查询实际上不会激发到SQL DB
由于我没有得到我在增量时间修改过的记录,所以我使用探查器来检查查询是否确实被触发,并且没有发现这个查询触发到数据库。此外,我还尝试添加log4jdbc库以将查询打印到日志中,但没有为此查询打印日志。with(NOLOCK)
不是MySQL语法。查看向导中的设置,看看是否指定了正确的RDBMS引擎。特别是,它听起来像SQL Server语法
等效的方法可能包括将
事务隔离级别设置为READ UNCOMMITTED
我在这个查询上打开了SQL探查器,并对它进行了过滤,以便我的服务器检查查询是否确实从我的应用程序中命中了数据库,并且发现探查器只能发现它很少命中数据库。所以,我认为在mybatis级别可能会发生一些缓存。然后,我添加了更多日志,并通过启用所有类型的日志对mybatis执行了调试分析,并检查本地级或二级缓存中是否存在任何缓存,但这不是原因。
然后,我使用spy jdbc驱动程序在db级别记录所有查询、参数和所有db信息请求
我的组织正在使用Spunk应用程序显示部署到不同主机服务器的所有应用程序的日志。在splunk中检查日志时,我观察到相同的查询在日志中打印了两次,但当我深入注意到它正在打印一个来自我的实例的查询,另一个来自部署在其他服务器上的不同实例的执行。我登录到该服务器,发现部署在那里的同一个应用程序几个月以来都没有更新。发现多个应用程序实例在同一环境中运行,但在两个不同的服务器上,我无法确定应用程序部署在多个主机上
谢谢@halfer的帮助和赏金 请阅读-总结是,这不是一个理想的方式来解决志愿者,可能会适得其反获得答案。请不要将此添加到您的问题中。@halfer-虽然我在发布此内容时阅读了所有的注意事项,但我忘了浏览此部分。下次我发帖的时候我会解决这个问题。我以前没有在stackoverflow上发表过很多文章,所以有人可以建议我是否需要输入更多信息来获得一些建议或答案。我已经有一段时间没有使用Java了,但是try
-catch
格式看起来不太合适。您正在使用try(statement){statement}catch{statement}
。然而,我认为应该是try{statement}catch{statement}
——我认为圆括号是错误的您的版本是否编译?@halfer-这是try with resources的语法,在任何实现java.lang.AutoCloseable接口的对象中,都可以用这种格式初始化。使用这种方式,它会自动在创建的实例上调用close()方法,因此我们不需要在finally block中显式地编写close语句。我已经更改了标签和描述。但我认为这不会影响/阻止对DB的查询的执行。@Aman:您是否尝试过在SQL Server客户端中手动运行查询,以查看运行时是否有任何问题?@halfer,是的,我试着在SQL server中运行它,但查询没有问题。@Aman:如果可以的话,我建议你在这个问题上更积极一些-你是在并行地研究它吗?赏金将在三天后到期,因此如果你可以添加更多日志或其他内容,现在是时候这样做了@哈弗-谢谢你的帮助!我在做平行的研究,但不能更新,我的坏。我检查了查询是否在会话级别缓存数据,但没有发生。昨天,我启用了所有mybatis日志,并使用spy sqljdbc驱动程序在db和请求级别打印所有日志。我对日志挠头,观察了几个月前部署在另一台服务器上的同一应用程序的几个月前的wierd日志。多个应用程序实例在同一环境中运行是此应用程序实例跳过的问题。我想我们可以解决这个问题。
final ManagedDataSource datasource configuration.getDatabase().build(environment.metrics(), "sql");
// configuration is the configuration class in a drop wizard application and configuration.getDatabase() returns
// the DataSourceFactory with all credentials like user, password and url set into it
try (Connection conn = dataSource.getConnection()) {
int resultSetType = SQLServerResultSet.TYPE_SS_SERVER_CURSOR_FORWARD_ONLY;
int resultSetConcurrency = ResultSet.CONCUR_READ_ONLY;
LOGGER.info("Starting execution: ");
try (PreparedStatement pstmt = conn.prepareStatement(getQuery(), resultSetType,resultSetConcurrency))
{
setQueryParameters(pstmt);
try (ResultSet rs = pstmt.executeQuery();)
{
//process results
}
}
} catch (SQLException | IOException ex) {
LOGGER.error(“Error occurred “ + ex);
}
LOGGER.info("Completed execution: ");