-1

簡単に言えば、問題は、最初に JdbcTemplate を呼び出してデータベースにクエリを実行したときに、結果セットが空になることです。

2 回目に DAO メソッドにアクセスすると、期待どおりの結果が得られます。クラスの設定方法の詳細は次のとおりです。

親データ アクセス オブジェクトを拡張するデータ アクセス オブジェクトがあります。親の 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;
    }
    }
}

DAO は、@Autowired アノテーションを使用してサービスで自動配線されます。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 には、これらの DAO の Bean 定義を含む xml の宣言があります (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>

さらに悪いことに、これは、QA 環境と同じデータベース (Oracle) を指すローカル ボックス (Weblogic) では決して発生しません。ローカル ボックスでこれを実行すると、初回の結果セットにデータが入力され、データが含まれます。これを QA env (Weblogic) で実行すると、最初は結果セットが空になります。私はこれに何時間も費やしましたが、どこにも行きませんでした。

この投稿をお読みいただきありがとうございます。私が得ることができるすべての助けに感謝しています。

4

1 に答える 1

0

の理由がわかりませんBaseDao。私はそれをSimpleJdbcTemplate省き、それを必要とするDAOに単純に注入します。

PreparedStatement自分でユーザー名をエスケープするのではなく、使用する必要があります。クエリで LIKE 句を使用しません。ユーザー名は一意である必要があります。1 つの日付を取得する必要があります。

では、さらに質問をしましょう。

ResultSet は「初めて」空であると言います。メソッド呼び出しを再実行しただけでは、空ではないということですか? 「そう思います、はい」あなたは確信する必要があります。それはあなたの質問の中心です。

ローカル マシンと QA 環境がまったく同じ Oracle インスタンスを指していると確信していますか? 「そう確信しています。はい。」とても良い!

クライアントを使用して Oracle にログオンし、同じクエリを実行すると、期待する結果が返されますか? "はい、そうです。" 優秀な!

デバッガーでコードをステップ実行して、何が起こっているかを確認しましたか? 強くお勧めします。

もう 1 つの質問: キャッチしていないスローされた例外はありますか? Spring は SQLException を unchecked DataAccessException にラップします。たぶん、最初の呼び出しで何か悪いことが起こり、2 回目の呼び出しで修正されます。私はここでストローをつかんでいます。

于 2012-09-25T02:33:50.560 に答える