Spring JdbcTemplate结果集第一次为空

时间:2012-09-25 02:24:38

标签: jdbctemplate

简单地说,问题是第一次调用JdbcTemplate并查询数据库时结果集为空。

当我第二次访问DAO方法时,我得到了预期的结果。以下是有关如何设置类的更多信息:

我有一个扩展父数据访问对象的数据访问对象。 Parent dao类只是将数据源注入JdbcTemplate的构造函数:

public class BaseDao
{
    private JdbcTemplate usrJdbcTemplate;

    public void setUsrDataSource(DataSource usrDataSource)
    {
        this.usrJdbcTemplate = new JdbcTemplate(usrDataSource);
    }

    public JdbcTemplate getUsrJdbcTemplate()
    {
        return this.usrJdbcTemplate;
    }

}

扩展它的类使用此JdbcTemplate来查询表:

public class OimUserDao extends BaseDao
{
    public Date getPasswordExpiryDate(String userName)
    {

    String sql = "select USR_PWD_EXPIRE_DATE from USR where UPPER (USR_LOGIN) = ?";

    List<java.sql.Date> dtLst  = getUsrJdbcTemplate().query(sql, new Object[] {userName.toUpperCase()}, new RowMapper<java.sql.Date>() 
      {
      @Override
      public java.sql.Date mapRow(final ResultSet rs, int rowNum) throws SQLException
      {
      return rs.getDate(1);
      }
      });

    if (dtLst.size()>0)
    {
    return dtLst.get(0);
    }
    else
    {
    return null;
    }
    }
}

使用@Autowired注释在服务中自动装配DAO。 xml中的DAO声明:               

<bean id="baseDao" class="us.worldpay.portalgateway.dao.BaseDao">
    <property name="usrDataSource" ref="usrDataSource" />
</bean>

<bean id="oimUserDao" class="us.worldpay.portalgateway.dao.OimUserDao" parent="baseDao" />

Web.xml包含xml的声明,其中包含这些DAO的bean定义(pg-data是我们关注的数据):

<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>
        /WEB-INF/pg-servlet.xml,
        /WEB-INF/pg-data.xml
</param-value>
</context-param>

更糟糕的是,这绝不会发生在我的本地方框(Weblogic)上,它指向与QA env相同的数据库(Oracle)。第一次填充结果集时,当我在本地框上运行时,会有数据。当我在QA env(Weblogic)上运行它时,结果集第一次为空。我花了几个小时和几个小时,并没有在哪里。

我在阅读这篇文章时表达了你的时间。我很感激能得到的所有帮助。

1 个答案:

答案 0 :(得分:0)

我认为BaseDao没有理由。我不需要它,只需将SimpleJdbcTemplate注入需要它的DAO中。

您应该使用PreparedStatement而不是自己转义用户名。我不会在查询中使用LIKE子句。您的用户名应该是唯一的;你应该得到一个日期。

好的,我们再问一些问题。

你说ResultSet在第一次是空的。你是说如果你只是重新运行方法调用,它不是空的? “我想是的,是的。”你需要确定。这是你问题的核心。

您确定本地计算机和QA环境指向的是同一个Oracle实例吗? “我非常肯定。是的。”非常好!

如果您使用客户端登录Oracle并运行相同的查询,它是否会带回您期望的结果? “是的,它确实。”优良!

您是否通过调试器逐步完成了代码以查看发生了什么?我会高度推荐它。

还有一个问题:是否有一个例外,你没有抓到? Spring将SQLException包装到未经检查的DataAccessException中。也许在第二次通话时第一次纠正时会出现不好的事情。我只是抓住稻草。