pingpang

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  21 Posts :: 0 Stories :: 3 Comments :: 0 Trackbacks

#

一、实时查看带宽bmon
官方站点:http://people.suug.ch/~tgr/bmon/

gentoo:
安装:emerge net-analyzer/bmon

基本用法:bmon -o ascii -p eth0

其它linux系统可参照官方站点的说明使用。

二、带宽统计vnstat
官方站点:http://humdi.net/vnstat/

gentoo:
安装:emerge vnstat

第一次使用需要对每个网卡运行:#vnstat -u -i eth0 ……

1、查看5秒内网卡eth0的平均流量:
#vnstat -tr -i eth0

2、网卡eth0一周内的流量:
#vnstat -i eth0 -w 
posted @ 2012-07-26 22:37 往事随风 阅读(1601) | 评论 (0)编辑 收藏

     摘要: 一、决策树简介: 关于决策树,几乎是数据挖掘分类算法中最先介绍到的。决策树,顾名思义就是用来做决定的树,一个分支就是一个决策过程。 每个决策过程中涉及一个数据的属性,而且只涉及一个。然后递归地,贪心地直到满足决策条件(即可以得到明确的决策结果)。 决策树的实现首先要有一些先验(已经知道结果的历史)数据做训练,通过分析训练数据得到每个属性对结果的影响的大小,这里我们通过...  阅读全文
posted @ 2012-07-21 22:21 往事随风 阅读(1292) | 评论 (0)编辑 收藏

     摘要: 之前做了一个统计商铺的PV,UV值 大体思路:每天将用户的访问信息放到明细表里,然后在第二天的凌晨将这些数据归总 PVUV表 4个字段:主键pk    用户IP(customer_ip)    访问时间(time)    商铺ID(store_id) 统计TOTAL表&...  阅读全文
posted @ 2012-07-21 22:19 往事随风 阅读(1244) | 评论 (0)编辑 收藏

网上有好几种方法可以将将HTML文件转换成PDF文件但是有些对HTML文件格式要求比较严格,稍微错了一些就不能生成我们所要的PDF文件,这里我推荐一个

PD4ML,它可以解决HTML文件格式不正确的问题,可以生成一个比较好的PDF文件,其处理速度快,而且对CSS文件兼容的非常好。下面是最基本的

PD4ML编程:

Java代码 
  1. package samples;  
  2.   
  3. import java.awt.Insets;  
  4. import java.io.File;  
  5. import java.io.IOException;  
  6. import java.net.MalformedURLException;  
  7. import java.net.URL;  
  8. import java.security.InvalidParameterException;  
  9.   
  10. import org.zefer.pd4ml.PD4Constants;  
  11. import org.zefer.pd4ml.PD4ML;  
  12.   
  13. public class GettingStarted1 {  
  14.     protected int topValue = 10;  
  15.     protected int leftValue = 20;  
  16.     protected int rightValue = 10;  
  17.     protected int bottomValue = 10;  
  18.     protected int userSpaceWidth = 1300;  
  19.   
  20.     public static void main(String[] args) {  
  21.         try {  
  22.             GettingStarted1 jt = new GettingStarted1();  
  23.             jt.doConversion("http://pd4ml.com/sample.htm", "c:/pd4ml.pdf");  
  24.         } catch (Exception e) {  
  25.             e.printStackTrace();  
  26.         }  
  27.     }  
  28.   
  29.     public void doConversion( String url, String outputPath )   
  30.                 throws InvalidParameterException, MalformedURLException, IOException {  
  31.         File output = new File(outputPath);  
  32.         java.io.FileOutputStream fos = new java.io.FileOutputStream(output);  
  33.   
  34.         PD4ML pd4ml = new PD4ML();  
  35.               
  36.         pd4ml.setHtmlWidth(userSpaceWidth); // set frame width of "virtual web browser"   
  37.               
  38.         // choose target paper format and "rotate" it to landscape orientation  
  39.         pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));   
  40.               
  41.         // define PDF page margins  
  42.         pd4ml.setPageInsetsMM(new Insets(topValue, leftValue, bottomValue, rightValue));   
  43.   
  44.         // source HTML document also may have margins, could be suppressed this way   
  45.         // (PD4ML *Pro* feature):  
  46.         pd4ml.addStyle("BODY {margin: 0}", true);  
  47.               
  48.         // If built-in basic PDF fonts are not sufficient or   
  49.         // if you need to output non-Latin texts,  
  50.         // TTF embedding feature should help (PD4ML *Pro*)  
  51.         pd4ml.useTTF("c:/windows/fonts", true);  
  52.   
  53.         pd4ml.render(new URL(url), fos); // actual document conversion from URL to file  
  54.         fos.close();  
  55.               
  56.         System.out.println( outputPath + "\ndone." );  
  57.     }  
  58. }  
