我目前正在开发一个实现网络抓取的java项目,到目前为止我遇到了一个奇怪的问题。
这就是我所做的:
- 获取与网站页面的 URL 连接
- 解析 HTML 代码以获取一些内容 (OpenData)
- 将内容添加到我的数据库中
- 移至下一页并返回第 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 javadoc和 logging 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/