spring boot连接数据库报错问题

一、问题说明

05-17 10:29:37 .669 lmain ERROR org.springtramework. boot. 1iaanostics .LoggingFailureAnalysisReporter 

**************************
APPLICATION FAILED TO START***************************

Description:
Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. Reason: Failed to determine a suitable driver class

Action:
Consider the following:
If you want an embedded database (H2,HSQL or Derby), please put it on the classpath.
If you have database settings to be loaded from a particular profile you may need to activate it (no profiles are currently active).

在这里插入图片描述

这里是spring boot连接数据库,在启动项目时的报错。
这种报错在创建一个新的项目时,填写完配置,在本地启动项目时,很常见的报错。
此问题告知我们,项目启动连接数据库时,找不到配置连接。我们普通的排查是,步骤是查看配置是否书写规范,在查看数据库驱动是否引入。新项目创建一般都是这两个问题引起。
对于这个问题网上还有一种存在的问题,就是spring boot项目没有自动加载到application.yml,那么我们在启动类上添加这个注解就可以了

@SpringBootApplication(exclude={DataSourceAutoConfiguration.calss})

DataSourceAutoConfiguration.class会自动查找application.yml或者properties文件里的spring.datasource.*相关属性并自动配置单数据源

但这次需要说明的问题,却不是以上问题引起的。下面我做个一个简要的说明。
事情是老项目部署新环境中且需要更换就数据库,由原来的的MySQL替换为国产瀚高数据库,我处理的方式是将驱动替换掉,在对配置中的url和driver-class-name进行替换就可以了。除此外我将原来的nacos-config做了去除,因为这是项目的配置基本不会改变,所以做了操作。
这些动作都作完后,在本地启动运行没有任何问题,但一部署到线上环境,就报上面错误。起初还以为是数据库安装问题,找了半天没发现原因,版本也是做了更新还是存在这个问题。
最后发现是启动脚本的问题,之前脚本是针对是nacos-config配置启动脚本。脚本中指定需要nacos-config配置所以出现上面报错,因为我们线上环境没有安装nacos。所以就获取不到配置,导致上面报错。
更改启动脚本就可以了。折腾了一天,好在找到了问题,并顺利启动。

加载nacos-config配置启动项目的.sh脚本

#!/bin/sh
java_option="-Xverify:none -XX:+UseParallelGC -Xms512M -Xmx512M"
for filename in *;
do
if [ "${filename##*.}" = "jar" ]
then
  JAR_NAME=$filename
fi
done
#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0     
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}

#启动方法
start(){
  is_exist
  if [ $? -eq "0" ]; then 
    echo "${JAR_NAME}已经启动, PID=${pid}" 
  else 
    nohup java -server $java_option -jar $JAR_NAME --spring.profiles.active=zdds-test  >> server.log &
    PID=$(echo $!)
    echo "${JAR_NAME}启动成功,PID=$!"
   fi
  }
#停止方法
stop(){
  PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
 if [ -n "$PID" ];then
        echo "$JAR_NAME:准备结束,PID=$PID"
        kill -9 $PID
   PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
        while [ -n "$PID" ]
        do
          PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
        done
        echo "$JAR_NAME:成功结束"
 else
        echo "$JAR_NAME:未运行"
fi
}

status(){
	 PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
 if [ -n "$PID" ];then
         echo "$JAR_NAME:正在运行,PID=$PID"
       else
         echo "$JAR_NAME:未运行"
       fi

}
case "$1" in 
 start)
  start
  ;;
 stop)
  stop
  ;;
 restart)
  stop
  start
  ;;
 status)
  status 
 ;;
 *)
 echo "请输入:start|stop|restart|status"
 exit 1
 ;;
esac

加载项目配置启动.sh脚本

#!/bin/sh
java_option="-Xverify:none -XX:+UseParallelGC -Xms512M -Xmx512M"
for filename in *;
do
if [ "${filename##*.}" = "jar" ]
then
  JAR_NAME=$filename
