finally中可以操作数据库吗

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了finally中可以操作数据库吗相关的知识,希望对你有一定的参考价值。

finally中可以操作数据库吗
不可以的,finally作为异常处理的一部分,它只能用在try/catch语句中,并且附带一个语句块,表示这段语句最终一定会被执行(不管有没有抛出异常),经常被用在需要释放资源的情况下。

之前在写爬虫的时候数据库连接的频率很高,有时候数据处理的不好,sql报错后,抛出异常但后边的数据库连接没有断开。导致最后数据库连接数过大,不让再连接了(因为是个人库,所以直接重启了一下)。这个释放数据库连接的操作就可以用finally来进行。

首先看一下没有用finally的代码(不能直接运行,能看懂什么意思就行)

复制代码
复制代码
Connection conn;
Statement stmt;
try
  conn = DriverManager.getConnection(url,userName,password);
  stmt = conn.createStatement;
  String sql = "sql";//需要执行的sql
  stmt.executeUpdate(sql);
  stmt.close();
  conn.close();
catch(Exception e)
  e.printStackTrace();

复制代码
复制代码
在程序正常运行的时候,没有异常抛出,没有问题。

但在程序抛出异常(sql出错了),try里面的语句不执行了直接被执行catch里面的语句了,就造成了一个数据库连接没有正常关闭。数据量如果大起来,数据库的最大连接数到达上限,就不再允许创建新的连接了。

然后finally的用处现在就能体现出来了

复制代码
复制代码
Connection conn = null;
Statement stmt = null;
try
  conn = DriverManager.getConnection(url,userName,password);
  stmt = conn.createStatement;
  String sql = "sql";//需要执行的sql
  stmt.executeUpdate(sql);
  stmt.close();
  conn.close();
   catch (SQLException e)
    e.printStackTrace();
  finally
  if(stmt! = NULL)
    stmt.close();
  
  if(conn! = NULL)
    conn.close();
  
  

复制代码
复制代码
这样即使sql运行出错,抛出了异常,在最后的finally代码中再进行一次数据库连接的判断,就可以保证数据库连接资源不会被平白无故的浪费掉。
参考技术A 是可以操作数据库的
1.finally是用于释放资源的关键字,常用于IO流操作和数据库操作中

2.finally一定会执行,除非在执行之前使用退出jvm虚拟机的操作

3.finally执行前,如果使用了return语句,按道理来说,应该是方法都已经返回了,不会执行的,但事实上,在执行return语句时,在完全执行完之前,会先检查是否有finally语句需要执行,如果有,则先执行finally语句再执行完return语句(如果在finally里修改变量值,不影响return的变量值)

4.不可在finally里写return语句

超类中的私有final可以被覆盖吗?

【中文标题】超类中的私有final可以被覆盖吗?【英文标题】:private final in superclass can be overridden? 【发布时间】:2014-02-21 00:24:26 【问题描述】:

哪三个陈述是正确的? (选择三项。)

A.当且仅当 X 是类 X 中的 final 方法 摘要。

B. X 类中的受保护方法可以被 十。

C.私有静态方法只能在其他静态方法中调用 X 类中的方法。

D.类 X 中的非静态公共 final 方法可以在 X 的任何子类。

E.类 X 中的公共静态方法可以由 X 的子类调用 没有明确引用 X 类。

F。与类中的私有 final 方法具有相同签名的方法 X 可以在 X 的子类中实现。

G.类 X 中的受保护方法可以被 X 的子类覆盖 仅当子类与 X 在同一个包中时。

这个问题来自 SCJP。答案是 BEF

我了解 BE,但 F 说该方法是“私有 final”,那么子类如何覆盖此方法,因为它被定义为 final 和私有方法。

请清除F点。

【问题讨论】:

F 没有说任何关于覆盖... final 不能被覆盖。此外,它的真正含义不是被覆盖 non-static, non-final 添加到 B 使其更正确! 【参考方案1】:

答案 F 不是覆盖的示例,它是方法范围的示例。在一个类中声明为private 的方法对该类的子类不可见,因此没有重叠;子类在超类中看不到它可以覆盖的方法。子类有自己的方法void foo(int),完全不知道超类的private void foo(int)

【讨论】:

这不是“范围”,而是“可见性”。 “范围”由. 确定 @EJP 它既不可见也不超出范围,因此可以复制超类的 private final 方法。见docs.oracle.com/javase/specs/jls/se7/html/jls-6.html#jls-6.3【参考方案2】:

我了解 BE,但 F 说该方法是“私有 final”,那么子类如何覆盖此方法,因为它被定义为 final 和私有方法。

这个问题没有提到任何关于覆盖的内容。因为私有方法只存在于该类的上下文中,所以它不参与覆盖。你不能覆盖私有方法,因为私有方法在定义它们的类之外是不可见的。

另一种看待方法是,它们是两个不相关的方法,它们的签名相同纯属巧合。

因为子类中的私有方法不会覆盖超类中的私有方法,所以final 关键字无效。

【讨论】:

我知道这只是一个 Java 测试问题,但是在超类中拥有一个与私有方法具有相同名称和签名的方法是一种不好的做法。导致将来更改父类方法的可见性,可能会导致问题(然后它将变得覆盖!)。 @AmirPashazadeh 不一定。拥有private 成员的全部意义在于子类不应该知道该成员的存在。在最常见的版本控制方案major.minor.micro 中,添加类似这样的可见方法会导致次要版本增加,并且次要版本升级预计需要更改库中子类或实现类型的类。跨度>

以上是关于finally中可以操作数据库吗的主要内容,如果未能解决你的问题,请参考以下文章

Try语句中有return,那么finally中的code会执行吗?什么时候执行?

异常-举例6:finally

final使用

vue中update可以操作data里面的数据吗

可以在 django 中异步执行数据库操作吗?

静态成员final成员面向对象接口