Quartz 调度程序未在 dropwizard 应用程序中执行 SQL 查询



我有一个使用 dropwizard 框架创建的应用程序,其中我注册了一个石英调度程序作业,计划在每个指定的持续时间后运行。此作业触发对 SQL Server DB 的 SQL 查询,并循环访问结果集,并将数据设置为 POJO 类,该类稍后将推送到队列。

SQL 查询具有 UNION 联接多个表,该表使用 where 子句中相关表的last_modified_time列获取在增量时间内修改的记录的数据。pom中包含的数据库jar.xml是sqljdbc-4.4.0,石英版本是2.2.1

查询如下所示:

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 <= ?

此查询由简单的连接语句和结果集调用,如下所示

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: ");

在简单执行中,它打印日志"开始执行",然后处理记录并打印"已完成执行"。但有时在执行期间,它会打印日志"正在执行"和"已完成执行",但此查询实际上并未触发到 SQL DB。

由于我没有获得在该增量时间内修改的记录,因此我放置了探查器来检查查询是否实际触发,并且没有发现此查询向数据库触发。此外,我尝试添加 log4jdbc 库 http://code.google.com/p/log4jdbc/wiki/FAQ 将查询打印到日志中,但没有为此查询打印日志。

with (NOLOCK)不是MySQL语法。 查看向导中的设置,看看是否指定了正确的 RDBMS 引擎。 特别是,它听起来像SQL Server语法。

等效项可能涉及将TRANSACTION ISOLATION LEVEL设置为类似READ UNCOMMITTED

我对此查询打开了 SQL 探查器,并为我的服务器对其进行了筛选,以检查查询是否确实从我的应用程序命中数据库,并发现探查器只能发现它很少命中数据库。所以,我认为在mybatis级别可能会发生一些缓存。然后我添加了更多日志,并通过启用所有类型的日志记录对 mybatis 执行调试分析,并检查本地级别或二级缓存 mybatis 配置是否有任何缓存,但这不是原因。 然后我使用间谍jdbc驱动程序log4jdbc驱动程序在数据库级别记录所有查询,参数和所有数据库信息请求。

我的组织正在使用 Spunk 应用程序来显示部署到不同主机服务器的所有应用程序的日志。在 splunk 中检查日志时,我观察到相同的查询在日志中打印了两次,但当我深入注意到它打印了一个来自我的实例和另一个来自部署在其他服务器上的不同实例的执行时。我登录到该服务器,发现部署在那里的相同应用程序几个月来都没有更新。发现是在同一环境中运行多个应用程序实例,但在两个不同的服务器上运行,我无法确定应用程序部署在多个主机上。

谢谢@halfer所有的帮助和赏金。

最新更新