我对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
答案 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。