??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲高清视频中文字幕,91成人福利,日韩一区二区三区avhttp://www.aygfsteel.com/zuan-sky/生命在于q动Q让自己w体的每一个细胞都动v来吧.zh-cnTue, 17 Jun 2025 19:54:56 GMTTue, 17 Jun 2025 19:54:56 GMT60List分拆为多个List对象http://www.aygfsteel.com/zuan-sky/archive/2013/01/30/394946.html黑蚂?/dc:creator>黑蚂?/author>Wed, 30 Jan 2013 09:40:00 GMThttp://www.aygfsteel.com/zuan-sky/archive/2013/01/30/394946.htmlhttp://www.aygfsteel.com/zuan-sky/comments/394946.htmlhttp://www.aygfsteel.com/zuan-sky/archive/2013/01/30/394946.html#Feedback0http://www.aygfsteel.com/zuan-sky/comments/commentRss/394946.htmlhttp://www.aygfsteel.com/zuan-sky/services/trackbacks/394946.html
import java.util.HashMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;

public class TestClass {
    private Map<String,ArrayList<String>> map = new HashMap<String,ArrayList<String>>();
    private int k = 0;

    public
 Map<String,ArrayList<String>> newTableList(ArrayList<String> list,int num) {
        List
<String> tempList = new ArrayList<String>();
        
int size = list.size();
        System.out.println(
"========================================");
        List
<String> newList = (List<String>) list.clone();
        
for (int i = 0; i < size; i++) {
            
if(i < num) {
                String str 
= list.get(i);
                tempList.add(str);
            } 
else {
                
break;
            }
        }
        
        
if (list!=null && size!=0) {
            k
++;
            map.put(String.valueOf(k), (ArrayList
<String>) tempList);
            System.out.println(
"Key:"+k+",list size:"+tempList.size());
            System.out.println(
"========================================");
            
for (int i = 0; i < tempList.size(); i++) {
                String tempStr 
= tempList.get(i);
                
boolean isContains = newList.contains(tempStr);
                
if(isContains) {
                    newList.remove(tempStr);
                }
            }
            newTableList((ArrayList
<String>)newList,num);
        }
        
        
return map;
    }

public static void main(String[] args) throws SQLException {
        TestClass ed = new TestClass();
        ArrayList<String> tempList = new ArrayList<String>();
        tempList.add("111");
        tempList.add("222");
        tempList.add("333");
        tempList.add("444");
        tempList.add("555");
        tempList.add("666");
        tempList.add("777");
        tempList.add("888");
        tempList.add("999");
        tempList.add("100");
        tempList.add("aaa");
        tempList.add("bbb");
        tempList.add("ccc");
        tempList.add("ddd");
        
        ed.newTableList(tempList,5);
    }
}