fi
done
#检查程序是否在运行
is_exist(){
  pid=`ps -ef|grep $JAR_NAME|grep -v grep|awk '{print $2}' `
  #如果不存在返回1,存在返回0     
  if [ -z "${pid}" ]; then
   return 1
  else
    return 0
  fi
}

#启动方法
start(){
  is_exist
  if [ $? -eq "0" ]; then 
    echo "${JAR_NAME}已经启动, PID=${pid}" 
  else 
    nohup java -server $java_option -jar $JAR_NAME  >> server.log &
    PID=$(echo $!)
    echo "${JAR_NAME}启动成功,PID=$!"
   fi
  }
#停止方法
stop(){
  PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
 if [ -n "$PID" ];then
        echo "$JAR_NAME:准备结束,PID=$PID"
        kill -9 $PID
   PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
        while [ -n "$PID" ]
        do
          PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
        done
        echo "$JAR_NAME:成功结束"
 else
        echo "$JAR_NAME:未运行"
fi
}

status(){
	 PID=`ps -ef |grep $(echo $JAR_NAME | awk -F/ '{print $NF}') | grep -v grep | awk '{print $2}'`
 if [ -n "$PID" ];then
         echo "$JAR_NAME:正在运行,PID=$PID"
       else
         echo "$JAR_NAME:未运行"
       fi

}
case "$1" in 
 start)
  start
  ;;
 stop)
  stop
  ;;
 restart)
  stop
  start
  ;;
 status)
  status 
 ;;
 *)
 echo "请输入:start|stop|restart|status"
 exit 1
 ;;
esac

在开发中遇到问题,可以加本人微信进行交流:
在这里插入图片描述

### Spring Boot 数据库连接报错解决方案 在开发基于Spring Boot的应用程序时,如果遇到数据库连接失败的情况,通常可以通过以下几个方面来排查并解决问题。 #### 1. **检查 `application.properties` 文件配置** 确保项目的 `application.properties` 或者 `application.yml` 配置文件中包含了正确的数据库连接参数。以下是标准的 MySQL 连接配置示例: ```properties spring.datasource.username=root spring.datasource.password=123456 spring.datasource.url=jdbc:mysql://localhost:3306/kob?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver ``` 上述配置需注意以下几点: - 确认用户名 (`username`) 和密码 (`password`) 是否匹配目标数据库的实际设置[^1]。 - URL 中的时间区参数 `serverTimezone` 应当与服务器所在区域保持一致,推荐使用 `Asia/Shanghai` 对于中国地区[^4]。 - 如果项目中存在特殊字符(如 `&`),应将其转义为 `&` 来避免解析错误[^2]。 #### 2. **确认依赖项是否正确引入** 验证 Maven 或 Gradle 的构建文件中是否存在必要的 JDBC 驱动依赖。对于 MySQL 数据库,Maven 构建文件中的依赖应该类似于以下内容: ```xml <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency> ``` 缺少此依赖可能导致驱动类加载失败。 #### 3. **处理 HikariCP 时间区异常** 如果采用 HikariCP 作为默认的数据源连接池,则可能因时间区不兼容而引发错误。一种常见解决办法是在 URL 参数中指定时间区为 GMT+8: ```yaml spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/test?serverTimezone=GMT%2B8 username: root password: root ``` 另一种方式是通过修改 MySQL 配置文件 `/etc/mysql/my.cnf` 设置全局时间区属性,并重启服务以应用更改: ```bash default-time_zone = '+8:00' service mysql restart ``` #### 4. **排除自动装配冲突** 某些情况下,第三方组件可能会干扰数据源初始化过程。例如,Druid 数据源插件的存在可能引起冲突。此时可以尝试禁用其自动装配功能: ```java @SpringBootApplication(exclude = DruidDataSourceAutoConfigure.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` 以上措施能够有效规避潜在的多数据源管理问题[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值