一、项目配置及启动 1、启动dp工程需要注意事项: Project:xxx Main class:com.cn.MainProcess Arguments: Program arguments: -cwap_process_hooks cwapJettyProcessHook,com.cn.Hook VM arguments:-Xms512M -Xmx1024M -XX:MaxPermSize=1024M other:${workspace_loc:xxx/target/xxx-1.0.0.0/lib} 2、自动化测试工具的配置: Main Project:simulators-dep-instnauth Main class:com.ebs.automationtools.simulatorcommon.engine.SimulatorsManager Arguments Program arguments: 1 1 D: estReport VM arguments:-DUSE_SYNC_DELAY=true -Dtt_home=D: estReport arget 3、tomcat容器+eclipse工具启动dw工程注意点: 1> 工程本身clean,install,容器的clean. 2> timeouts超时时间配置,pom中检查是否存在一个构件多个版本。 二、J2ee技术点 批量处理: public void batchInsert(final List<Object> vv) { final TsJdbcTemplate jsts = TsJdbcSingletonProvider.get().getTsJdbcTemplateByTable("xxx", "table"); jsts.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { StringBuffer sb = new StringBuffer(); sb.append("INSERT INTO table"); sb.append("(SR_NO_ID, xxx, xxx, LGN_MTHD, xxx, xxx, xxx, xxx, xxx, CRT_TM, CRTR, UPDTR, UPD_TM)"); sb.append("VALUES(TSDEV.SEQ_xxx.NEXTVAL,?,?,?,?,?,?,?,?,?,?,?,?,?)"); List<Object[]> param = new ArrayList<Object[]>(); for (Object vv: vv) { Object[] arrays = new Object[13]; arrays[0] = vv.getUserCode(); arrays[1] = vv.getAgencyUserCode(); arrays[2] = vv.getLoginMode(); arrays[3] = vv.getLoginEncryptInfo(); arrays[4] = vv.getGroupCode(); arrays[5] = vv.getInstnCode(); arrays[6] = vv.getCfetsInstnCode(); arrays[7] = vv.getLoginTime(); arrays[8] = vv.getLoginIp(); arrays[9] = vv.getCreateTime(); arrays[10] = "xxx"; arrays[11] = "xxx"; arrays[12] = new Date(); param.add(arrays); } jsts.batchUpdate(sb.toString(), param);//批量增删改 } }); } 1、事物应用:TransactionTemplate(不需要显式开始事物,甚至不需要显式提交事物,模板完成;异常时通过setRollbackOnly显式回滚事物), TransactionCallbackWithoutResult final TsJdbcTemplate tsjt = TsJdbcSingletonProvider.get() .getTsJdbcTemplateByTable("xxx", "table1", "table2"); tsjt.execute(new TransactionCallbackWithoutResult() { @Override protected void doInTransactionWithoutResult(TransactionStatus status) { tsjt.update(insertSql, new Object[] {userCode, offlineUser.getAgencyUserCode(), offlineUser.getLoginMode(), offlineUser.getLoginEncryptInfo(), offlineUser.getGroupCode(), offlineUser.getInstnCode(), offlineUser.getCfetsInstnCode(), new Date(), offlineUser.getLoginIp(), new Date(), "xxx", "xxx", new Date() }); tsjt.update(deleteSql, new Object[] {userCode, token}); } }); 2、spring:query使用 List<Object> query = TsJdbcSingletonProvider.get().getTsJdbcTemplateByTable("xxx", "table") .query(sql, new Object[] { userCode, loginMethod }, new RowMapper<Object>() { @Override public Object mapRow(ResultSet rs, int rowNum) throws SQLException { Object vo = new Object(); vo.setUserCode(rs.getString("xxx")); vo.setAgencyUserCode(rs.getString("xxx")); vo.setLoginMode(rs.getString("LGN_MTHD")); vo.setLoginEncryptInfo(rs.getString("xxx")); vo.setGroupCode(rs.getString("xxx")); vo.setInstnCode(rs.getString("INSTN_CD")); vo.setCfetsInstnCode(rs.getString("xxx")); vo.setLoginTime(rs.getDate("xxx")); vo.setLoginIp(rs.getString("xxx")); return vo; } }); if (null != query && query.size() > 0) { return query.get(0); 3、 场景:RPC模式,上游(1:yes, 2: no) 下游(2:yes, 1:no) 上游demo public static final Map<String, String> upMap = new HashMap<String, String>(); static { methodMap.put("1", "2"); methodMap.put("2", "1"); } 下游demo public static final Map<String, String> bottomMap = new HashMap<String, String>(); static { bottomMap.put("2", "1"); bottomMap.put("1", "2"); } 备注:如果只是单向映射,只需做一个即可 4、工具类 /** * 格式化日期的模型 * * */ private static String[] parseDatePatterns = { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm:ss.SSS", "yyyy-MM", "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm:ss.SSS", "yyyy/MM", "yyyy.MM.dd", "yyyy.MM.dd HH:mm:ss", "yyyy.MM.dd HH:mm:ss.SSS", "yyyy.MM"}; public static Date parseDate(String str) { if (str == null) { return null; } try { return org.apache.commons.lang3.time.DateUtils.parseDate(str, parseDatePatterns); } catch (ParseException e) { logger.warn("parse date error", e); return null; } } ========================================================================================= public static String formatDate(Date date, String partten) { if (date == null) { return null; } return DateFormatUtils.format(date, partten); //import org.apache.commons.lang.time.DateFormatUtils; } ========================================================================================== /** * parseDate * 传过来过去时时间,设置当前的时分秒,并返回JDateTime * @param date * @param partten * @return * @author liuhanlin 2017年7月25日 * JDateTime:import jodd.datetime.JDateTime; */ public static JDateTime parseDate(Date date) { if (date == null) { date = new Date(); } JDateTime before = new JDateTime(date); JDateTime after = new JDateTime(); after.setHour(before.getHour()); after.setMinute(before.getMinute()); after.setSecond(before.getSecond()); return after; } =========================================================================================== /** * JDateTime to Date * */ public Date jDateTimeToDate(JDateTime dateTime){ if(dateTime == null){ return null; } return DateUtils.parseDate(dateTime.toString()); } =========================================================================================== =========================================================================================== Object equals方法重写 import org.apache.commons.lang3.builder.EqualsBuilder; import org.apache.commons.lang3.builder.HashCodeBuilder; import org.apache.commons.lang3.builder.ReflectionToStringBuilder; import com.google.gson.Gson; public abstract class BaseBean implements Serializable { private static final long serialVersionUID = -7813614632590835438L; @Override public boolean equals(Object obj) { return EqualsBuilder.reflectionEquals(this, obj); } @Override public int hashCode() { return HashCodeBuilder.reflectionHashCode(this); } @Override public String toString() { return ReflectionToStringBuilder.toString(this); } public String toJson() { Gson gson = new Gson(); return gson.toJson(this); } ·} 三、理论 1、集群:表达的是提升单位时间内的执行效率(是否搭建集群关键要看单机是否能够满足业务需求,对数据进行评估后的结果) 2、分布式:缩短单个任务的执行时间 3、HA常用三种工作方式 1>主从方式:主机正常工作,备机监控主机状况,当主机宕机后,备机接管主机的一切负载,待主机恢复后,手动或者自动切换至主机运行 数据的一致性通过共享存储系统解决 2>双机双工方式:不存在主备说法,两台机器同时运行各自服务且互相监测,一台宕机后,另一个台立即接管它,应用服务系统的关键数据存放在共享存储系统中 3>集群工作方式:多台主机一起工作,各自运行一个或多个服务;各为服务定义一个或多个备用主机,当某个主机故障时,运行在其上的服务就可以被其他主机接管 四、Study Reflect API 1、加载Class对象的两种方式: 1> Class<?> c = Class.forName("xxx"); 2> ParamControlPO po =(ParamControlPO)Thread.currentThread().getContextClassLoader().loadClass("com.cn.bean.po.ParamControlPO").newInstance(); 2、oracle-sql 1> order by 排序一般都是存在于select子句的末尾;其后面可以跟多个条件(首先按照第一个条件进行排序,若第一个条件为空则按照第二个条件排序,依次类推) 2> between and:是个闭区间;表示>=between后面的值,<=and后面的值(前面加not 表示取反范围) 3> 拼接:|| 4> NVL(表达式1,表达式2):如果表达式1的值null,则返回表达式2的值,否则返回表达式1的值 5> group by: 分组查询,后面可以跟多个条件进行分组(切记select中的字段不可以单独出现,必须出现在group by子句或者组函数中) 6> to_date(str, pattern), to_char(sysdate, pattern) 【pattern:yyyy-MM-dd hh24:mi:ss】 7> concat(str1, str2):若str1位空,返回str2,否则返回拼接起来的值 8> NOT EXISTS, EXISTS SELECT * FROM table WHERE EXISTS(SELECT 1 FROM TSDEAL.table t WHERE t.PRDCT_CD IS NOT NULL); 9> decode的几种用法 select empno,decode(empno,7369,'smith',7499,'allen',7521,'ward',7566,'jones','unknow') as name from emp where rownum<=10