希望q段代码能帮助到些h?/div>

]]>javaҎ定目录下文g的读?/title><link>http://www.aygfsteel.com/zuan-sky/archive/2012/11/23/391845.html</link><dc:creator>黑蚂?/dc:creator><author>黑蚂?/author><pubDate>Fri, 23 Nov 2012 07:32:00 GMT</pubDate><guid>http://www.aygfsteel.com/zuan-sky/archive/2012/11/23/391845.html</guid><description><![CDATA[最q因为项目的国际化的需要,需要对整个目?00来个插g做国际化Q这是一件痛苦的事情Q因为纯体力力_。ؓ了省点工作量Q想着能不能写个程序批处理了,减少点工作量Q于是就有了下面的代码?br /><br />1.d指定的(.javaQ文Ӟ<br /><div><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><span style="color: #008080; "></span>public static String readFile(String path) throws IOException {<br /><div>        File f = new File(path);<br />        StringBuffer res = new StringBuffer();<br />        String filePathStr = f.getPath();<br />        System.out.println("获取文g的\?::::::"+filePathStr);<br />        <br />        FileInputStream fis = new FileInputStream(f);<br />        InputStreamReader isr = new InputStreamReader(fis,Charset.forName("GBK")); //以gbk~码打开文本文g<br />        BufferedReader br = new BufferedReader(isr, 8192 * 8);<br />        <br />        String line = null;<br />        int linenum = 0;<br />        while((line=br.readLine())!=null) {<br />            linenum ++;<br />            res.append(line+"此处可以d你自q字符串处理逻辑"+"\r\n");<br />        }<br />        br.close();<br />        <br />        return res.toString();<br />    }</div></div></div>2.d的文件内容信息写到指定的Q?javaQ文?br /><div style="background-color:#eeeeee;font-size:13px;border:1px solid #CCCCCC;padding-right: 5px;padding-bottom: 4px;padding-left: 4px;padding-top: 4px;width: 98%;word-break:break-all"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><div>public static boolean writeFile(String cont, String path) {<br />        try {<br />            File dist = new File(path);<br />            OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(dist),"GBK");  <br />            writer.write(cont);<br />            writer.flush();<br />            writer.close();<br />            return true;<br />        } catch (IOException e) {<br />            e.printStackTrace();<br />            return false;<br />        }<br />    }</div></div>3.查找指定目录下所有符合条件的.java文gQƈ更新文g信息<br /><div style="background-color: #eeeeee; font-size: 13px; border: 1px solid #cccccc; padding: 4px 5px 4px 4px; width: 98%; word-break: break-all;"><!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />--><div>    /**<br />     * 查找文g<br />     * @param f<br />     * @throws IOException <br />     */<br />    public static void findFile(File f) throws IOException {<br />        if(f.exists()) {<br />            if(f.isDirectory()) {<br />                for(File fs:f.listFiles(ff)) {<br />                    findFile(fs);<br />                }<br />            } else {<br />                    updateFile(f);<br />            }<br />        }<br />    }<br />    <br />    /**<br />     * 逐行读java文g<br />     * @param f<br />     * @throws IOException<br />     */<br />    private static void updateFile(File f) throws IOException {<br />        String filePathStr = f.getPath();<br />        System.out.println("开始读取文件的路径:::::::"+filePathStr);<br />        FileInputStream fis = new FileInputStream(f);<br />        InputStreamReader isr = new InputStreamReader(fis,Charset.forName("GBK")); //以gbk~码打开文本文g<br />        BufferedReader br = new BufferedReader(isr, 8192 * 8);<br />        <br />        String line = null;<br />        int linenum = 0;<br />        StringBuffer res = new StringBuffer();<br />        while((line=br.readLine())!=null) {<br />            String updateStr= updateStr(line);<br />            res.append(updateStr+"\r\n"); <br />            <br />            if(!line.trim().equals(updateStr.trim())) {<br />                linenum ++;<br />            }<br />        }<br />        br.close();<br />        <br />        //如果文g有修改,则修改后的文Ӟ覆盖原有文g<br />        if(linenum>0) {<br />            System.out.println("============================="); <br />            System.out.println("filePathStr:"+filePathStr);<br />            System.out.println("文g修改了:"+linenum+"处?);<br />            System.out.println("=============================");<br />            String cont = res.toString();<br />            ReadWriteFile.write(cont, filePathStr);<br />        }<br />    }<br />    <br />    /**<br />     * 验证d的字W串信息<br />     * 和更新字W串信息<br />     * @param str<br />     */<br />    private static String updateStr(String str) {<br />        //判断字符串是否是需要更新的字符?br />        boolean isok = filterStr(str);<br />        int strNum = StringValidation.strNum(str, StringValidation.ch);<br />        if(isok || strNum == 0) {<br />            return str;<br />        } else {<br />            String temp = "";  <br />            for(int i=1;i<=strNum/2;i++) {<br />                temp += " //$NON-NLS-"+i+"$"; //需要添加的字符<br />            }<br />            str = str+temp;<br />        }<br />        return str;<br />    }<br />    <br />    //qo文gcd<br />    private static FileFilter ff = new FileFilter() {<br />        public boolean accept(File pathname) {<br />            String path = pathname.getName().toLowerCase();<br />            logger.info("FileFilter path::::"+path); <br />            //只匹?.java l尾的文?br />            if (pathname.isDirectory() || path.endsWith(".java")) {<br />                return true;<br />            }<br />            return false;<br />        }<br />    };<br /><br /><div>    /**<br />     * qo掉不需要处理的字符?br />     * @param str<br />     * @return<br />     */<br />    public static boolean filterStr(String str) {<br />        boolean isok = false;<br />        <br />        //qo字符?br />        isok = (str.indexOf("import ")>=0)<br />                || (str.indexOf("package ")>=0)<br />                || (str.indexOf(" class ")>=0)<br />                || (str.indexOf("http://$NON-NLS")>=0)<br />                || (str.indexOf("http://")==0)<br />                || (str.indexOf("/*")>=0)<br />                || (str.indexOf("*")>=0)<br />                || (str.trim().indexOf("@")==0) <br />                || (str.indexOf("\"")==-1) <br />                || ("".equals(str)) <br />                || isCh(str);<br />        return isok;<br />    }<br /><br /><div>    /**<br />     * 验证字符串是否含有中文字W?br />     * @param str<br />     * @return<br />     */<br />    public static boolean isCh(String str) {<br />        Pattern   pa   =   Pattern.compile("[\u4E00-\u9FA0]"); <br />        Matcher   m   =   pa.matcher(str);<br />        boolean isok = m.find();<br />        return isok;<br />    }</div></div></div></div><br />ȝQ当我们拿到一个别人给的需求,先不要急于d理,先分析,再分析,然后做出最优的解决ҎQ处理好q项工作?img src ="http://www.aygfsteel.com/zuan-sky/aggbug/391845.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zuan-sky/" target="_blank">黑蚂?/a> 2012-11-23 15:32 <a href="http://www.aygfsteel.com/zuan-sky/archive/2012/11/23/391845.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Eclipse下添加反~译插gjad.exehttp://www.aygfsteel.com/zuan-sky/archive/2012/11/09/391104.html黑蚂?/dc:creator>黑蚂?/author>Fri, 09 Nov 2012 08:46:00 GMThttp://www.aygfsteel.com/zuan-sky/archive/2012/11/09/391104.htmlhttp://www.aygfsteel.com/zuan-sky/comments/391104.htmlhttp://www.aygfsteel.com/zuan-sky/archive/2012/11/09/391104.html#Feedback3http://www.aygfsteel.com/zuan-sky/comments/commentRss/391104.htmlhttp://www.aygfsteel.com/zuan-sky/services/trackbacks/391104.html
首先Q?我们需要下载:net.sf.jadclipse_3.3.0.jar  参考下载地址Q?a >http://download.csdn.net/detail/lk_kuaile/1725313
其次Q?q需要下载:jad.exe 参考下载地址Q?a >http://ishare.iask.sina.com.cn/f/15267016.html?from=like

接下来:我把下蝲?net.sf.jadclipse_3.3.0.jar 攑օ到自q文g夹下Qeclipse\plugins 目录下?
            重启eclipseQ打开window-preferences--java 指定jad.exe的绝对\径?br />           
点击okQ就可以了。我们就可以很方便的在Eclipse下查看jar下的.class 文g了?br />

]]>
ECLIPSE d插g3U方?http://www.aygfsteel.com/zuan-sky/archive/2012/11/08/391045.html黑蚂?/dc:creator>黑蚂?/author>Thu, 08 Nov 2012 10:04:00 GMThttp://www.aygfsteel.com/zuan-sky/archive/2012/11/08/391045.htmlhttp://www.aygfsteel.com/zuan-sky/comments/391045.htmlhttp://www.aygfsteel.com/zuan-sky/archive/2012/11/08/391045.html#Feedback0http://www.aygfsteel.com/zuan-sky/comments/commentRss/391045.htmlhttp://www.aygfsteel.com/zuan-sky/services/trackbacks/391045.html

eclipse d插g?中方法:

    W一U:解压eclipse 插g 里面分别包含两个文g夹features和plugins Q然后把两个文g夹分别复制到eclipse 下所对应的文件夹下。删?configuration文g夹下? org.eclipse.update文g夏V?br /> 重新启动eclipseQ可以在eclipse的菜?Help"-->"About Eclipse SDK"-->"Feature Details" ?Plug-in Details"中看到新安装的插件?/p>

    W二U:新徏一个文件夹q命名ؓeclipseQ解压eclipse 插gQ分别将文g夹features和文件夹plugins 攑օ该文件夹下,然后扑ֈeclipse SDK下的links文g夹,在links文g夹中新徏一个YourFileName.link文gQ内Ҏ"path=${your eclipse-plugin path}" 。重新启动eclipseQ可以在eclipse的菜?Help"-->"About Eclipse SDK"-->"Feature Details" ?Plug-in Details"中看到新安装的插件?/p>


   W三U:解压eclipse 插gQ分别将文g夹features和文件夹plugins 攑օeclipse安装文g夹下?/p>


疑问Qؓ什么把插g的文件夹features和文件夹plugins复制到eclipse安装文g夹下Q原来文件夹features和文件夹plugins的内容不被覆盖?



]]>
eclipse3.7插g构徏自定义右键菜?http://www.aygfsteel.com/zuan-sky/archive/2012/11/08/391043.html黑蚂?/dc:creator>黑蚂?/author>Thu, 08 Nov 2012 09:55:00 GMThttp://www.aygfsteel.com/zuan-sky/archive/2012/11/08/391043.htmlhttp://www.aygfsteel.com/zuan-sky/comments/391043.htmlhttp://www.aygfsteel.com/zuan-sky/archive/2012/11/08/391043.html#Feedback0http://www.aygfsteel.com/zuan-sky/comments/commentRss/391043.htmlhttp://www.aygfsteel.com/zuan-sky/services/trackbacks/391043.html

原文地址Q?a >http://www.cnblogs.com/skyme/archive/2012/01/12/2320128.html




]]>
Enum的用与分析http://www.aygfsteel.com/zuan-sky/archive/2012/11/07/390964.html黑蚂?/dc:creator>黑蚂?/author>Wed, 07 Nov 2012 07:33:00 GMThttp://www.aygfsteel.com/zuan-sky/archive/2012/11/07/390964.htmlhttp://www.aygfsteel.com/zuan-sky/comments/390964.htmlhttp://www.aygfsteel.com/zuan-sky/archive/2012/11/07/390964.html#Feedback0http://www.aygfsteel.com/zuan-sky/comments/commentRss/390964.htmlhttp://www.aygfsteel.com/zuan-sky/services/trackbacks/390964.html

CZQ?/p>

 1     public enum EnumTest {  
 2          FRANK("The given name of me"),  
 3          LIU("The family name of me");  
 4          private String context;  
 5          private String getContext(){  
 6          return this.context;  
 7          }  
 8          private EnumTest(String context){  
 9          this.context = context;  
10          }  
11          public static void main(String[] args){  
12          for(EnumTest name :EnumTest.values()){  
13          System.out.println(name+" : "+name.getContext());  
14          }  
15          System.out.println(EnumTest.FRANK.getDeclaringClass());  
16          }  
17      
18     } 

Java中枚丑֮现的分析Q?/strong>

CZQ?/p>

public enum Color{    
    RED,BLUE,BLACK,YELLOW,GREEN    
}
  1.  

昄Qenum很像Ҏ的classQ实际上enum声明定义的类型就是一个类? 而这些类都是cd中Enumcȝ子类(java.lang.Enum<E>)。它们承了q个Enum中的许多有用的方法。我们对代码~译?后发玎ͼ~译器将enumcd单独~译成了一个字节码文gQColor.class?/p>

