Java JDBC : establish a persistent connection which lasts days

标签 java postgresql jdbc

我目前正在开发一个实现网络抓取的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;
}

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

最佳答案

你有点操之过急了。没有证据表明数据库连接确实是问题所在。通常,如果您遇到数据库连接问题,当您尝试对其执行操作、超时等时,您会收到连接异常。

您需要:

  • 向您的应用程序添加详细的日志记录,以便您可以看到它在运行时正在做什么,以及在停止时它试图做什么;和

  • 使用 -Xdebug 和其他合适的远程调试选项运行它,这样您就可以在它停止时附加一个调试器,并检查它的状态以了解它当时正在做什么。当日志记录表明程序停止运行时,使用 NetBeans、Eclipse 或任何您喜欢附加到程序的调试器用户界面。

对于日志记录,您可以使用java.util.logging。请参阅the javadoclogging overview docs .

这是 how to do remote debugging with Eclipse 的示例。您将能够找到适合您选择的 IDE 的类似指南。 Java 也有一个命令行调试器,但它非常痛苦。

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

您还应该:

  • 在建立与 PostgreSQL 的连接时设置 application_name,以便您可以轻松查看客户端对数据库执行的操作。您可以指定 application_name 作为 JDBC 连接参数,或在连接后运行 SET application_name = 'blah' 语句。

  • 当日志记录(或者您当前告诉您的程序不再进行)表明程序已停止工作时,请检查服务器中的 pg_stat_activity,查看一个/多个条目你的申请。查看连接是否空闲事务中空闲或正在运行语句,以及该语句是什么。如果它正在运行语句,请查询 pg_locks 以查看它是否因未授予的锁而被阻止。

关于Java JDBC : establish a persistent connection which lasts days,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17852816/

相关文章:

java - tomcat 8 security 基于表单的身份验证自动登录

java - 查找字符串中不在圆括号 "-"内的破折号 "()"

Java while循环中的Create语句用法

java - Postgresql 更新 JDBC

java - 尝试从两个现有数组创建二维数组

java - Eclipse:PMD 快捷方式(内置、自定义...)

sql - postgresql - 如何获得一行的最小值

postgresql - 使用通配符在 postgresql 中搜索

php - 插入php和pgsql后如何获取返回id

java - 连接数据库时使用 java.util.properties 有什么好处?