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