待整理0304

1、java类加载器

Java程序(class文件)并不是本地的可执行程序。当运行Java程序时,首先运行JVM(Java虚拟机),然后再把Java class加载到JVM里头运行,负责加载Java class的这部分就叫做Class Loader.

JVM本身包含了一个ClassLoader称为Bootstrap ClassLoader,和JVM一样,BootstrapClassLoader是用本地代码实现的,
它负责加载核心JavaClass(即所有java.*开头的类)。另外JVM还会提供两个ClassLoader,它们都是用Java语言编写的,由BootstrapClassLoader加载;
其中Extension ClassLoader负责加载扩展的Javaclass(例如所有javax.*开头的类和存放在JRE的ext目录下的类),
ApplicationClassLoader负责加载应用程序自身的类。   
当运行一个程序的时候,JVM启动,运行bootstrapclassloader,该ClassLoader加载java核心API(ExtClassLoader和AppClassLoader也在此时被加载),
然后调用ExtClassLoader加载扩展API,最后AppClassLoader加载CLASSPATH目录下定义的Class,这就是一个程序最基本的加载流程


每个ClassLoader加载Class的过程是: 
1.检测此Class是否载入过(即在cache中是否有此Class),如果有到8,如果没有到2
2.如果parent classloader不存在(没有parent,那parent一定是bootstrap classloader了),到4 
3.请求parent classloader载入,如果成功到8,不成功到5 
4.请求jvm从bootstrap classloader中载入,如果成功到8 
5.寻找Class文件(从与此classloader相关的类路径中寻找)。如果找不到则到7. 
6.从文件中载入Class,到8. 
7.抛出ClassNotFoundException. 

8.返回Class.


dump

linuix 查看java下面进程

2、数据库部分记录
group和having的区别

select * from table GROUP BY com1 HAVING SUM(com1)>10
因为优先级 where > from > GROUP BY > HAVING

ajax的同步锁
???????

JodaDate 替换jdk的时间api

数据库超过n记录表横向纵向分表
这个没有实际操作估算过~~


异常处理转换成RuntimeExcetion
**假设,系统原来有可能抛出SQLException,我将原本语句catch后throw一个继承RuntimeException的子类,
抛出去,下一层在变写代码时就得不到这里可能抛出异常的提示了   
其实这只是传递消息的方式的问题,具体要看怎么设计,就像新闻说动物园有只动物偷跑出去了,和动物园有只老虎跑出去了。
这样对信息夸大或缩小,对信息接受者肯定会有不同的影响


数据库必须用主外键


struts模型驱动(javabean)代替属性(字段)注入
 模型驱动和属性驱动的Action有很大的区别,下面一一列举:(其实用法差不多)
(1)模型驱动的Action必须实现ModelDriven接口,而且要提供相应的泛型,这里当然就是具体使用的Java Bean了。
(2)实现ModelDriven的getModel方法,其实就是简单的返回泛型的一个对象。
(3)在Action提供一个泛型的私有对象,这里就是定义一个User的user对象,并提供相应的getter与setter。
好了,上面的三件事做完之后,Action就会去自动调用User的setter将表单中的name属性的值赋给User中的属性。而Action的后续处理的Jsp页面后者是Servlet就可以使用user对象了。


会用模型驱动user.save(),代替dao。???
少传一个参数,概念上优雅了一些。模型驱动太考验建模能力,一定要在一个范围内把所有问题想清楚再使用。建议把DDD那本书看个两三遍再说。
不过这东西看上去真的很吸引人。


研究过Annotation,用Annotation写过注解,知道Annotation如何继承,太复杂搞不懂。
拿Annotation实现过一套Model工具,没有深入了解过ejb,可能有点entity bean的思路在里面把。
前面说过一部分annotation了。这东西的好处就是把元数据跟java代码放到一起了,于是好找也好改了,坏处也是放在一起所以耦合了。如果代码量大到一定程度之后,最好把所有主力都集合到一块儿商量一下,到底是xml好还是annotation好。
在代码量没大到一定程度,或者annotation配置的数据仅仅是annotation所在的类自己用的话,可以在开发效率上考虑一下这个问题。jdk提供了语言层面的annotation操作工具,使用简单,有一部分的编译期检查,写起来比xml要舒服。另外,个人认为annotation的语法不太适合定义层次太深的结构,在类前面写上四层annotation再用ide做个formatter,说实话挺愁人的。

