JDBC中的Connection.getWarnings()和Statement.getWarnings()之间的区别?

问题描述 投票:0回答:2

我不明白Connection.getWarning()和Statement.getWarnings()之间的区别是什么? Connection.getWarning是否包含所有语句的警告和Statement .getWarnings的主要区别是否包含单个语句的警告?

java jdbc
2个回答
1
投票

Connection.getWarnings返回连接级警告,而Statement.getWarnings返回语句级警告。还有ResultSet.getWarnings,其中(惊讶)返回结果集级警告。换句话说,如果在Connection上调用的方法产生警告,则在连接上添加它,对于在语句上调用Statement的方法,以及在结果集上调用ResultSet的方法。

一般情况下,不应在Statement上报告由Connection发出的警告,并且不应在ResultSet上报告对Statement的警告。例如,参见Statement.getWarnings(),其中说:

注意:如果您正在处理ResultSet对象,那么与该ResultSet对象上的读取相关联的任何警告都将链接在其上,而不是链接到生成它的Statement对象上。

ResultSet.getWarnings()说:

注意:此警告链仅涵盖ResultSet方法引起的警告。由Statement方法引起的任何警告(例如读取OUT参数)都将链接在Statement对象上。

JDBC规范在警告方面不是很详细,它只是说(JDBC 4.3,第8.2节SQLWarning):

当方法生成SQLWarning对象时,不会通知调用方已发生数据访问警告。必须在适当的对象上调用方法getWarnings以检索SQLWarning对象。但是,在某些情况下可能会抛出DataTruncation SQLWarning子类,有关详细信息,请参阅第8-46页的第8.3节“DataTruncation”。

如果发生多个数据访问警告,它们将链接到第一个,并且可以通过递归调用SQLWarning.getNextWarning方法来检索。如果链中没有警告,getNextWarning将返回null。

随后的SQLWarning对象将继续添加到链中,直到执行下一个语句,或者在ResultSet对象的情况下,当光标重新定位时,此时链中的所有SQLWarning对象都将被删除。

在8.3节DataTruncation中:

当从数据源读取数据时发生数据截断,会报告SQLWarning

在第15.1.1节ResultSet类型:

如果驱动程序不支持提供给方法createStatementprepareStatementprepareCall的类型,它会在创建语句的SQLWarning对象上生成Connection

类似的文本可以在15.1.2 ResultSet Concurrency和15.1.3.1确定ResultSet可持续性中找到。

有时JDBC API文档明确提到了警告(例如Connection.setClientInfo​(String, String)ResultSet.next())。

虽然JDBC没有指定,但驱动程序通常也会在Connection上的连接期间报告警告。


1
投票

Connection,Statement的getWarnings方法返回的Object类型没有区别。它的类型为SQLWarning。

但根据它所称的背景,它有所不同。

  1. Connection.getWarnings将检索数据库连接相关的警告,例如数据库连接字符串没有useSSL标志(警告记录在mysql中)。
  2. Statement.getWarnings将检索与sql语句相关的警告,例如在执行插入或删除语句时。
© www.soinside.com 2019 - 2024. All rights reserved.