数据库访问问题抛出什么异常

发布于 2025-01-10 07:20:28 字数 1110 浏览 0 评论 0原文

我正在使用带有 springboot 的 SQL Server 数据库。
我想处理数据库访问问题(如果数据库由于某种原因无法访问,我想捕获抛出的异常)。

在我的本地环境中,我使用此映像“mcr.microsoft.com/mssql/server:2019-latest”中的 Docker SQL Server 数据库。当在查询之前数据库无法访问时,我得到 JDBCConnectionException

在我的 preprod 环境中,令我惊讶的是,我得到了异常 SqlServerException。 我的本地环境和 preprod env 之间的唯一区别是:

  • 在本地我使用 SQL Server Docker 容器(因此为了模拟数据库访问问题,我停止容器)
  • ,在 preprod env 中,我在 cloudfoundry 中使用 Azure SQL 数据库。所以我只是从我的应用程序中解除数据库绑定来模拟数据库访问问题。

那么我可能会捕获什么异常来确保处理数据库无法访问的问题?

@Service
public class MyService {
  @Autowired
  Repository repository;

  public void getDataFromBd(){
    try {
      repository.findAllData();
    } catch (JDBCConnectionException e) {
      log.error("The database is inaccessible");
      processDatabaseInaccessible(e);
    }
  }
}

I m using a SQL Server database with springboot.
I want to handle database access issue (if the database becomes inaccessible for some reason, I want to catch the exception thrown).

In my local environment I'm using Docker SQL Server database from this image 'mcr.microsoft.com/mssql/server:2019-latest'. And when the database is inaccessible just before my query, I get the JDBCConnectionException

In my preprod environment, to my great surprise, I get the exception SqlServerException.
The only differences between my local and preprod env are:

  • in local I use SQL Server Docker container (so to simulate database access issue, I stop the container)
  • in preprod env, I'm using Azure SQL database in cloudfoundry. So I just unbind the database from my app to simulate database access issue.

So what exception might I catch to be sure to handle database inaccessible issue?

@Service
public class MyService {
  @Autowired
  Repository repository;

  public void getDataFromBd(){
    try {
      repository.findAllData();
    } catch (JDBCConnectionException e) {
      log.error("The database is inaccessible");
      processDatabaseInaccessible(e);
    }
  }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

多像笑话 2025-01-17 07:20:28

由于与不同 SQL 实例的连接会引发不同的异常,因此为每个实例设置一个 catch 块是有意义的:

@Service
public class MyService {
  @Autowired
  Repository repository;

  public void getDataFromBd(){
    try {
      repository.findAllData();
    }
    catch (JDBCConnectionException e) {
      log.error("The database is inaccessible");
      processDatabaseInaccessible(e);
    }
    catch (SqlServerException e) {
      log.error("The database is inaccessible");
      processDatabaseInaccessible(e);
    }
  }
}

就个人而言,我还会在其中放置一个通用异常 catch 块。

Since connections to different SQL instances are throwing different exceptions it makes sense to have a catch block for each:

@Service
public class MyService {
  @Autowired
  Repository repository;

  public void getDataFromBd(){
    try {
      repository.findAllData();
    }
    catch (JDBCConnectionException e) {
      log.error("The database is inaccessible");
      processDatabaseInaccessible(e);
    }
    catch (SqlServerException e) {
      log.error("The database is inaccessible");
      processDatabaseInaccessible(e);
    }
  }
}

Personally I'd also put a generic exception catch block in there as well.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文