【问题标题】:Linux: Java program called from Upstart cannot access mysql databaseLinux:从 Upstart 调用的 Java 程序无法访问 mysql 数据库
【发布时间】:2015-11-10 18:59:50
【问题描述】:

我正在开发一个简单的 java 后台进程,它处理来自套接字连接的数据,然后使用 mysql 连接器 JDBC 驱动程序建立与存储此信息的数据库的连接。我想使用 upstart 将程序用作服务,但是在初始化我的服务后,该过程将在第一次上传尝试访问 JDBC 驱动程序以将数据插入数据库后失败(在 jdbc 注册时不会失败,但是这个尽管我的日志中从未显示堆栈跟踪,但这是我监控输出的最佳假设)。如果我从程序中的 catch 语句中删除退出调用,我可以看到该进程不断接收上传,但实际上并没有数据存储在 mysql 数据库中。

当从控制台正常运行 java 程序时,它会毫无问题地执行。下面 upstart .conf 的部分指向我可以毫无问题地运行的同一个程序。

script

echo $$ > /var/run/uploadclient.pid
exec java -cp /user/server UploadProgram >> /home/user/upload.log

end script

以前有人听说过这样的问题吗?

【问题讨论】:

  • 能否请您发布更多调试信息?它是如何失败的?它会在数据库日志中留下一些错误吗?用户是否拥有所需位置的权限?你的程序会抛出一些状态错误代码吗?

标签: java mysql linux upstart


【解决方案1】:

我想我明白了...当通过 upstart 运行 java 程序时,它会出于某种原因隐藏 stacktrack 错误。这可以通过使用 StringWriter 和 PrinterWriter 捕获堆栈跟踪,然后使用常规 System.out.println() 打印出错误来克服。

问题最终是即使原始类是使用 jdbc 连接器新贵编译的,但在执行期间它要求它位于类路径中。

exec java -cp .:/user/jdbc.jar:/user/server UploadProgram >> /home/user/upload.log

这解决了问题。

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 2019-09-26
    • 2015-02-02
    • 2013-04-14
    • 1970-01-01
    • 1970-01-01
    • 2020-06-12
    • 1970-01-01
    • 2013-07-02
    相关资源
    最近更新 更多