我第一次使用jdbc并从包含我之前写过的sql查询的文件中读取。虽然查询已正确执行且我的程序没有任何明显问题,但在我statement.executeBatch();
之后,我再也无法在日志中写入任何内容。
-I' m使用java.util.logging
使用FileHandler
进行日志记录。阅读我的" .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");
由于
编辑: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:我想我的关键钩子太多了。我不熟悉它,所以我不确定究竟是什么问题。
答案 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的第一个操作是关闭记录器上所有已安装的处理程序。 清洁工在自定义处理程序上调用关闭后,您可以执行以下操作之一: