NBS编码小结2

 

SQL 语句错误:

Caused by: java.sql.SQLException: インデックス 1 は範囲外です Query: get *** Parameters: [3CDBE6BF-4426-424C-BD95-086300B82F8D, supplier_ yyy ]

错误描述:索引 1 超出范围了。

原因: 查询 方法用 了,使用了 executeQueryListSql (这个只能接收一个参数的)

正确做法是使用 executeQueryList (这个方法可以接收 N 个参数)。

->DAO这一层,提供了很多方法供外界使用,外界只要选择合适的方法进行调用就可以了。(20090512追加)

 

 

一个模块共用一个 ActionForm

比如 ** 情報登録入力 - ** 情報登録確認 - ** 情報登録完了

3 action (对应 3 个页面)就共用一个 form

-》虽说是3个页面,但页面内容几乎完全一致(都是×××情报),所以可以共用一个ActionForm。(20090512追加)

 

 

异常处理:

Dao BL 中,不进行异常的处理,在 Listern 中使用 try-catch ,将捕获到的异常转变成 IM 中的 Applkication 异常,再往外抛,由 Action 进行处理(配置了异常处理)。

-》在下层,不进行异常处理,只进行捕获和抛出(下层更专注于自己的本职工作:比如和数据库打交道、业务逻辑的设计等等);将异常的具体处理交给上层去做,统一管理。(20090512追加)

 

 

Commit 相关:

Commit 代码时,添加上说明文字(说明本次改动修改了什么地方)。

-》这样便于代码review,代码的可读性得到了增强。(20090512追加)

 

建议:经常性小规模地 check in ,一次就修改一个 bug 比较好。

-》前者可能是为了尽量实时保持代码的可编译性;后者是为了更有针对性。(20090512追加)

 

Commit 时,添加上 refs #XXX XXX bug 票号),这样,在 track 中,就可以通过链接直接看到代码改动部分。

-》此次是使用track进行项目管理的。(20090512追加)

 

 

SQL 查询语句中, In 子句中不能有数组,需要动态创建 SQL 语句 ,示例如下:

SQL 文件( getUserCdById .sql )中是开头部分:

SELECT

DISTINCT USER_CD  

FROM AAA

WHERE AAA . id IN 
 

再动态创建 in 后面的部分:

   public  List< BBB > getUserCdById(String[] arrayIds) throws  DataConnectException, DataPropertyException,DataAccessException {

        StringBuilder sql = new StringBuilder( this .getSql( " getUserCdById " ));

        boolean firstOne = true ;

        for (String id : arrayIds) {

            if (firstOne) {

                sql.append( " (" );

                firstOne = false ;

            } else {

                sql.append( "," );

            }

            sql.append( "'" + id + "'" );

        }

        sql.append( ")" );

        // ユーザー CDよって、 ×× 者を取得

        return this .executeQueryListSql(sql.toString());

    } 

 

 

现象: batch 运行调试过程中,遇到过上面的问题。

[WARN] c.c.s.w.WebAppFilterChain - java.lang.IllegalStateException: Connection UserConnection[ManagedConnectionImpl[jdbc/sqlserver2005.24]] was not closed. Connections must have a close() in a finally block.

java.lang.IllegalStateException: Connection UserConnection[ManagedConnectionImpl[jdbc/sqlserver2005.24]] was not closed. Connections must have a close() in a finally block.

            at com.caucho.jca.UserTransactionImpl.abortTransaction(UserTransactionImpl.java:532)

            at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:208)

            at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:266)

            at com.caucho.server.http.HttpRequest.handleRequest(HttpRequest.java:270)

            at com.caucho.server.port.TcpConnection.run(TcpConnection.java:678)

            at com.caucho.util.ThreadPool$Item.runTasks(ThreadPool.java:721)

            at com.caucho.util.ThreadPool$Item.run(ThreadPool.java:643)

            at java.lang.Thread.run(Thread.java:595)  

-》问题描述:

  1. Connection UserConnection[ManagedConnectionImpl[jdbc/sqlserver2005.24]] was not closed. Connections must have a close() in a finally block.

finally 块中,必须将连接资源全部关闭掉。(20090512追加)

 

原因分析: 前面 所有的其他事务处理,都 是放在 event 进行

现在 想使 用的是 Batch,没有通 event,所以需要程序员自己 connection 行管理。

 

解决方案:

import  jp.co.intra_mart.framework.base.data.DataAccessController;

import jp.co.intra_mart.framework.base.data.DataManager;

 

try {

DataAccessController controller = DataManager.getDataManager ().getDataAccessController();

。。。。。。

}

finally {

            try {

                // コレクションをクローズする

                controller.release();

            } catch (RuntimeException e) {

                LOG .warn( "runtime exception" , e);

            } catch (DataConnectException e) {

                LOG .warn( "data connect exception" , e);

            }

        } 

 

分析:最后关闭资源(包括数据库连接)。

-》这边,使用的还是intra-mart框架中的一些东东(比如DataAccessController类)。(20090512追加)

 

你可能感兴趣的:(DAO,sql,jdbc,SQL Server,配置管理)