我有一个cron作业每30秒运行一次,检查未结束的游戏。我将ExecutorService
用于固定线程池private ExecutorService executor=executors.NewFixedThreadpool(2);
。cron作业调用此方法:
public void initializeForStreaming(Game game) {
dispatching.add(game.getPlatformGameId());
Failsafe.with(retryPolicy).with(executor).runAsync(() -> {
Game updatedGame = gameService.updateGameStatus(game.getId(), GameStatus.STREAMING);
log.info("{} - game {} was changed to status {}", Thread.currentThread().getName(), game
.getName(),
GameStatus.STREAMING);
streamingService.pollStreamedGames(StreamedGames.builder().game(updatedGame).build());
}).exceptionally((e) -> {
log.error("Failed to poll game: {}", e.getMessage(), e);
return null;
}).thenRun(() -> {
dispatching.remove(game.getPlatformGameId());
gameService.updateGameStatus(game.getId(), GameStatus.ENDED);
log.info("{} - game {} was changed to status {}", Thread.currentThread().getName(), game
.getName(),
GameStatus.ENDED);
});
}
其中department
是concurrentskiplistset
。在PollStreadGames
方法内部,我在do-while
循环中调用一个api,直到没有下一个页面。在这个方法中,我想更新数据库,以记住我最后看到的页面。
@Override
public void pollStreamedGames(StreamedGames streamedGames) {
try {
...
do {
...
if (!response.getEvents().isEmpty()) {
pagesThisIteration++;
CompletableFuture.runAsync(() -> {
gameService.updateCurrentGamePosition(streamedGames.getGame());
}
);
sleep(5000);
}
} while (response.getNextPageToken() != null);
} catch (ResourceAccessException e) {
log.error("reading API failed: {}", e.getMessage(), e);
}
}
是否可以在一个线程中更新数据库,然后启动另一个线程,其中数据库再次更新?
答案是,您可以这样做,但风险较小(如果在上面两种情况下使用单线程进行更新,风险会小一些),因为您使用的是并行处理。最好用一个线程同时完成这两个操作。在使用并行处理更新带有主键的记录集之前,我会三思而后行。但是,我建议您使用下面这样的批处理:
map
int empsize=employeeMap.size();
对于(int i=0;i
int id=EmployeeMap.getPrimaryKey();--这是您要做的
字符串emp[]=新字符串[id];
从表t中更新id,其中t.id在(EMP[])中;
}
这是一种同步方式的批处理,它降低了并行处理复杂性的风险。
在我的测试用例中,我有一个事务方法,它创建用户,然后在从数据库检索该用户的不同线程中调用异步方法。在下面的代码中,在db中找不到用户,dao返回null。如何确保不同线程的数据都在那里?冲洗似乎没有帮助。我需要手动提交吗?将隔离级别设置为READ_Uncommitted也没有帮助。 交易服务
我对Android很陌生,我试图弄清楚片段和活动应该如何协同工作。我有一个非常丑陋的布局。1个活性和1个“根”片段。当用户单击左侧菜单时,片段被片段管理器替换。 我假设上面的代码应该用新的片段替换当前片段。片段实际上总是空的。我不知道为什么。 在onCreateView的RootFrament Fragment1是默认创建的。 在rootFragment的onCreateView中,rootFra
问题内容: 我有一个线程需要读取平面文件并进行解析。我需要创建一个新线程来解析该文件的某些部分,然后此线程将需要更新原始实体的状态,原始实体也将通过原始线程对其进行解析和更新。如何处理这种情况? 我收到的平面文件包含以下示例记录: 首先,该文件以状态保存在数据库中。现在,所有以或开头的记录都需要在单独的线程中进行处理。成功解析后,两个线程都将尝试将数据库中此文件对象的状态更新为。在某些情况下,我得
问题内容: 我有一个线程需要读取平面文件并进行解析。我需要创建一个新线程来解析该文件的某些部分,稍后该线程将需要更新原始实体的状态,原始实体也将对其进行解析和更新。如何处理这种情况? 我收到的平面文件包含以下示例记录: 首先,该文件以状态保存在数据库中。现在,所有以或开头的记录都需要在单独的线程中进行处理。成功解析后,两个线程都将尝试将数据库中此文件对象的状态更新为。在某些情况下,我得到了。 _编
UserViewModel: 用户存储库:
问题内容: 我正在使用()查找PostLikes表中的(PostId,UserId),如果找到该行,则用于生成delete指令并删除基础行,如果未找到该行,则用于生成insert命令并使用将该行插入表中。但是该行未插入数据库中的表中。这是我到目前为止所做的 和表 PostLikes(LikeId,PostId,UserId) 问题答案: 有几个问题: 您正在寻找重复使用相同的命令,这两个检测行是否