数据库未启动而应用程序先启动,后续初始化拿不到数据

数据库与应用都安装在同一台服务器上,应用程序已部署到service中,并且设置了自动启动。服务器启动时,不知道这两个服务什么时候启动的,哪个先哪个后也不清楚。前台业务办理时,就会报各种错误,比如登录出错等。大神都是如何处理这种问题?

image.png

评论区

JFinal

2025-09-05 17:36

启动都用 systemctl 管理,脚本里头可以配置依赖次序,具体问一下 GPT

北流家园网

2025-09-05 20:50

@JFinal 不太明白,能否给多点信息?

北流家园网

2025-09-05 20:52

用的是window server

杜福忠

2025-09-05 22:59

@北流家园网 好像有启动延时分钟设置,以前用Windows的时候见过。 实在不行的话,就在启动JF项目的时候检查数据库启动没有, 没有启动的话,java执行命令调起系统应用就行了

JFinal

2025-09-06 01:06

@北流家园网 简单来说就是新增一个 /etc/systemd/system/your_project.service

在这个 your_project.service 文件中添加依赖,例如下面是添加了对 mysql 的依赖:
[Unit]
Description=MyApp Service
After=network.target mysqld.service
Requires=mysqld.service

# 其它部分省略

以上的 After、Requires 会让你的应用在 mysql 启动之后再启动。

这个 xxx.service 脚本写完后还要通过 systemctl 让它生效,然后就可以通过如下的方法启动、停止、重启项目了:

systemctl start xxx
systemctl stop xxx
systemctl restart xxx

还可以通过 status 查看状态:
systemctl status xxx

使用 systemctl 还有一个优势,那就是你可以在脚本使你的这个服务在挂掉后自动启动,加个配置即可:
RestartSec = 12s


以下是我在生产环境的一个系统的实际用法:
[Unit]
Description = Stock Service
After = network.target

[Service]
Type = forking
Restart = on-failure
RestartSec = 12s
WorkingDirectory = /opt/app/stock
ExecStart = /opt/app/stock/stock.sh start

[Install]
WantedBy = multi-user.target


注意一下 stock.sh 这个脚本文件,就是 jfinal-club 等等项目中的 .sh 启动脚本,唯一的不同就是里头的 java 命令要使用全路径,例如:

/opt/jdk_1.8/bin/java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} &
而不能是: java -Xverify:none ${JAVA_OPTS} -cp ${CP} ${MAIN_CLASS} &

也就是说,主要的脚本,jfinal club 中已经帮你写好了,你只需要写 xxx.service 这个 systemctl 要求的脚本即可,这个脚本的写法非常简单,可以直接参考我上面的例子。

北流家园网

2025-09-06 08:41

@JFinal 受教了,谢谢,我在linux的系统试一下。

北流家园网

2025-09-06 08:43

还有个问题,JFinalConfig中的onStart方法,每次冷热加载都会执行,而我又在onStart中执行了一些代码,我想做判断,如果是热加载的,就不执行这一段代码,重新启动才会执行,有什么办法做到呢?我试过在JFinalConfig中定义变量,但每次都会执行,也试过Servlet储存变量,也不行,每次热加载都会执行。@JFinal

JFinal

2025-09-06 11:28

@北流家园网 热加载的 class load 不同, 获取 class loader 这个会吧?

if (Thread.currentThread().getContextClassLoader().getClass() == HotSwapClassLoader.class) {
热加载模式之下
} else {
...
}

热门反馈

扫码入社