当前位置: 首页 > 知识库问答 >
问题:

在不同线程中更新数据库

赫连琦
2023-03-14

我有一个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);
        });
    }

其中departmentconcurrentskiplistset。在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);
        }
    }

是否可以在一个线程中更新数据库,然后启动另一个线程,其中数据库再次更新?

共有1个答案

颜河
2023-03-14

答案是,您可以这样做,但风险较小(如果在上面两种情况下使用单线程进行更新,风险会小一些),因为您使用的是并行处理。最好用一个线程同时完成这两个操作。在使用并行处理更新带有主键的记录集之前,我会三思而后行。但是,我建议您使用下面这样的批处理:

map employeeMap=new hashmap ();EmployeeMap.Add(某物);

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) 问题答案: 有几个问题: 您正在寻找重复使用相同的命令,这两个检测行是否