Windows服务依赖项设置
背景
服务器:Windows Server 2008 R2
数据库:MySQL 8.0
缓存:Redis
API:Java 8,并且部署成Windows服务
前端:Vue,通过nginx,nginx也部署成Windows服务
问题
服务器重启后,API服务未运行,但是呢,手动启动又启动成功了
有点奇怪!
虽说不是什么大问题,但下次万一再重启又没启动起来,岂不是又要手动干预?
于是查了下日志,报这个错
ERROR: init datasource error
com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174)
at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64)
at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:833)
at com.mysql.cj.jdbc.ConnectionImpl.<init>(ConnectionImpl.java:453)
at com.mysql.cj.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:246)
at com.mysql.cj.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:198)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:156)
at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:227)
at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:150)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1653)
at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1717)
at com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:914)
证明Java程序启动时连接数据库失败。
而手动启动又正常,于是破案了——Java服务先于MySQL服务启动了,数据库还没准备好Java程序就去连接了……
解决办法
设置Java程序的服务启动依赖关系
命令
sc config funds-center-server depend=MySQL80
其中“funds-center-server”是Java服务名称,“MySQL80”是数据库服务名称,以下图框出来的名称为准
设置成功后,即解决问题。
后记
还可以添加多个依赖项,命令也很简单,用“/”分开即可,如下所示:
sc config funds-center-server depend=MySQL80/Redis