修复查询数据操作对于某些数据库有时报空指针异常的BUG

This commit is contained in:
datagear 2020-08-06 15:00:59 +08:00
parent cd341150b7
commit be949d83c5
2 changed files with 37 additions and 10 deletions

View File

@ -30,6 +30,7 @@ import java.sql.SQLXML;
import java.sql.Statement;
import java.sql.Types;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
@ -94,17 +95,31 @@ public class JdbcSupport
{
LOGGER.debug("execute {}, resultSetType={}", sql, resultSetType);
PreparedStatement pst = null;
Statement st = null;
ResultSet rs = null;
List<Object> setParams = null;
@SuppressWarnings("unchecked")
List<Object> setParams = Collections.EMPTY_LIST;
try
{
pst = createQueryPreparedStatement(cn, sql.getSqlValue(), resultSetType);
setParams = setParamValues(cn, pst, sql);
rs = pst.executeQuery();
@JDBCCompatiblity("如果没有参数,则不必采用预编译方式,避免某些驱动对预编译功能支持有问题")
boolean hasParamValue = sql.hasParamValue();
return new QueryResultSet(pst, rs, setParams);
if (hasParamValue)
{
PreparedStatement pst = createQueryPreparedStatement(cn, sql.getSqlValue(), resultSetType);
st = pst;
setParams = setParamValues(cn, pst, sql);
rs = pst.executeQuery();
}
else
{
Statement stt = createQueryStatement(cn, resultSetType);
st = stt;
rs = stt.executeQuery(sql.getSqlValue());
}
return new QueryResultSet(st, rs, setParams);
}
catch (SQLSyntaxErrorException | SQLDataException | SQLTimeoutException | SQLWarning e)
{
@ -116,20 +131,22 @@ public class JdbcSupport
{
@JDBCCompatiblity("某些不支持ResultSet.TYPE_SCROLL_*的驱动程序不是在创建PreparedStatemen时报错"
+ "而是在执行SQL的时候比如SQLServer的聚集列存储索引所以在这里检查必要时降级重新执行查询")
int actualResultSetType = pst.getResultSetType();
if (ResultSet.TYPE_FORWARD_ONLY == actualResultSetType)
// pst此时可能为null
Integer actualResultSetType = (st != null ? st.getResultSetType() : null);
if (actualResultSetType != null && actualResultSetType == ResultSet.TYPE_FORWARD_ONLY)
{
IOUtil.closeIf(setParams);
JdbcUtil.closeResultSet(rs);
JdbcUtil.closeStatement(pst);
JdbcUtil.closeStatement(st);
throw e;
}
else
{
JdbcUtil.closeResultSet(rs);
JdbcUtil.closeStatement(pst);
JdbcUtil.closeStatement(st);
LOGGER.debug("query is downgraded to [ResultSet.TYPE_FORWARD_ONLY] for exception :", e);

View File

@ -59,6 +59,16 @@ public class Sql implements Serializable
return this.sql.toString();
}
/**
* 判断是否有SQL参数
*
* @return
*/
public boolean hasParamValue()
{
return (this.paramValues != null && !this.paramValues.isEmpty());
}
/**
* 获取{@linkplain SqlParamValue}列表
*