The following Java class slightly changes the above example. Now it pre-reads source HTML to a string and passes it torender()method wrapped toStringReader. First it writes PDF bytes toByteArrayOutputStream, which makes possible to measure size of the resulting document.

A disadvantage of the method is a bigger RAM utilization.

Java代码 
  1. package samples;  
  2.   
  3. import java.awt.Insets;;  
  4. import java.io.BufferedInputStream;  
  5. import java.io.ByteArrayOutputStream;  
  6. import java.io.File;  
  7. import java.io.FileInputStream;  
  8. import java.io.FileOutputStream;  
  9. import java.io.IOException;  
  10. import java.io.StringReader;  
  11. import java.net.MalformedURLException;  
  12. import java.net.URL;  
  13. import java.security.InvalidParameterException;  
  14.   
  15. import org.zefer.pd4ml.PD4Constants;  
  16. import org.zefer.pd4ml.PD4ML;  
  17.   
  18. public class GettingStarted2 {  
  19.     protected int topValue = 10;  
  20.     protected int leftValue = 20;  
  21.     protected int rightValue = 10;  
  22.     protected int bottomValue = 10;  
  23.     protected int userSpaceWidth = 1300;  
  24.   
  25.     public static void main(String[] args) {  
  26.         try {  
  27.             GettingStarted2 jt = new GettingStarted2();  
  28.             String html = readFile("c:/sample.htm", "UTF-8");  
  29.             jt.doConversion2(html, "c:/pd4ml.pdf");  
  30.         } catch (Exception e) {  
  31.             e.printStackTrace();  
  32.         }  
  33.     }  
  34.   
  35.     public void doConversion2( String htmlDocument, String outputPath )   
  36.                 throws InvalidParameterException, MalformedURLException, IOException {  
  37.   
  38.         PD4ML pd4ml = new PD4ML();  
  39.               
  40.         pd4ml.setHtmlWidth(userSpaceWidth); // set frame width of "virtual web browser"   
  41.               
  42.         // choose target paper format  
  43.         pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));   
  44.               
  45.         // define PDF page margins  
  46.         pd4ml.setPageInsetsMM(new Insets(topValue, leftValue, bottomValue, rightValue));   
  47.   
  48.         // source HTML document also may have margins, could be suppressed this way   
  49.         // (PD4ML *Pro* feature):  
  50.         pd4ml.addStyle("BODY {margin: 0}", true);  
  51.               
  52.         // If built-in basic PDF fonts are not sufficient or   
  53.         // if you need to output non-Latin texts, TTF embedding feature should help   
  54.         // (PD4ML *Pro*)  
  55.         pd4ml.useTTF("c:/windows/fonts", true);  
  56.   
  57.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  58.         // actual document conversion from HTML string to byte array  
  59.         pd4ml.render(new StringReader(htmlDocument), baos);   
  60.         // if the HTML has relative references to images etc,   
  61.         // use render() method with baseDirectory parameter instead  
  62.         baos.close();  
  63.           
  64.         System.out.println( "resulting PDF size: " + baos.size() + " bytes" );  
  65.         // in Web scenarios it is a good idea to send the size with   
  66.         // "Content-length" HTTP header  
  67.   
  68.         File output = new File(outputPath);  
  69.         java.io.FileOutputStream fos = new java.io.FileOutputStream(output);  
  70.         fos.write( baos.toByteArray() );  
  71.         fos.close();  
  72.           
  73.         System.out.println( outputPath + "\ndone." );  
  74.     }  
  75.       
  76.     private final static String readFile( String path, String encoding ) throws IOException {  
  77.   
  78.         File f = new File( path );  
  79.         FileInputStream is = new FileInputStream(f);  
  80.         BufferedInputStream bis = new BufferedInputStream(is);  
  81.           
  82.         ByteArrayOutputStream fos = new ByteArrayOutputStream();  
  83.         byte buffer[] = new byte[2048];  
  84.   
  85.         int read;  
  86.         do {  
  87.             read = is.read(buffer, 0, buffer.length);  
  88.             if (read > 0) {   
  89.                 fos.write(buffer, 0, read);   
  90.             }  
  91.         } while (read > -1);  
  92.   
  93.         fos.close();  
  94.         bis.close();  
  95.         is.close();  
  96.   
  97.         return fos.toString(encoding);  
  98.     }  
  99. }  
