1

我对 db 进行了查询,结果是通过 a 获得的java.sql.ResultSet,因为此查询是动态的,返回的列数可能是 5 或 7,过去使用相同的代码会生成“未找到列异常”和包含在以下捕获中:

try{
    sTemp = this.rsResults.getString("col3");
   }catch(Exception e){}

但是现在使用相同的尝试和捕获(唯一的区别是现在我正在使用combopooldatasource和它们的连接),我得到了两个不属于捕获的异常。

我该如何改善这一点,有没有更好的方法来检查列是否存在?c3p0 是否必须基于 a 强制测试连接(SQLState: S0022) column not found error

Error n1 - in the com.mchange.v2.c3p0.impl.NewProxyResultSet.getString qlUtils.toSQLException() - Attempted to convert SQLException to SQLException. Leaving it alone. [SQLState: S0022; errorCode: 0]
java.sql.SQLException: Column 'col3' not found.

Error n2 -  DefaultConnectionTester.statusOnException() - Testing a Connection in response to an Exception:
java.sql.SQLException: Column 'col3' not found.

ps:使用的驱动是一样的org.gjt.mm.mysql.Driver

4

3 回答 3

1

c3p0 在内部对任何类型的异常进行连接测试,但来自该测试的异常不会被抛出或对客户端代码可见。您之所以看到它,是因为您在 DEBUG 级别记录 c3p0 输出。c3p0 的东西应该记录在 INFO 以供正常使用。如果您以 DEBUG-ish 级别登录,您将看到各种警告消息和堆栈跟踪。

于 2013-06-20T10:33:28.137 回答
0

检查ResultSetMetaData

ResultSet rs = stmt.executeQuery("SELECT * FROM your_table");

ResultSetMetaData rsmd = rs.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

// test the number of columns returned
if (numberOfColumns == 5) {
    //
} else {
    // numberOfColumns = 7
}

// or, test the column names
if ("col3".equals(rsmd.getColumnName(3)) {
    // col3 exists
}

编辑:
如果您不想对源代码进行修改,而只想使用当前的方法c3p0;只需抓住 Throwable(它确实让我不寒而栗:)

try {
    sTemp = this.rsResults.getString("col3");
} catch (Throwable t) {
    // Both, Exceptions and Errors are ignored now
}
于 2013-06-19T17:10:26.700 回答
0

我进行了以下(粗略的)测试,只是为了说明在我的特定情况下引发异常与检查 RecordSet 中是否存在列的成本。

要检查的列数为 169。

代码 1

try
{
 sTemp = this.rsResults.getString("col3");
}catch(Exception e){}
try
{
 sTemp = this.rsResults.getString("col4");
}catch(Exception e){}

...

try
{
 sTemp = this.rsResults.getString("col169");
}catch(Exception e){}

带有函数 hasColumn 的代码 2 [问题]:如何确定列名是否存在于 ResultSet 中?

ResultSetMetaData rsmd = null;
try {
     rsmd = this.rsResults.getMetaData();
} catch (SQLException e1) {
 e1.printStackTrace();
}

try{
 if (rsmd != null && hasColumn(rsmd,"col3"))
  sTemp = this.rsResults.getString("col3");
}catch(Exception e){}

try{
 if (rsmd != null && hasColumn(rsmd,"col4"))
  sTemp = this.rsResults.getString("col4");
}catch(Exception e){}

...

try{
 if (rsmd != null && hasColumn(rsmd,"col169"))
  sTemp = this.rsResults.getString("col169");
}catch(Exception e){}

没有 c3p0 的结果

           code 1   code 2
query nº1   75ms     36ms
query nº2   40ms     43ms
query nº3   227ms    46ms
query nº4   262ms    18ms

信息中 c3p0 日志级别的结果

           code 1   code 2
query nº1   519ms     45ms
query nº2   358ms     28ms
query nº3   2348ms    9ms
query nº4   3243ms    12ms

作为一个结论,在这两种情况下,特别是在使用 c3p0 时,为了检查列是否存在(除了不好的做法)而引发异常的成本很高。

于 2013-06-21T10:12:12.477 回答