java - 停止 Java 时不执行存储过程

标签 java mysql jpa stored-procedures eclipselink

我在 MySQL 中创建了一个存储过程,并使用 JPA EclipseLink 从 Java 应用程序中调用它。一旦调用该过程,它里面就有一个“sleep(sec)”方法,然后它会成功执行某些操作,除非应用程序关闭,看起来该过程也被取消了,这不是我想要的。我尝试使用 JDBCPreparedStatements 进行同样的操作,得到相同的结果。即使应用程序在过程调用后关闭,是否有任何解决方法可以使存储过程正常工作。

存储过程

DELIMITER //
DROP PROCEDURE IF EXISTS session_procedure//
CREATE PROCEDURE session_procedure
(
IN userID INT
)
BEGIN
SELECT SLEEP(30);
UPDATE users 
SET users.Active = 0 
WHERE users.Id = userID;

END//
DELIMITER ; 

Java 中的过程调用

public static void destroySessionCountdown(EntityManager entityManager, Account akk){
        int accountId = akk.getId();

        StoredProcedureQuery storedProcedure = entityManager.createStoredProcedureQuery("session_procedure");
        storedProcedure.registerStoredProcedureParameter(1, Integer.class, ParameterMode.IN);
        storedProcedure.setParameter(1, accountId);

        try {
            storedProcedure.execute();
        }catch(Exception e){
            e.printStackTrace();
        }
        // force logout
    }

最佳答案

我想当您关闭与数据库的连接时,与其相关的所有进程都被取消,包括该存储过程的运行调用。我认为你无法避免它。

您想要实现的是一种预定的工作。我建议改用cron。对于您展示的过程,使用简单的 SQL 而不是存储过程就足够了。与延迟和执行时间相关的逻辑可以放置在 shell 脚本和 cron 中。

关于java - 停止 Java 时不执行存储过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59524293/

相关文章:

java - 多个||一个 if 语句中的语句

mysql - 更新链接表

java - 通过 Hibernate 使用分离对象删除行和引用

MongoDB到Java的集成

sql - 帮助计算税收和折扣

java - 使用多个输出参数调用 Oracle StoredProcedure

java - 比较Java中的两个表

java - 无法安装 dotCMS

java - 使用 JNI 时出现问题 - 生成头文件时出错

java - SQL连接: can't connect to database in java