所以,场景是我正在做一些数据库操作,最后提交/回滚,然后连接关闭。但是连接关闭也会抛出SQLException。
在这种情况下,最好的方法是什么?
在#1的情况下,调用函数永远不会知道出了问题。
我想你自己回答了:2.接住并抛出异常,以便调用函数可以处理它,这有帮助吗?
这被称为“封装”的面向对象基本规则之一所涵盖,该规则坚持我们不会将类的内部状态暴露给其协作者。这对问题的影响是,一个适当分解的类不应该将SQL异常传播到使用它的类(通常在更高层)。
确切地说,限制是您不会将SQL类公开到更高的一层,并且在三层应用程序的情况下,人们希望更高的一层包含业务逻辑。业务逻辑不应该知道任何关于SQL的信息——这就是数据库/存储库层的用途。因此,所有SQL异常都应该在层边界处进行转换。
这种方法的好处是您可以交换存储库的实现,而无需更改系统的其余部分。理论上,您可以用SQL的方法替换SQL,并且存储库的客户端永远不需要知道。即使您在运行时这样做了。
在Java中,我们通常通过在每层创建单独的jar文件(maven模块)来确保不会将状态(如SQL感知)错误地暴露到不同的层,以便控制层的依赖关系。如果我们不将SQL库添加为业务逻辑库的依赖项,那么如果我们在该层中引用它,就会出现编译错误。
因此,为了充分回答您的问题,存储库层应该处理数据库连接,该层的客户端,即业务逻辑,不需要知道SQL错误。您应该捕获异常并决定在数据库代码中如何处理它。如果您不能做出有效的决定,那么您应该为更高级别的抽象(业务逻辑)创建一个异常来处理。您如何处理特定问题是特定于应用程序的;如果tx已提交,并且您正在docker容器中运行单线程微服务,您可能只是记录问题并终止容器,但如果您在需要恒定数据库连接的GUI应用程序中,您可能会向业务逻辑层抛出自定义“连接”异常,这可能会生成一个异常,该异常被用户交互界面捕获,以向用户显示问题以供解决。
问题内容: 有没有一种优雅的方法来处理块中引发的异常? 例如: 如何避免在/ 在块? 问题答案: 我通常这样做: 别处:
我建立了一个数据库连接。然后,我尝试建立连接,如果出现异常,则返回。在代码的下面,我有一个Finally块,我打算用它作为一个catch all来关闭连接。 然而,如果初始连接失败,它将跳转到我的con所在的最后一个块。close()引发空指针异常。最好的办法是什么?有没有办法测试con是否为null?我试过if(con.isValid(0))和con。等于(null)和con==null,它们都
问题内容: 我试图了解哪些是应用程序的“物理”限制。 在客户端: 在服务器端: 在OSX中达到文件限制(256)时,统计信息如下 让我感到困惑的是: 如果我强行关闭连接(这是我想对客户端执行的操作,为什么我仍在使用文件句柄(因此达到文件限制),请执行以下操作:编辑:添加延迟似乎使服务器可以保持呼吸并且永远不会达到文件限制)? 有没有一种方法可以完全关闭套接字,以便可以确定很少达到文件限制(我知道可
问题内容: 通常,我会遇到必须吞下/ 块中清理代码所引发的异常以防止原始异常被吞咽的情况。 例如: 假设记录任何异常不是方法块范围内的选项,而是由调用and 方法的代码完成。 吞没和方法抛出的异常是一个好主意吗?如果没有,什么是处理上述情况的更好方法,以免吞下异常? 问题答案: 我不喜欢捕捉和抛出异常。 如果你抓住它,做 一些 与它-即使它只是记录例外。 如果您不能执行任何操作,请不要捕获它-在方
我正在关注Quarkus-反应指南入门,并在使用服务器发送的事件的示例中与ClosedChannel异常进行斗争。resteasy资源处理程序使用vert。引擎盖下的x和netty以及反应流的SmallRye Mutiny库。 资源处理程序以1秒的间隔生成count条消息。 消息会根据请求发送到客户端。客户端是嵌入到html页面中的简单javascript函数: 在客户端,所有工作都按预期进行。事
这个问题似乎不是关于特定的编程问题、软件算法或主要由程序员使用的软件工具。如果您认为这个问题在另一个Stack Exchange网站上是主题,您可以留下评论来解释这个问题在哪里可以得到回答。 我们构建了一个定制的Kafka Connect sink,它反过来调用一个远程REST API。我如何将背压传播到Kafka Connect基础设施,以便在远程系统比内部使用者向put()传递消息慢的情况下,