使用c3p0的ResultSet“未找到列”

时间:2013-06-19 16:43:43

标签: java mysql c3p0

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

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

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

我如何改进这一点,是否有更好的方法来检查列是否存在? c3p0是否必须根据(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

3 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分: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
}

答案 2 :(得分: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){}

代码2,功能hasColumn [问题]:How can I determine if the column name exist in the 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

在INFO

处使用c3p0 loglevel的结果
           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。