使用jdbc

时间:2016-11-23 15:20:30

标签: java mysql logging jdbc

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

-I' m使用java.util.logging使用FileHandler进行日志记录。阅读我的" .sql"文件,我使用BufferedReaderFileReader。我知道我并没有分享很多代码来完全理解上下文,但这些都是我从记忆中得到的。我在使用后关闭了所有的读者。

任何想法可能是什么问题?

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

由于

编辑:MyLogger是一个带有statig日志方法的类

edit2: @Tim Biegeleisen statement.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:我想我的关键钩子太多了。我不熟悉它,所以我不确定究竟是什么问题。

2 个答案:

答案 0 :(得分:0)

对我来说最有可能的解释是,您的代码在点击executeBatch()时会翻身。在此之后,对记录器的后续调用似乎不起作用,因为它们根本没有被击中。测试此方法的一种简单方法是使用try catch块围绕您对executeBatch()的调用:

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.");
}

答案 1 :(得分:0)

  

我想我的关键钩子太多了。我不熟悉它>所以我不确定究竟是什么问题。

请参阅:LogManager$Cleaner() can prevent logging in other shutdown hooks。 如果您尝试在关闭钩子中执行日志记录,那么您正在使用LogManager $ Cleaner线程进行竞争。

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

  1. 让LogManager $ Cleaner在处理程序中运行您的关机代码。
  2. 使用Thread APIjoin查找自定义关闭挂钩,它将阻止更干净的线程。