posted @ 2012-07-21 22:19 往事随风 阅读(1420) | 评论 (0)编辑 收藏

先说一下应用环境:

采用Tilera的平台(一种众核平台,),三张网卡,两个10G的xgbe网卡,用来进行数据的发送和接受;一个1G的普通网卡,用来做管理接口.


10G的xgbe工作在Tilera的特定sdk下,其中的数据包不经过内核协议栈,直接交付给用户。这样的好处是数据处理效率很高(普通的linux协议栈中需要两次内存的拷贝,效率低),但是也因此带来了一些问题,有些包需要交给标准的协议栈 ,比如ospf报文,zebra工作在用户态,需要从标准的协议栈内获取网络数据包,而xgbe是不会直接把数据交付给标准协议栈的。


TAP虚拟网卡是Linux标准的虚拟网络设备,在Tilera平台上其编程也是一样的。

拥有这样的虚拟网卡后可以利用其通用linux协议栈的特性,并可以将数据包交付应用层的socket程序处理。ospfd程序就可以利用TAP进程收到ospf报文,并发布默认路由出去。


上图是TAP网卡的收发包流程图

左侧红色箭头标示的为从协议栈经TAP网卡发包标示,对从tap读进来的包进行一下netio封装,然后经过xbge发送出去

右侧绿色箭头标示的为数据包经TAP网卡收至协议栈的流程,调用netio(tilera 特定的网络编程api)从xgbe中收到发送给tap的报后,经过包处理进程将数据包交付给TAP进程,其实就是将收到的包写进tap网卡中,这样用户进程就可以再内核协议栈中接受到通过xgbe发送来的包。