8.
在Oracle中,可以创建以下两种临时表:
a。会话特有的临时表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT PRESERVE ROWS;


b。事务特有的临时表
CREATE GLOBAL TEMPORARY ( )
ON COMMIT DELETE ROWS;
CREATE GLOBAL TEMPORARY TABLE MyTempTable
所建的临时表虽然是存在的,但是你试一下insert 一条记录然后用别的连接登上去select,记录是空的,明白了吧。
下面两句话再贴一下:
--ON COMMIT DELETE ROWS 说明临时表是事务指定,每次提交后ORACLE将截断表(删除全部行)
--ON COMMIT PRESERVE ROWS 说明临时表是会话指定,当中断会话时ORACLE将截断表。

语法糖

3、代码摘写
多线程高并发多用户关系型。
简单易用、事物支持不好,最新版用的是innodb的引擎


适应场景?
1.web网站系统
2日志记录系统
3数据仓库系统


if (act == null) {
throw new UserNotFoundException("", "登录用户不存在,请重新登录");
}

import com.suning.framework.exception.BaseException;
public class UserNotFoundException extends BaseException {

    private static final long serialVersionUID = 3807637725812539787L;

    public UserNotFoundException(String code, String logMsg) {
        super(code, logMsg);
    }
}


12月线程应用总结。
ExecutorService executorService = Executors.newFixedThreadPool(20);
项目中用了1.6中的线程池,


// 缺点,发布生产后 遇到线程丢失的情况。分析原因是起的线程过多(具体原因为查明)
// 
这个异常问题本质原因是我们创建了太多的线程,而能创建的线程数是有限制的,导致了异常的发生。
能创建的线程数的具体计算公式如下: 
( MaxProcessMemory - JVMMemory - ReservedOsMemory) / (ThreadStackSize) = Number of threads
MaxProcessMemory 指的是一个进程的最大内存
JVMMemory         JVM内存
ReservedOsMemory  保留的操作系统内存
ThreadStackSize      线程栈的大小 (线程在jdk 1.4以前默认是256K,1.5以后是1M)
*****
最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU核数


ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 
ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 
ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务


AbortPolicy:抛出异常RejectedExecutionException;
DiscardPolicy:直接丢弃当前将要加入队列的任务本身; 
DiscardOldestPolicy:丢弃任务队列中最旧任务; 
CallerRunsPolicy:调用者线程执行 

void updTable(String type,ExecutorService executorService){
   
    System.out.println("线程池状态:" + executorService.isShutdown());
   
        List<Future<Object>> resultFuture = new ArrayList<Future<Object>>();
    int mxCount = getUpGoodsCount(type);
int step = (int)Math.ceil(mxCount/200.0F;);
//分批查询结果,创建线程执行结果
List<Map<String,Object>> goodsList = null;
Map<String, Object> paramMap = new HashMap<String, Object>();
for(int i = 0; i < step; i++) {
   goodsList = getUpGoods(type,paramMap);
   resultFuture.add(executorService.submit(new AutoTaskUpdateGoodsInformationThread(goodsList,type)));
}
try {
   for(Future<Object> o : resultFuture) {
           System.out.println(o);
       }
} finally {
// shutdown()之后,再向线程池提交任务的时候,如果你配置的拒绝策略是AbortPolicy的话
// 会抛异常java.util.concurrent.RejectedExecutionException
   executorService.shutdown();
}
    }
/**
     * 内部执行线程类
     */
    public class AutoTaskUpdateGoodsInformationThread implements Callable<Object> {
        private List<Map<String,Object>> glist;
        private String tableType;
        public AutoTaskUpdateGoodsInformationThread(List<Map<String,Object>> glist,String tableType) {
            this.glist = glist;
            this.tableType = tableType;
        }
        @Override
        public Object call() throws Exception {
            //调用自动任务
        toUpdGoods(glist,tableType);
       
        TimeUnit.MILLISECONDS.sleep(200);
       
            return null;
        }
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值