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)
-》问题描述:
在 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追加)