0

我目前正在开发一个实现网络抓取的java项目,到目前为止我面临一个奇怪的问题。

这是我所做的:

  1. 获取与网站页面的 URL 连接
  2. 解析 HTML 代码以获取一些内容 (OpenData)
  3. 在我的数据库中添加内容
  4. 移至下一页并返回步骤 1

这实际上很长,可以持续几天,所以我需要让脚本运行。问题是,有时它会无缘无故停止(没有错误、没有消息、没有关闭窗口;它只是一点点停止,我需要按下我的一个按钮来重新启动它)。我已经实现了一个简短的代码,它从停止的地方重新启动应用程序。我相信这是与数据库的连接问题,所以我想知道如何解决它。

我使用一个静态类,它在应用程序的开头创建这个类的一个实例,然后我使用这个类中的静态方法来运行我的查询,例如:

    ConnexionBDD.con.prepareStatement(query);

public static Connection loadDriver() {
 try {
     Class.forName(Driver);
     con = DriverManager.getConnection(ConnectionString, user, pwd);
     } catch (ClassNotFoundException e) {
    System.err.println("Classe not found : Class.forName(...)");
} catch (SQLException e) {
    System.err.println(e.getMessage());
}
return con;
}

我不确定我是否在做正确的事情以使我的连接永远持续(理论上)并最终在它完成迭代我的链接时关闭它。

4

1 回答 1

1

你在这里有点过火了。没有证据表明数据库连接实际上是问题所在。通常,如果您遇到数据库连接问题,当您尝试对其执行操作、超时等时,您会从连接中获得异常。

你需要:

  • 将详细的日志记录添加到您的应用程序中,这样您就可以看到它在进行时正在做什么,以及在它停止时正在尝试做什么;和

  • 使用其他合适的选项运行它以-Xdebug进行远程调试,因此您可以在它停止时将调试器附加到它并检查它的状态以查看它当时正在做什么。当日志显示程序停止进行时,使用来自 NetBeans、Eclipse 或任何您喜欢附加到程序的调试器用户界面。

对于日志记录,您可以使用java.util.logging. 请参阅javadoc日志记录概述文档

这是一个如何使用 Eclipse 进行远程调试的示例。您将能够为您选择的 IDE 找到类似的指南。Java 也有一个命令行调试器,但它非常痛苦。

您还需要检查程序是否可能崩溃或退出,而不仅仅是停止工作。您应该从程序中捕获任何标准错误输出,并从 shell 检查程序的错误返回代码。还要hs_error在程序运行的目录中查找文件,以防 JVM 崩溃,尽管这也应该在 stderr 上生成输出。

您还应该:

  • 当你建立到 PostgreSQL 的连接时设置一个application_name,这样你就可以很容易地看到你的客户端对数据库做了什么。您可以指定application_name为 JDBC 连接参数,或SET application_name = 'blah'在连接后运行语句。

  • 当日志记录(或者您当前告诉您的程序不再运行)表明程序已停止工作时,pg_stat_activity请在服务器中检查,查看您的应用程序的条目。查看连接是idleidle in transaction还是运行语句,以及该语句是什么。如果它正在运行一条语句,请查询pg_locks它是否被未授予的锁阻塞。

于 2013-07-25T09:07:03.413 回答