posted @ 2012-07-19 22:23 往事随风 阅读(1861) | 评论 (0)编辑 收藏

    存储过程是一组预先编译好的sql语句。将他放在服务器上面,由用户通过指定存储过程的名字来执行它。

        存储过程的优点:

        封装——可用于操作数据库对象的方法,用户只需要知道它的输入输出参数并理解其目的即可。

        改善性能——已经预先编译

        减少网络流量——只返回最后的结果集

        重要性——针对复杂逻辑,应用已经测试号的存储过程,不容易发生错误。

        安全性——如果数据库拥有者DBO或者系统管理员SA编译并保存了存储结构,存储过程就有了对它使用的数据库对象的所有访问权限。因此系统管理员可以向单独的用于授予对数据对象的最小访问权限,而不是直接允许用户使用数据库对象。

        这次项目开发中运用了不少的存储过程,中间遇到了一个小问题,大家可以看看:

        事情是这样的:我想根据卡号、教师编号、教师姓名、联系电话这四个条件查询教师编号,这四个条件可以不存在,可以只存在一个,可以只存在两个,可以只存在三个,可以存在四个。开始我写的存储过程是这样的

  1. <span style="font-size:24px;">CREATE PROCEDURE [dbo].[procCardByMore]</span>  
  2.     @cardNo varchar (50),  
  3.     @TeacherID varchar(50),   
  4.     @Name varchar(50),  
  5.     @telephone varchar(50)    
  6. AS   
  7. DECLARE @sql varchar(1000)   
  8. SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话 FROM view_CardDetail '  
  9.   
  10. IF(@cardNo <>'')   
  11. BEGIN   
  12. SET @sql=@sql+'and  cardNo ='''+@cardNo+''''  
  13. END  
  14.   
  15. IF(@TeacherID <>'')   
  16. BEGIN   
  17. SET @sql=@sql+'and  TeacherID ='''+@TeacherID+''''  
  18. END  
  19.   
  20. IF(@Name <>'')   
  21. BEGIN   
  22. SET @sql=@sql+'and  Name ='''+@Name +''''  
  23. END  
  24.   
  25. IF(@Name <>'')   
  26. BEGIN   
  27. SET @sql=@sql+'and  telephone ='''+@telephone +''''  
  28. END  
  29.   
  30. exec(@sql)  

        这里面假如卡号不为空的话,那么写出来的sql语句是这样的:

  1. SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话FROM view_CardDetail and  cardNo ='@cardNo’  

       这句话显然是错误的,在查询语句和条件的过渡的地方没有where,而是突然来了个and。然而这个时候如果加上个必然条件那就完美了,接下来的存储过程创建语句是这样的:

  1. CREATE PROCEDURE [dbo].[procCardByMore]  
  2.     @cardNo varchar (50),  
  3.     @TeacherID varchar(50),   
  4.     @Name varchar(50),  
  5.     @telephone varchar(50)    
  6. AS   
  7. DECLARE @sql varchar(1000)   
  8. SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话FROM view_CardDetail WHERE 1=1 '  
  9.   
  10. IF(@cardNo <>'')   
  11. BEGIN   
  12. SET @sql=@sql+'and  cardNo ='''+@cardNo+''''  
  13. END  
  14.   
  15. IF(@TeacherID <>'')   
  16. BEGIN   
  17. SET @sql=@sql+'and  TeacherID ='''+@TeacherID+''''  
  18. END  
  19.   
  20. IF(@Name <>'')   
  21. BEGIN   
  22. SET @sql=@sql+'and  Name ='''+@Name +''''  
  23. END  
  24.   
  25. IF(@Name <>'')   
  26. BEGIN   
  27. SET @sql=@sql+'and  telephone ='''+@telephone +''''  
  28. END  
  29.   
  30. exec(@sql)  

        这样的话执行出来的结果是这样的:

  1. SELECT TeacherID as 教师编号,Nameas 教师姓名,GradeName as 所属年级,cardNo as 卡号,cashas 卡内余额,realName as 管理员,OpenTime as 开卡时间,stateas 状态,telephone as 联系电话FROM view_CardDetail WHERE 1=1and  cardNo ='+@cardNo+'  

            必然条件在这里充当了桥梁的作用,虽然我们没有“1=1“的需求,但是它的存在却恰好解决了两者互不相容的尴尬局面。

        受上面的启发,下面的情况是这样解决的:

        需要根据教师编号和起始日期查询教师的消费记录情况,两个条件的存在情况各自随便。

        存储过程代码如下:

  1. CREATE PROCEDURE [dbo].[procConsumeByMore]   
  2.     @TeacherID varchar(50),   
  3.     @TimeStart datetime,   
  4.     @TimeEnd datetime   
  5. AS   
  6. DECLARE @sql varchar(1000)   
  7. SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,orderID as 订单编号,adultNum as 成人数量,childNum as 儿童数量,consumeCash as 消费金额,consumeTime as 消费时间,userID as 管理员编号,realName as 管理员姓名FROM view_consumeDetail WHERE 1=1 '  
  8.   
  9.   
  10. IF(@TeacherID <>'')   
  11. BEGIN   
  12. SET @sql=@sql+'and  TeacherID ='''+@TeacherID+''''  
  13. END  
  14.   
  15. IF( @TimeStart<>null and @TimeEnd<>null)   
  16. BEGIN   
  17. SET @sql=@sql+'and  consumeTime between '''+@TimeStart +''' and '''+@TimeEnd+''''  
  18. END  
  19.   
  20. exec(@sql)  

        这里当@TimeStart和@TimeEnd为空的时候,空字符串不能转换成日期类型,这时候假如两个变量为空,我可以给他们赋一个完全的值:

  1. exec procConsumeByMore '', '1799-01-01','9999-12-29'  

               如上面的代码就可以选择出所有的消费记录了。

        上面两件事情中必然事件这个配角起了不可忽视的作用,然而必然事件却不是我们在查询过程中需要的条件。

        生活中配角并不意味着无趣和呆板,配角一样可以灵动,只是它把对别人的善意放在第一位,不把张扬作为表达自己的方式。‘上善若水,水善利万物而不争’,但是水又无处不在,其实就是这样一种状态。创造一个最好的配角,并不比创造一个主角容易。
posted @ 2012-07-17 21:29 往事随风 阅读(688) | 评论 (0)编辑 收藏

写了一个简单的委托的试用测试:

首先创建FunctionTest类,声明委托:

FunctionTest.h

[java] view plaincopyprint?
//  
//  FunctionTest.h  
//  DelegateDemo  
//  
//  Created by shx on 12-7-17.  
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
//  
  
#import <Foundation/Foundation.h>  
  
@protocol FunctionTestDelegate;  
  
@interface FunctionTest : NSObject  
{  
    id<FunctionTestDelegate> delegate;  
}  
@property (nonatomic, assign)id<FunctionTestDelegate> delegate;  
- (void)func1;  
- (void)func2;  
@end  
  
@protocol FunctionTestDelegate <NSObject>  
  
- (void)func3;  
- (void)func4;  
  
@end  

FunctionTest.m
[java] view plaincopyprint?
//  
//  FunctionTest.m  
//  DelegateDemo  
//  
//  Created by shx on 12-7-17.  
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
//  
  
#import "FunctionTest.h"  
  
@implementation FunctionTest  
  
@synthesize delegate;  
  
- (void)func1  
{  
    NSLog(@"function 1 called");  
    [delegate performSelector:@selector(func3)];  
}  
  
- (void)func2  
{  
    NSLog(@"function 2 called");  
    [delegate performSelector:@selector(func4)];  
}  
@end  

在appdelegate中实现委托:
[java] view plaincopyprint?
//  
//  AppDelegate.h  
//  DelegateDemo  
//  
//  Created by shx on 12-7-17.  
//  Copyright (c) 2012年 __MyCompanyName__. All rights reserved.  
//  
  
#import <UIKit/UIKit.h>  
#import "FunctionTest.h"  
  
@class ViewController;  
  
@interface AppDelegate : UIResponder <UIApplicationDelegate,FunctionTestDelegate>  
{  
    FunctionTest *test;  
}  
  
@property (strong, nonatomic) UIWindow *window;  
  
@property (strong, nonatomic) ViewController *viewController;  
  
@end  
AppDelegate.m中实现:
[java] view plaincopyprint?
#pragma mark -FunctionTestDelegate  
- (void)func3  
{  
    NSLog(@"function 3 calledns");  
}  
- (void)func4  
{  
    NSLog(@"function 4 calledns");  
}  




- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
调用添加:
[java] view plaincopyprint?
test = [[FunctionTest alloc]init];  
    test.delegate = self;  
      
    [test func1];  
    [test func2];  

posted @ 2012-07-17 21:26 往事随风 阅读(7319) | 评论 (0)编辑 收藏

package gongzibai.co.cc;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemSelectedListener;
import android.widget.BaseAdapter;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.Toast;

public class Gallery1Activity extends
  Activity {
 public static final int CHANGE_BANNER = 1;
 private int cur_index = 0;

 /** Called when the activity is first created. */
 @Override
 public void onCreate(
   Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.main);

  final DetialGallery gallery = (DetialGallery) findViewById(R.id.widget1);
  ImageAdapter imageAdapter = new ImageAdapter(
    Gallery1Activity.this);

  gallery.setAdapter(imageAdapter);

  final Handler handler = new Handler() {
   public void handleMessage(
     Message msg) {

    switch (msg.what) {

    case CHANGE_BANNER:

     gallery.onKeyDown(
       KeyEvent.KEYCODE_DPAD_RIGHT,
       null);

     break;

    default:

     break;

    }

   };
  };
  // new Thread(new Runnable() {
  // int flag = 1;
  //
  // public void run() {
  //
  // while (true) {
  //
  // handler.sendEmptyMessage(CHANGE_BANNER);
  //
  // try {
  //
  // Thread.sleep(1000);
  //
  // } catch (InterruptedException e) {
  //
  // e.printStackTrace();
  //
  // }
  //
  // }
  //
  // }
  //
  // }
  //
  // ).start();

  gallery.setOnItemSelectedListener(new OnItemSelectedListener() {

   @Override
   public void onItemSelected(
     AdapterView<?> arg0,
     View arg1,
     int arg2, long arg3) {
    // TODO Auto-generated method stub
    Toast.makeText(
      Gallery1Activity.this,
      "这是第" + arg2
        + "张图片",
      2).show();
   }

   @Override
   public void onNothingSelected(
     AdapterView<?> arg0) {
    // TODO Auto-generated method stub

   }
  });

 }

 class ImageAdapter extends
   BaseAdapter {
  Context context;
  int[] imgResId = new int[] {
    R.drawable.icon,
    R.drawable.icon2,
    R.drawable.icon3,
    R.drawable.icon,
    R.drawable.icon2,
    R.drawable.icon3,

  };

  public ImageAdapter(
    Gallery1Activity gallery1Activity) {
   // TODO Auto-generated constructor stub
   super();
   this.context = gallery1Activity;
  }

  @Override
  public int getCount() {
   // TODO Auto-generated method stub
   // return Integer.MAX_VALUE;
   return Integer.MAX_VALUE;

  }

  @Override
  public Object getItem(
    int position) {
   // TODO Auto-generated method stub

   return position;
   //
   // return position;
   // return position;

  }

  @Override
  public long getItemId(
    int position) {
   // TODO Auto-generated method stub
   return position;
  }

  @Override
  public View getView(int arg0,
    View arg1,
    ViewGroup arg2) {
   // TODO Auto-generated method stub
   ImageView imageView = new ImageView(
     context);
   imageView
     .setImageResource(imgResId[arg0%imgResId.length]);
   imageView
     .setScaleType(ImageView.ScaleType.FIT_XY);
   imageView
     .setLayoutParams(new Gallery.LayoutParams(
       175, 200));

   return imageView;

  }

 }
}

posted @ 2012-07-17 21:25 往事随风 阅读(1554) | 评论 (0)编辑 收藏

文档处理就是在dom元素中添加html内容
1、
 $("p").append("<a href='www.baidu.com'>baidu</a>") ;  增加内容到p标签内部 
2、
$("p").appendTo("div") ;  把所有的p元素增加到div中
3、
$("p").prepend("<b>Hello</b>");  增加所有的b元素到p前
4、
$("p").prependTo("#foo");   把p前置添加到id为 foo中。。
5、 
$("p").after( $("b") );  将p添加到b的后面 
6、 
$("p").before("<b>Hello</b>"); 在所有p元素之前插入html  
7、
$("p").insertAfter("#foo");  将p插入id为foo元素的后面 
8、
$("p").insertBefore("#foo");  
 $("#foo").before("p")   操作相同,把所有元素插入到一个元素之前 
9、
$("p").wrap("<div class='wrap'></div>");   把所有p用div包装起来  
10 、
 $("p").unwrap()    移除p元素的父元素
11、
$("p").wrapAll(document.createElement("div"));  用div包装所有p
12、
$("<b>Paragraph. </b>").replaceAll("p");  替换所有p
13、
$("p").empty();   删除p集合中的所有子节点 
14 、
$("p").remove();  从集合中移除所有p元素 
15 、
$("p").detach(".hello");   从DOM中把带有hello类的段落删除
16、 
$("b").clone().prependTo("p");   复制b元素 并且添加到p中 
posted @ 2012-07-15 18:11 往事随风 阅读(930) | 评论 (0)编辑 收藏

       第一次去面试的时候人家人如何在SSH框架下,如何进行Hibernate的优化,当时自己只是看到这些根本就没有系统的总结这些东西,今天终于找到一个时间来解决一下自己面试的这个问题了。

Hibernate自述

           我天生效率比较低,在普遍情况下,需要将执行转换为SQL语句的Hibernate低于直接JDBC存取。但是在经过比较好的性能优化之后,我的性能还是让人相当满意的,特别是应用二级缓存之后,甚至可以获得比较不使用缓存的JDBC更好的性能。

优化总结

           要想优化Hibernate,我们必须知道应该从什么地方进行优化,从什么地方入手。Hibernate的优化方向:数据库设计、HQL优化、缓存、主配置、延迟加载、方法选用、集合选用、事物控制、批量操作

 

具体分析

第一点:数据库设计

       前边博客介绍过 数据库设计,今天我们还从这开始,表的设计就是建楼的基础,如何让基础简洁而结实这是最重要的。

优化策略:

1.   建索引

2.   减少表之间的关联

3.   简化查询字段,没用的字段不要,已经对返回结果的控制,尽量返回少量数据

4.   适当的冗余数据,不过分最求高范式

第二点:HQL优化


                                            (HQL知识图)

     假如想好好了解一下的建议看一下这篇博客HQL详细使用,我个人认为写的还可以,知识总结的很细致。

总结:

1.   实体查询:可以使用sql语句查询

2.   实体的更新和删除:hibernate3中直接提供更加灵活更加效率的解决方法

3.   属性查询:动态构造实例对象,对结果集进行封装

4.   分组与排序:

A.   Order by子句

B.   Group by子句与统计查询

C.   优化统计查询:内连接,外连接

5.   参数绑定:和jdbc一样,对hibernate的参数绑定提供了丰富的支持。

第三点:缓存

运行机制:

介于应用程序和物理数据源之间,其作用是为了降低应用程序对物理数据源访问的频数,从而提高运行性能。

缓存被广泛应用的用于优化数据库。当一些数据被从数据库中读取出来的时候,我们可以把它们放到缓存里。这样我们可以再次使用的时候直接从缓存中取出来,这样我们的效率就提高了很多。

控制范围:

一级缓存是session对象的生命周期通常对应的一个数据库事务或者一个应用事务,它是事务范围内的缓存

二级缓存是一个可插拔的缓存插件,它是由SessionFactory负责管理。由于SessionFactory对象的生命周期和应用程序的整个过程对应,所以二级缓存是进城范围或者集群范围内的缓存。用于初始化很少更改的数据、不重要的数据,不会并发访问的数据。

 

Hibernate缓存的一些问题和建议:hibernate的缓存

第四点:捉取策略

1.  捉取优化:Hibernate在关联关系之间进行导航,充分利用Hibernate提供的技术

2.  如何捉取

立即捉取:当捉取宿主对象时,同时捉取其相关对象和关联集以及属性

延迟加载:当捉宿主对象时,并不捉取其关联对象,而是当对其对象进行调用时才加载。

3.  捉取粒度:设置捉取个数

第五点:批量数据处理(修改和删除)

在Hibernate2中,如果需要对任何数据进行修改和删除操作都需要先执行查询操作,在得到数据后才进行修改和删除。

1.  不适用Hibernate API而是直接使用JDBC  API来做原生态SQL语句进行查询,这种方法比较好,相对来说较快。

2.  运用存储过程

3.  一定量范围内可以使用hibernate API,但是特大数据量不行。

第六点:结果集的使用:

     结果集的使用:list()和iterator()区别

查询方式:

list只能利用查询缓存(但在交易系统中查询缓存作用不大),无法利用二级缓存中的单个实体,但是list查出的对象会写入二级缓存,但它一般只生成较少的sql语句,很多情况就是一条。

iterator则利用二级缓存,对于一条查询语句,它会先从数据库中找到所有符合条件的记录的ID,在通过ID去缓存找,对于缓存中没有的记录,在构造语句从数据库查出,第一次的执行会产生N+1条SQL语句。

产生结果:

用list可能会溢出

通过Iterator,配合缓存管理API,在海量数据查询中可以很好的解决内存问题。

综合考虑

一般List会填充二级缓存,却不能利用二级缓存,而Iterator可以读二级缓存,然而无法命中的话,效率很低效。一般处理方法,就是第一次查询使用list,随后使用iterator查询。

总结

 

Hibernate优化总结还有主配置、方法选用、事物控制没有涉及到,因为它们相对来说这些方面比较简单,但是还是很重要的。

在实施一个项目的时候我们没有必要想这些问题,做项目的时候第一步运行起来,第二步优化一下。在很多小型项目中第二步一般都不会去做,所以说我们做工程的时候还是要牢记运行出来,假如自己作为研究或者这个问题比较严重的话我们才考虑优化。

Hibernate调优方面没有最有只有更优,让我们不断积极找到优化的方法,来优化我们的程序,来优化我们自己。

关于Hibernate优化方面,希望大家留下宝贵的意见,多对交流!

posted @ 2012-07-15 18:04 往事随风 阅读(884) | 评论 (0)编辑 收藏

仅列出标题
共2页: 上一页 1 2