我目前正在开发一个实现网络抓取的java项目,到目前为止我遇到了一个奇怪的问题。
以下是我的工作:
这实际上很长,可能会持续数天,所以我需要让脚本运行。问题是,有时它会无缘无故地停止(没有错误,没有消息,没有窗口关闭;它只是停止了,我需要按下我的一个按钮重新启动它)。我已经实现了一个短代码,它从停止的地方重新启动应用程序。我相信这是数据库的连接问题,所以我想知道如何解决它。
我使用一个静态类,它在应用程序的开头创建了这个类的实例,然后我使用这个类中的静态方法来运行我的查询,例如:
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;
}
我不确定我是做正确的事情让我的连接永远持续(理论上)并最终关闭它,当它完成迭代我的链接。
答案 0 :(得分:1)
你在这里跳了一下枪。没有证据表明数据库连接确实存在问题。通常,如果您遇到数据库连接问题,当您尝试对其执行操作,超时等时,您将从连接中获得异常。
你需要:
向您的应用程序添加详细的日志记录,这样您就可以看到它在进展过程中正在做什么,以及它在停止时尝试做什么;以及
使用-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
,查看应用程序的条目/条目。查看连接是idle
,idle in transaction
,还是运行语句,以及该语句是什么。如果它正在运行一个语句,请查询pg_locks
以查看它是否在未经授权的锁上被阻止。