Java 何时使用JDBC对连接、语句和结果集调用getWarnings()?

Java 何时使用JDBC对连接、语句和结果集调用getWarnings()?,java,sql,database,jdbc,warnings,Java,Sql,Database,Jdbc,Warnings,在JDBC中,连接、语句和结果集类型都有一个getWarnings()方法,指定该方法生成与该类型对象关联的第一个警告。第二个和后续警告(如果存在)链接到第一个警告(如果存在,如果没有警告,则生成null) 规范规定,在执行某些操作后,与这些类型的对象关联的警告将被清除。例如,读取每一新行时,ResultSet上的警告将被清除 SQLWarning类型是SQLException的子类型。那么,是否会通过异常来表示警告的存在?如果异常的运行时类型是SQLWarning,则该异常将链接到关联的对象

在JDBC中,
连接
语句
结果集
类型都有一个
getWarnings()
方法,指定该方法生成与该类型对象关联的第一个警告。第二个和后续警告(如果存在)链接到第一个警告(如果存在,如果没有警告,则生成
null

规范规定,在执行某些操作后,与这些类型的对象关联的警告将被清除。例如,读取每一新行时,
ResultSet
上的警告将被清除

SQLWarning
类型是
SQLException
的子类型。那么,是否会通过异常来表示警告的存在?如果异常的运行时类型是
SQLWarning
,则该异常将链接到关联的对象

我想知道的是,它可能是特定于驱动程序的,我如何知道何时应该调用
getWarnings()
并期望一个非
null
响应?
换句话说,警告是否存在于JDBC对象上,并且只有在该对象引发异常后才可与
getWarnings()
一起使用?(这个例外就是警告?)

如果我的目标是观察每个警告,我是否应该调用
getWarnings()
在每次JDBC操作后查找警告“只是为了确定”

另一方面,您必须明确 检查是否存在任何SQL警告,因为 它们不是通过网络传播的 标准异常处理 机制。为此,请致电 上的相应getWarnings方法 相关JDBC对象


坦率地说,我从来没有发现自己检查过警告。可能我从未做过任何严肃的事情。

SQLWarning
对象是处理数据库访问警告的
SQLException
的子类

警告不会像异常一样停止应用程序的执行;它们只是提醒用户某些事情没有按计划发生

可以在
连接
对象、
语句
对象(包括
PreparedStatement
CallableStatement
对象)或
ResultSet
对象上报告警告

这些类中的每个类都有一个
getWarnings
方法,您必须调用该方法才能看到在调用对象上报告的第一个警告:

SQLWarning warning = stmt.getWarnings();
if (warning != null)
{
    System.out.println(\"n---Warning---n\");
    while (warning != null)
    {
        System.out.println(\"Message: \" + warning.getMessage());
        System.out.println(\"SQLState: \" + warning.getSQLState());
        System.out.print(\"Vendor error code: \");
        System.out.println(warning.getErrorCode());
        System.out.println(\"\");
        warning = warning.getNextWarning();
    }
}

是的,如果您真的想观察每个警告,您需要显式地获取警告。但是你为什么要做这样的事呢


或者,Spring的JdbcTemplate为您提供了记录警告或在出现警告时抛出SQLWarningException的选项。默认行为是记录警告,因为它们是警告。希望这对于您的目的来说也足够了。

我有点被“为什么要做这样的事情”以及通过框架记录此类警告的想法(本例中为Spring)弄糊涂了。该框架不是会做与手写代码完全相同的事情来观察每个警告吗?我看不出有什么区别。。。或者您只是在争论使用框架而不是编写警告报告代码会减少程序员的工作量?当然,从性能的角度来看,这两种方法都在执行相同的JDBCAPI……是的,将调用相同的JDBC方法。我的意思是,我也从未发现自己在明确检查警告。我还试图为您提供一种记录警告的简单方法。有时“警告”实际上可能相当严重。几年前,我在一个使用Sybase的项目中工作,结果表明,在
数值(n,2)
列中插入一个类似“37.000”的数值会导致整个insert行被忽略,但会产生一个警告,而不会引发异常。这是一种非常罕见的情况,我们的测试没有捕捉到它,直到代码投入生产几周后,我们才发现我们的一些插入正在悄无声息地失败。我们最终用包装器包装了所有JDBC对象,这些包装器将抛出每个
SQLWarning
。有趣的事实:MySQL JDBC驱动程序将警告传播为
SQLException
s。啊!