Color字节码代码:

  1. final enum hr.test.Color {  
  2.     
  3.  // 所有的枚D值都是类静态常? 
  4. &nbsp;public static final enum hr.test.Color RED;  
  5. &nbsp;public static final enum hr.test.Color BLUE;  
  6.  public static final enum hr.test.Color BLACK;  
  7.  public static final enum hr.test.Color YELLOW;  
  8.  public static final enum hr.test.Color GREEN;  
  9.    
  10. private static final synthetic hr.test.Color[] ENUM$VALUES;  
  11.     
  12.   // 初始化过E,Ҏ丄的所有枚丑ր对象进行第一ơ初始化  
  13. &nbsp;static {  
  14.        0  new hr.test.Color [1]   
  15.       3  dup  
  16.       4  ldc <String "RED"> [16] //把枚丑ր字W串"RED"压入操作数栈  
  17.       6  iconst_0  // 把整型?压入操作数栈  
  18.       7  invokespecial hr.test.Color(java.lang.String, int) [17] //调用ColorcȝU有构造器创徏Color对象RED  
  19.      10  putstatic hr.test.Color.RED : hr.test.Color [21]  //枚丑֯象赋lColor的静态常量RED? 
  20.       .........  枚D对象BLUE{与上同  
  21.     102  return 
  22. };  
  23.     
  24.   // U有构造器Q外部不可能动态创Z个枚丄对象(也就是不可能动态创Z个枚丑ր?? 
  25.  private Color(java.lang.String arg0, int arg1){  
  26.      // 调用父类Enum的受保护构造器创徏一个枚丑֯? 
  27.      3  invokespecial java.lang.Enum(java.lang.String, int) [38]  
  28. };  
  29. &nbsp;  
  30.  public static hr.test.Color[] values();  
  31.     
  32.    // 实现Enumcȝ抽象Ҏ    
  33.   public static hr.test.Color valueOf(java.lang.String arg0);  

下面我们pl介lenum定义的枚丄的特征及其用法。(后面均用Color举例Q?/p>

1、Color枚Dcd是classQ而且是一个不可以被承的finalcR?/strong>

其枚丑ր?RED,BLUE...)都是Colorcd的类静态常量, 我们可以通过下面的方式来得到Color枚Dcȝ一个实例:

  1. Color c=Color.RED;  

注意Q这些枚丑ր都是public static final的,也就是我们经常所定义的常量方式,因此枚DcM的枚丑ր最好全部大写?/p>

2、即然枚丄是classQ当然在枚Dcd中有构造器Q方法和数据域。但是,枚Dcȝ构造器有很大的不同Q?

(1) 构造器只是在构造枚丑ր的时候被调用?/p>

 1     enum Color{  
 2                     RED(255,0,0),BLUE(0,0,255),BLACK(0,0,0),YELLOW(255,255,0),GREEN(0,255,0);  
 3                     //构造枚丑ր|比如RED(255,0,0)  
 4                     private Color(int rv,int gv,int bv){  
 5                      this.redValue=rv;  
 6                      this.greenValue=gv;  
 7                      this.blueValue=bv;  
 8                     }  
 9      
10                     public String toString(){  //覆盖了父cEnum的toString()  
11                     return super.toString()+"("+redValue+","+greenValue+","+blueValue+")";  
12                     }  
13          
14                     private int redValue;  //自定义数据域QprivateZ装?nbsp; 
15                     private int greenValue;  
16                     private int blueValue;  
17      }

(2) 构造器只能U有privateQ绝对不允许有public构造器?q样可以保证外部代码无法新构造枚丄的实例。这也是完全W合情理的,因ؓ我们知道枚D值是public static final的常量而已?/p>

但枚丄的方法和数据域可以允许外部访问?/p>

  1. public static void main(String args[])  
  2. {  
  3.         // Color colors=new Color(100,200,300);  //wrong  
  4.            Color color=Color.RED;  
  5.            System.out.println(color);  // 调用了toString()Ҏ  
  6. }     

3、所有枚丄都承了Enum的方法,下面我们详细介绍q些Ҏ?

(1) ordinal()Ҏ: q回枚D值在枚Dcȝ的顺序。这个顺序根据枚丑ր声明的序而定?/p>

  1. Color.RED.ordinal(); //q回l果Q?  
  2. Color.BLUE.ordinal(); //q回l果Q? 

(2) compareTo()Ҏ: Enum实现了java.lang.Comparable接口Q因此可以比较象与指定对象的序。Enum中的compareToq回的是两个枚D值的?序之差。当Ӟ前提是两个枚丑ր必d于同一个枚丄Q否则会抛出ClassCastException()异常?具体可见源代?

  1. Color.RED.compareTo(Color.BLUE); //q回l果 -1 

(3) values()ҎQ?静态方法,q回一个包含全部枚丑ր的数组?/p>

  1. Color[] colors=Color.values();  for(Color c:colors){  System.out.print(c+","); }  
  2. //q回l果QRED,BLUE,BLACK YELLOW,GREEN,  

(4) toString()ҎQ?q回枚D帔R的名U?/p>

  1. Color c=Color.RED;  
  2. System.out.println(c);//q回l果: RED 

(5) valueOf()ҎQ?q个Ҏ和toStringҎ是相对应的,q回带指定名U的指定枚Dcd的枚丑ָ量?/p>

  1. Color.valueOf("BLUE");   //q回l果: Color.BLUE 

(6) equals()ҎQ?比较两个枚Dcd象的引用?/p>

  1. //JDK源代码:        
  2. public final boolean equals(Object other) {    
  3.         return this==other;    

4、枚丄可以在switch语句中用?/strong>

  1. Color color=Color.RED;  
  2. switch(color){  
  3.         case RED: System.out.println("it's red");break;  
  4.         case BLUE: System.out.println("it's blue");break;  
  5.         case BLACK: System.out.println("it's blue");break;  

原文链接Q?a >http://www.cnblogs.com/frankliiu-java/archive/2010/12/07/1898721.html



]]>
hibernate二~存ȝhttp://www.aygfsteel.com/zuan-sky/archive/2012/11/07/390960.html黑蚂?/dc:creator>黑蚂?/author>Wed, 07 Nov 2012 07:09:00 GMThttp://www.aygfsteel.com/zuan-sky/archive/2012/11/07/390960.htmlhttp://www.aygfsteel.com/zuan-sky/comments/390960.htmlhttp://www.aygfsteel.com/zuan-sky/archive/2012/11/07/390960.html#Feedback0http://www.aygfsteel.com/zuan-sky/comments/commentRss/390960.htmlhttp://www.aygfsteel.com/zuan-sky/services/trackbacks/390960.html很多人对二~存都不太了解,或者是有错误的认识Q我一直想写一文章介l一下hibernate的二U缓存的Q今天终于忍不住了?
我的l验主要来自hibernate2.1版本Q基本原理和3.0?.1是一LQ请原谅我的固不化?

hibernate的session提供了一U缓存,每个sessionQ对同一个idq行两次loadQ不会发送两条sqll数据库Q但是session关闭的时候,一U缓存就失效了?

二~存是SessionFactoryU别的全局~存Q它底下可以使用不同的缓存类库,比如ehcache、oscache{,需要设|hibernate.cache.provider_classQ我们这里用ehcacheQ在2.1中就?
hibernate.cache.provider_class=net.sf.hibernate.cache.EhCacheProvider
如果使用查询~存Q加?
hibernate.cache.use_query_cache=true


~存可以单的看成一个MapQ通过key在缓存里面找value?

Class的缓?/strong>
对于一条记录,也就是一个PO来说Q是ҎID来找的,~存的key是IDQvalue是POJO。无论listQloadq是 iterateQ只要读Z个对象,都会填充~存。但是list不会使用~存Q而iterate会先取数据库select id出来Q然后一个id一个id的loadQ如果在~存里面有,׃~存取,没有的话去数据库load。假设是d~存Q需要设|:
&lt;cache usage="read-write"/&gt;
如果你用的二~存实现是ehcache的话Q需要配|ehcache.xml
&lt;cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" /&gt;
其中eternal表示~存是不是永q不时QtimeToLiveSeconds是缓存中每个元素Q这里也是一个POJOQ的时旉Q如?eternal="false"Q超q指定的旉Q这个元素就被移C。timeToIdleSeconds是发呆时_是可选的。当往~存里面put?元素过500个时Q如果overflowToDisk="true"Q就会把~存中的部分数据保存在硬盘上的时文仉面?
每个需要缓存的class都要q样配置。如果你没有配置Qhibernate会在启动的时候警告你Q然后用defaultCache的配|,q样多个class会共享一个配|?
当某个ID通过hibernate修改Ӟhibernate会知道,于是U除~存?
q样大家可能会想Q同L查询条gQ第一ơ先listQ第二次再iterateQ就可以使用到缓存了。实际上q是很难的,因ؓ你无法判断什么时?是第一ơ,而且每次查询的条仉常是不一LQ假如数据库里面?00条记录,id??00Q第一ơlist的时候出了前50个idQ第二次 iterate的时候却查询?0?0号idQ那?0-50是从~存里面取的Q?1?0是从数据库取的,共发?+20条sql。所以我一直认?iterate没有什么用QL会有1+N的问题?
Q题外话Q有说法说大型查询用list会把整个l果集装入内存,很慢Q而iterate只select id比较好,但是大型查询L要分|的,谁也不会真的把整个结果集装进来,假如一?0条的话,iterate共需要执?1条语句,list虽然选择 若干字段Q比iterateW一条select id语句慢一些,但只有一条语句,不装入整个结果集hibernateq会Ҏ数据库方a做优化,比如使用mysql的limitQ整体看来应该还?list快。)
如果惌对list或者iterate查询的结果缓存,p用到查询~存?

查询~存
首先需要配|hibernate.cache.use_query_cache=true
如果用ehcacheQ配|ehcache.xmlQ注意hibernate3.0以后不是net.sf的包名了
&lt;cache name="net.sf.hibernate.cache.StandardQueryCache"
   maxElementsInMemory="50" eternal="false" timeToIdleSeconds="3600"
   timeToLiveSeconds="7200" overflowToDisk="true"/&gt;
&lt;cache name="net.sf.hibernate.cache.UpdateTimestampsCache"
   maxElementsInMemory="5000" eternal="true" overflowToDisk="true"/&gt;
然后
query.setCacheable(true);//ȀzL询缓?
query.setCacheRegion("myCacheRegion");//指定要用的cacheRegionQ可?
W二行指定要使用的cacheRegion是myCacheRegionQ即你可以给每个查询~存做一个单独的配置Q用setCacheRegion来做q个指定Q需要在ehcache.xml里面配置它:
&lt;cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" /&gt;
如果省略W二行,不设|cacheRegion的话Q那么会使用上面提到的标准查询缓存的配置Q也是net.sf.hibernate.cache.StandardQueryCache

对于查询~存来说Q缓存的key是根据hql生成的sqlQ再加上参数Q分늭信息Q可以通过日志输出看到Q不q它的输Z是很可读Q最好改一下它的代码)?
比如hqlQ?
from Cat c where c.name like ?
生成大致如下的sqlQ?
select * from cat c where c.name like ?
参数?tiger%"Q那么查询缓存的key*大约*是这L字符Ԍ我是凭记忆写的,q不_Q不q看了也该明白了Q:
select * from cat c where c.name like ? , parameter:tiger%
q样Q保证了同样的查询、同L参数{条件下h一Lkey?
现在说说~存的valueQ如果是list方式的话Qvalue在这里ƈ不是整个l果集,而是查询出来的这一串ID。也是_不管是list?法还是iterateҎQ第一ơ查询的时候,它们的查询方式很它们qx的方式是一LQlist执行一条sqlQiterate执行1+N条,多出来的 行ؓ是它们填充了~存。但是到同样条gW二ơ查询的时候,都和iterate的行Z样了Q根据缓存的keyȝ存里面查CvalueQvalue?一串idQ然后在到class的缓存里面去一个一个的load出来。这样做是ؓ了节U内存?
可以看出来,查询~存需要打开相关cȝclass~存。list和iterateҎW一ơ执行的时候,都是既填充查询缓存又填充class~存的?
q里q有一个很Ҏ被忽视的重要问题Q即打开查询~存以后Q即使是listҎ也可能遇?+N的问题!相同 条gW一ơlist的时候,因ؓ查询~存中找不到Q不class~存是否存在数据QL发送一条sql语句到数据库获取全部数据Q然后填充查询缓存和 class~存。但是第二次执行的时候,问题来了,如果你的class~存的超时时间比较短Q现在class~存都超时了Q但是查询缓存还在,那么 listҎ在获取id串以后,会一个一个去数据库loadQ因此,class~存的超时时间一定不能短于查询缓存设|的时旉Q如果还讄了发呆时 间的话,保证class~存的发呆时间也大于查询的缓存的生存旉。这里还有其他情况,比如class~存被程序强制evict了,q种情况p自己注意 了?

另外Q如果hql查询包含select字句Q那么查询缓存里面的value是整个l果集了?

当hibernate更新数据库的时候,它怎么知道更新哪些查询~存呢?
hibernate在一个地方维护每个表的最后更新时_其实也就是放在上面net.sf.hibernate.cache.UpdateTimestampsCache所指定的缓存配|里面?
当通过hibernate更新的时候,hibernate会知道这ơ更新媄响了哪些表。然后它更新q些表的最后更新时间。每个缓存都有一个生成时 间和q个~存所查询的表Q当hibernate查询一个缓存是否存在的时候,如果~存存在Q它q要取出~存的生成时间和q个~存所查询的表Q然后去查找q?些表的最后更新时_如果有一个表在生成时间后更新q了Q那么这个缓存是无效的?
可以看出Q只要更新过一个表Q那么凡是涉及到q个表的查询~存失效了Q因此查询缓存的命中率可能会比较低?

Collection~存
需要在hbm的collection里面讄
&lt;cache usage="read-write"/&gt;
假如class是CatQcollection叫childrenQ那么ehcache里面配置
&lt;cache name="com.xxx.pojo.Cat.children"
   maxElementsInMemory="20" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200"
   overflowToDisk="true" /&gt;
Collection的缓存和前面查询~存的list一P也是只保持一串idQ但它不会因个表更新q就失效Q一个collection~存仅在q个collection里面的元素有增删时才失效?
q样有一个问题,如果你的collection是根据某个字D|序的Q当其中一个元素更C该字D|Q导致顺序改变时Qcollection~存里面的顺序没有做更新?

~存{略
只读~存Qread-onlyQ:没有什么好说的
?写缓存(read-writeQ?E序可能要的更新数据
不严格的?写缓存(nonstrict-read-writeQ:需要更新数据,但是两个事务更新同一条记录的可能性很,性能比读写缓存好
事务~存QtransactionalQ:~存支持事务Q发生异常的时候,~存也能够回滚,只支持jta环境Q这个我没有怎么研究q?

d~存和不严格d~存在实C的区别在于,d~存更新~存的时候会把缓存里面的数据换成一个锁Q其他事务如果去取相应的~存数据Q发现被锁住了,然后q接取数据库查询?
在hibernate2.1的ehcache实现中,如果锁住部分~存的事务发生了异常Q那么缓存会一直被锁住Q直?0U后时?
不严D写缓存不锁定~存中的数据?


使用二~存的前|条?/strong>
你的hibernateE序Ҏ据库有独占的写访问权Q其他的q程更新了数据库Qhibernate是不可能知道的。你操作数据库必需直接通过 hibernateQ如果你调用存储q程Q或者自׃用jdbc更新数据库,hibernate也是不知道的。hibernate3.0的大扚w更新和删 除是不更CU缓存的Q但是据?.1已经解决了这个问题?
q个限制相当的棘手,有时候hibernate做批量更新、删除很慢,但是你却不能自己写jdbc来优化,很郁闷吧?
SessionFactory也提供了U除~存的方法,你一定要自己写一些JDBC的话Q可以调用这些方法移除缓存,q些Ҏ是:
void evict(Class persistentClass)
          Evict all entries from the second-level cache.
void evict(Class persistentClass, Serializable id)
          Evict an entry from the second-level cache.
void evictCollection(String roleName)
          Evict all entries from the second-level cache.
void evictCollection(String roleName, Serializable id)
          Evict an entry from the second-level cache.
void evictQueries()
          Evict any query result sets cached in the default query cache region.
void evictQueries(String cacheRegion)
          Evict any query result sets cached in the named query cache region.
不过我不q样做,因ؓq样很难l护。比如你现在用JDBC扚w更新了某个表Q有3个查询缓存会用到q个表,?evictQueries(String cacheRegion)U除?个查询缓存,然后用evict(Class persistentClass)U除了class~存Q看上去好像完整了。不q哪天你d了一个相x询缓存,可能会忘记更新这里的U除代码。如果你?jdbc代码到处都是Q在你添加一个查询缓存的时候,q知道其他什么地方也要做相应的改动吗Q?

----------------------------------------------------

ȝQ?/strong>
不要惛_然的以ؓ~存一定能提高性能Q仅仅在你能够驾驭它q且条g合适的情况下才是这L。hibernate的二U缓存限制还是比较多的,不方便用jdbc可能会大大的降低更新性能。在不了解原理的情况下ؕ用,可能会有1+N的问题。不当的使用q可能导致读数据?
如果受不了hibernate的诸多限Ӟ那么q是自己在应用程序的层面上做~存吧?
在越高的层面上做~存Q效果就会越好。就好像管盘有缓存,数据库还是要实现自己的缓存,管数据库有~存Q咱们的应用E序q是要做~存。因?底层的缓存它q不知道高层要用q些数据q什么,只能做的比较通用Q而高层可以有针对性的实现~存Q所以在更高的别上做缓存,效果也要好些吧?
================================================================================
原文出处Qhttp://www.iteye.com/topic/18904Q对hibernate 二~存 讲解的很dQ所以{载了Q一同分?



]]>
Q按Ctrl+CQ选中的table表单中的数据Q粘_按Ctrl+VQ到目标文g(Excel,Word...)http://www.aygfsteel.com/zuan-sky/archive/2012/11/07/390922.html黑蚂?/dc:creator>黑蚂?/author>Wed, 07 Nov 2012 02:11:00 GMThttp://www.aygfsteel.com/zuan-sky/archive/2012/11/07/390922.htmlhttp://www.aygfsteel.com/zuan-sky/comments/390922.htmlhttp://www.aygfsteel.com/zuan-sky/archive/2012/11/07/390922.html#Feedback0http://www.aygfsteel.com/zuan-sky/comments/commentRss/390922.htmlhttp://www.aygfsteel.com/zuan-sky/services/trackbacks/390922.html希望q个Ҏ能帮助到你:
 1 public static void addCopyListener(final Table table) {
 2         table.addKeyListener(new KeyAdapter() {
 3             public void keyPressed(KeyEvent e) {
 4                 if (e.stateMask == SWT.CTRL && e.keyCode == 'c') {
 5                     Clipboard board = new Clipboard(Display.getDefault());
 6                     TableItem[] item = table.getSelection();
 7                     TableColumn[] tc = table.getColumns();
 8 
 9                     String copyStr = "";
10                     for (int i = 0; i < item.length; i++) {
11                         for (int j = 0; j < tc.length; j++) {
12                             copyStr += item[i].getText(j) + "\t";
13                         }
14                         copyStr = copyStr + "\n";
15                     }
16                     if (!"".equals(copyStr)) {
17                         board.setContents(new String[] { copyStr }, new Transfer[] { TextTransfer.getInstance() });
18                     }
19                 }
20             }
21         });
22     }


]]>
svn U色感叹?/title><link>http://www.aygfsteel.com/zuan-sky/archive/2012/10/17/389748.html</link><dc:creator>黑蚂?/dc:creator><author>黑蚂?/author><pubDate>Wed, 17 Oct 2012 08:04:00 GMT</pubDate><guid>http://www.aygfsteel.com/zuan-sky/archive/2012/10/17/389748.html</guid><wfw:comment>http://www.aygfsteel.com/zuan-sky/comments/389748.html</wfw:comment><comments>http://www.aygfsteel.com/zuan-sky/archive/2012/10/17/389748.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.aygfsteel.com/zuan-sky/comments/commentRss/389748.html</wfw:commentRss><trackback:ping>http://www.aygfsteel.com/zuan-sky/services/trackbacks/389748.html</trackback:ping><description><![CDATA[在解x件与插g的关pȝ时候,一个不心Q点L加插件的依赖的时候,点到了下面一个插件文ӞD两个插g怺依赖了,出C“svn U色感叹?#8221;标记Q去掉相互依赖,此问题解冟?img src ="http://www.aygfsteel.com/zuan-sky/aggbug/389748.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.aygfsteel.com/zuan-sky/" target="_blank">黑蚂?/a> 2012-10-17 16:04 <a href="http://www.aygfsteel.com/zuan-sky/archive/2012/10/17/389748.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>java swt table 点击表头排序http://www.aygfsteel.com/zuan-sky/archive/2012/04/24/376412.html黑蚂?/dc:creator>黑蚂?/author>Tue, 24 Apr 2012 01:56:00 GMThttp://www.aygfsteel.com/zuan-sky/archive/2012/04/24/376412.htmlhttp://www.aygfsteel.com/zuan-sky/comments/376412.htmlhttp://www.aygfsteel.com/zuan-sky/archive/2012/04/24/376412.html#Feedback0http://www.aygfsteel.com/zuan-sky/comments/commentRss/376412.htmlhttp://www.aygfsteel.com/zuan-sky/services/trackbacks/376412.htmlpublic class PickerShellTableSort {
    private Table table;
    private Image upImage;
    private Image downImage;
    
    private int[] sortFlags;
    private int[] sortColIndexes;
    
    public PickerShellTableSort(Table table) {
        int[] sortCols = new int[table.getColumnCount()];
        for (int i = 1; i < sortCols.length; i++) {
            sortCols[i] = i;
        }
        
        this.table = table;
        this.sortColIndexes = sortCols;     //需要排序的索引
        this.sortFlags = new int[table.getColumnCount()];
        
        init();
    }
    
    private void init() {
        for (int i = 0; i < sortColIndexes.length; i++) {
            final int sortColIndex = this.sortColIndexes[i];
            TableColumn col = table.getColumn(sortColIndex);
            
            col.addListener(SWT.Selection, new Listener() {
                public void handleEvent(Event event) {
                    columnHandleEvent(event, sortColIndex);
                }
            });
        }
        
        this.upImage = FrameCommonActivator.getImageDescriptor("icons/up.gif").createImage();
        this.downImage = FrameCommonActivator.getImageDescriptor("icons/down.gif").createImage();
    }
    
    private void columnHandleEvent(Event event, int sortColIndex) {
        try {
            for (int i = 0; i < sortColIndexes.length; i++) {
                TableColumn tabCol = table.getColumn(i);
                tabCol.setImage(null);
            }
            
            boolean selectColumnType = this.isStringOrNumberType(sortColIndex);
            
             if (this.sortFlags[sortColIndex] == 1) {
                 clearSortFlags();
                this.sortFlags[sortColIndex] = -1;
                
                if(selectColumnType) {
                    this.addNumberSorter(table.getColumn(sortColIndex), true);
                } else {
                    this.addStringSorter(table.getColumn(sortColIndex), true);
                }
                
                table.getColumn(sortColIndex).setImage(this.upImage);
            } else {
                this.sortFlags[sortColIndex] = 1;
                
                if(selectColumnType) {
                    this.addNumberSorter(table.getColumn(sortColIndex), false);
                } else {
                    this.addStringSorter(table.getColumn(sortColIndex), false);
                }
                
                table.getColumn(sortColIndex).setImage(this.downImage);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    
    /**
     * @param table
     * @param column
     * @param isAscend  
     */
    private void addStringSorter(TableColumn column,boolean isAscend) {
        
          Collator comparator = Collator.getInstance(Locale.getDefault());
          int columnIndex = getColumnIndex(table, column);
          TableItem[] items = table.getItems();
          //使用冒法进行排?br />          for (int i = 1; i < items.length; i++) {
              String str2value = items[i].getText(columnIndex);
              if(str2value.equalsIgnoreCase("")){
                 //当遇到表g的空目Ӟ停止往下检索排序项?br />                 break;
              }
              for (int j = 0; j < i; j++) {
                 String str1value = items[j].getText(columnIndex);
                 boolean isLessThan = comparator.compare(str2value, str1value) < 0;     
                 if ((isAscend && isLessThan) || (!isAscend && !isLessThan)) {
                      String[] values = getTableItemText(table, items[i]);
                      Object obj = items[i].getData();
                      items[i].dispose();
                      TableItem item = new TableItem(table, SWT.NONE, j);
                      item.setText(values);
                      item.setData(obj);
                      items = table.getItems();
                      break;
                 }
              }
           }
           table.setSortColumn(column);
           table.setSortDirection((isAscend ? SWT.UP : SWT.DOWN));
           isAscend = !isAscend;
      }
    
    
    private void addNumberSorter(TableColumn column,boolean isAscend) {
        
          int columnIndex = getColumnIndex(table, column);
          TableItem[] items = table.getItems();
          //使用冒法进行排?br />          for (int i = 1; i < items.length; i++) {
           String strvalue2 = items[i].getText(columnIndex);
           if(strvalue2.equalsIgnoreCase("")){
            //当遇到表g的空目Ӟ停止往下检索排序项?br />            break;
           }
           
           for (int j = 0; j < i; j++) {
            String strvalue1 = items[j].getText(columnIndex);
            
            //字W串cd数据转化为floatcd
            float numbervalue1=Float.valueOf(strvalue1);
            float numbervalue2=Float.valueOf(strvalue2);
            
            boolean isLessThan =false;
            if(numbervalue2<numbervalue1){
                isLessThan =true;
            }    
            
            if ((isAscend && isLessThan) || (!isAscend && !isLessThan)) {
                 String[] values = getTableItemText(table, items[i]);
                 Object obj = items[i].getData();
                 items[i].dispose();
                 TableItem item = new TableItem(table, SWT.NONE, j);
                 item.setText(values);
                 item.setData(obj);
                 items = table.getItems();
                 break;
            }
           }
          }
          
          table.setSortColumn(column);
          table.setSortDirection((isAscend ? SWT.UP : SWT.DOWN));
          isAscend = !isAscend;
     }
    
    private  int getColumnIndex(Table table, TableColumn column) {
        TableColumn[] columns = table.getColumns();
        for (int i = 0; i < columns.length; i++) {
            if (columns[i].equals(column))
                return i;
        }
        return -1;
     }
    
    private  String[] getTableItemText(Table table, TableItem item) {
        int count = table.getColumnCount();
        String[] strs = new String[count];
        for (int i = 0; i < count; i++) {
            strs[i] = item.getText(i);
        }
        return strs;
     }

     private void clearSortFlags() {
        for (int i = 0; i < table.getColumnCount(); i++) {
            this.sortFlags[i] = 0;
        }
     }
    
     /**
      * 判断当前选中列的数据cd
      * @return
      */
     private boolean isStringOrNumberType(int selectColumnIndex) {
         boolean isok = false ;
        
         TableItem[] items = table.getItems();
         String[] str = new String[items.length];
        
         for (int i = 0; i < items.length; i++) {
             str[i] = items[i].getText(selectColumnIndex);
         }
        
         for (int i = 0; i < str.length; i++) {
            String string = str[i];
            isok = string.matches("^(-|\\+)?\\d+\\.?\\d*$");
            //如果q一列中有一个是字符Ԍ也按字符串排?br />            if(!isok) {
                return isok;
            }
         }
        
         return isok ;
     }
    
}

]]>
վ֩ģ壺 | | Ϫ| ɽ| | | ˮ| | ӡ| | Ҫ| հ| | | ľ| | | | | | | | | Զ| | ƽ| ϵ| ¬| ƾ| | | | ƽ| Է| | ϰˮ| ˮ| | | | ̳|