Java 使用jdbc时的日志记录问题

Java 使用jdbc时的日志记录问题,java,mysql,logging,jdbc,Java,Mysql,Logging,Jdbc,我第一次使用jdbc,并从一个包含我之前编写的sql查询的文件中读取数据。虽然查询已正确执行,并且我的程序继续运行,没有任何明显的问题,但在我使用语句.executeBatch()之后,我无法再将任何内容写入日志 -我正在使用java.util.logging来使用文件处理程序进行日志记录。要读取“.sql”文件,我使用的是BufferedReader和FileReader。我知道我没有分享很多代码来完全理解上下文,但这就是我记忆中的全部内容。使用后我将关闭所有的阅读器 你知道有什么问题吗 My

我第一次使用jdbc,并从一个包含我之前编写的sql查询的文件中读取数据。虽然查询已正确执行,并且我的程序继续运行,没有任何明显的问题,但在我使用
语句.executeBatch()之后,我无法再将任何内容写入日志

-我正在使用
java.util.logging
来使用
文件处理程序进行日志记录。要读取“.sql”文件,我使用的是
BufferedReader
FileReader
。我知道我没有分享很多代码来完全理解上下文,但这就是我记忆中的全部内容。使用后我将关闭所有的阅读器

你知道有什么问题吗

MyLogger.log(Level.WARNING, "it does write");
statement.executeBatch();
MyLogger.log(Level.WARNING, "it doesn't write anymore");
statement.close();
MyLogger.log(Level.WARNING, "still doesn't");
谢谢

edit:MyLogger是一个带有statig log方法的类

edit2:@Tim Biegeleisen
语句。executeBatch()
返回一个int数组,每批一个。我试过:

try {
            int[] results = statement.executeBatch();
            for (int result : results)
            {
                if (result == Statement.EXECUTE_FAILED) 
                {
                    MyLogger.log(Level.SEVERE, "batch failed, but driver seems to still be alive.");
                    System.out.println("batch failed, but driver seems to still be alive.");
                }
            }

        } catch (SQLException e) {
            MyLogger.log(Level.SEVERE, "the batch failed, and the driver died too.");
            System.out.println("the batch failed, and the driver died too.");
        }
它没有打印和记录任何内容


edit3:我想我对关机挂钩要求太高了。我不熟悉它,所以我不确定到底是什么问题。

对我来说最有可能的解释是,您的代码在点击
executeBatch()
时正在滚动。在此之后,对记录器的后续调用似乎不起作用,因为它们根本没有被命中。测试这一点的一个简单方法是在调用
executeBatch()
的过程中使用try-catch块:

try {
    int result = statement.executeBatch();
    if (result == Statement.EXECUTE_FAILED) {
        MyLogger.log(Level.ERROR, "batch failed, but driver seems to still be alive.");
    }
} catch (SQLException e) {
    MyLogger.log(Level.ERROR, "the batch failed, and the driver died too.");
}

在我看来,最有可能的解释是,您的代码在点击
executeBatch()
时正在滚动。在此之后,对记录器的后续调用似乎不起作用,因为它们根本没有被命中。测试这一点的一个简单方法是在调用
executeBatch()
的过程中使用try-catch块:

try {
    int result = statement.executeBatch();
    if (result == Statement.EXECUTE_FAILED) {
        MyLogger.log(Level.ERROR, "batch failed, but driver seems to still be alive.");
    }
} catch (SQLException e) {
    MyLogger.log(Level.ERROR, "the batch failed, and the driver died too.");
}
我想我对我的关机挂钩要求太高了。我对它不熟悉,所以我不确定到底是什么问题

请参阅:。 如果您试图在关机挂钩中执行日志记录,那么您正在使用LogManager$Cleaner线程

作为创建自定义关闭挂钩的变通方法,您可以创建自定义处理程序并将其安装在根记录器上。 LogManager$Cleaner的第一个操作是关闭记录器上所有已安装的处理程序。 清洁器调用自定义处理程序上的close后,您可以执行以下操作之一:

  • 让LogManager$Cleaner在处理程序中运行关闭代码
  • 使用和查找自定义关机挂钩,它将阻止cleaner线程 我想我对我的关机挂钩要求太高了。我对它不熟悉,所以我不确定到底是什么问题

    请参阅:。 如果您试图在关机挂钩中执行日志记录,那么您正在使用LogManager$Cleaner线程

    作为创建自定义关闭挂钩的变通方法,您可以创建自定义处理程序并将其安装在根记录器上。 LogManager$Cleaner的第一个操作是关闭记录器上所有已安装的处理程序。 清洁器调用自定义处理程序上的close后,您可以执行以下操作之一:

  • 让LogManager$Cleaner在处理程序中运行关闭代码
  • 使用和查找自定义关机挂钩,它将阻止cleaner线程

    什么是MyLogger?它是一个记录器实例(名称不正确),还是一个包含静态日志方法的类?如果它是一个类,那么您确实需要发布该类的代码,至少。。。。还有你的日志配置。我给了你一个更具推测性的答案,但它至少可以让你排除一些可能的解释。MyLogger确实是一个带有statig log方法的类,我想这是一个相当标准的类。我明天上班时会添加更多代码。MyLogger是什么?它是一个记录器实例(名称不正确),还是一个包含静态日志方法的类?如果它是一个类,那么您确实需要发布该类的代码,至少。。。。还有你的日志配置。我给了你一个更具推测性的答案,但它至少可以让你排除一些可能的解释。MyLogger确实是一个带有statig log方法的类,我想这是一个相当标准的类。我明天上班的时候会添加更多的代码。问题是,只是myLogger没有写入我的日志文件。代码的其余部分都工作正常,我在MyLogger.log('bla')崩溃前后都使用了警报,它们很好地弹出。在任何情况下,请在有机会时实现此代码。即使没有异常,您也可能会得到一个
    EXECUTE\u FAILED
    响应,这可能是日志记录器死亡的原因。我假设这行代码上发生了一些事情。一旦我们排除它,我将删除它。当然,我会在早上做的第一件事。@RBayo也许你可以在这里添加一个关于实际发生的事情的简短评论。我想问题是我,不理解关机挂钩。我的意思是,我仍然完全不知道,但我现在假设我不打算在它里面做繁重的任务。事实是,只是我的日志没有写入我的日志文件。代码的其余部分都工作正常,我在MyLogger.log('bla')崩溃前后都使用了警报,它们很好地弹出。在任何情况下,请在有机会时实现此代码。即使没有异常,您也可能会得到一个
    EXECUTE\u FAILED
    响应,这可能是日志记录器死亡的原因。我假设这行代码上发生了一些事情。一旦我们排除它,我将删除它。当然,我会在早上做的第一件事。@RBayo也许你可以在这里添加一个关于实际发生的事情的简短评论。我想问题是我,不理解关机挂钩。我的意思是,我仍然完全不知道,但我现在认为,我不打算在IT内部做繁重的工作,因为我需要信息;这在将来可能会很有价值;这可能是有价值的