#
一、实时查看带宽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 eth02、网卡eth0一周内的流量:#vnstat -i eth0 -w
摘要: 一、决策树简介: 关于决策树,几乎是数据挖掘分类算法中最先介绍到的。决策树,顾名思义就是用来做决定的树,一个分支就是一个决策过程。 每个决策过程中涉及一个数据的属性,而且只涉及一个。然后递归地,贪心地直到满足决策条件(即可以得到明确的决策结果)。 决策树的实现首先要有一些先验(已经知道结果的历史)数据做训练,通过分析训练数据得到每个属性对结果的影响的大小,这里我们通过... 阅读全文
摘要: 之前做了一个统计商铺的PV,UV值 大体思路:每天将用户的访问信息放到明细表里,然后在第二天的凌晨将这些数据归总 PVUV表 4个字段:主键pk 用户IP(customer_ip) 访问时间(time) 商铺ID(store_id) 统计TOTAL表&... 阅读全文
网上有好几种方法可以将将HTML文件转换成PDF文件但是有些对HTML文件格式要求比较严格,稍微错了一些就不能生成我们所要的PDF文件,这里我推荐一个 PD4ML,它可以解决HTML文件格式不正确的问题,可以生成一个比较好的PDF文件,其处理速度快,而且对CSS文件兼容的非常好。下面是最基本的PD4ML编程:- package samples;
-
- import java.awt.Insets;
- import java.io.File;
- import java.io.IOException;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.security.InvalidParameterException;
-
- import org.zefer.pd4ml.PD4Constants;
- import org.zefer.pd4ml.PD4ML;
-
- public class GettingStarted1 {
- protected int topValue = 10;
- protected int leftValue = 20;
- protected int rightValue = 10;
- protected int bottomValue = 10;
- protected int userSpaceWidth = 1300;
-
- public static void main(String[] args) {
- try {
- GettingStarted1 jt = new GettingStarted1();
- jt.doConversion("http://pd4ml.com/sample.htm", "c:/pd4ml.pdf");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public void doConversion( String url, String outputPath )
- throws InvalidParameterException, MalformedURLException, IOException {
- File output = new File(outputPath);
- java.io.FileOutputStream fos = new java.io.FileOutputStream(output);
-
- PD4ML pd4ml = new PD4ML();
-
- pd4ml.setHtmlWidth(userSpaceWidth); // set frame width of "virtual web browser"
-
- // choose target paper format and "rotate" it to landscape orientation
- pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
-
- // define PDF page margins
- pd4ml.setPageInsetsMM(new Insets(topValue, leftValue, bottomValue, rightValue));
-
- // source HTML document also may have margins, could be suppressed this way
- // (PD4ML *Pro* feature):
- pd4ml.addStyle("BODY {margin: 0}", true);
-
- // If built-in basic PDF fonts are not sufficient or
- // if you need to output non-Latin texts,
- // TTF embedding feature should help (PD4ML *Pro*)
- pd4ml.useTTF("c:/windows/fonts", true);
-
- pd4ml.render(new URL(url), fos); // actual document conversion from URL to file
- fos.close();
-
- System.out.println( outputPath + "\ndone." );
- }
- }
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. - package samples;
-
- import java.awt.Insets;;
- import java.io.BufferedInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
- import java.io.StringReader;
- import java.net.MalformedURLException;
- import java.net.URL;
- import java.security.InvalidParameterException;
-
- import org.zefer.pd4ml.PD4Constants;
- import org.zefer.pd4ml.PD4ML;
-
- public class GettingStarted2 {
- protected int topValue = 10;
- protected int leftValue = 20;
- protected int rightValue = 10;
- protected int bottomValue = 10;
- protected int userSpaceWidth = 1300;
-
- public static void main(String[] args) {
- try {
- GettingStarted2 jt = new GettingStarted2();
- String html = readFile("c:/sample.htm", "UTF-8");
- jt.doConversion2(html, "c:/pd4ml.pdf");
- } catch (Exception e) {
- e.printStackTrace();
- }
- }
-
- public void doConversion2( String htmlDocument, String outputPath )
- throws InvalidParameterException, MalformedURLException, IOException {
-
- PD4ML pd4ml = new PD4ML();
-
- pd4ml.setHtmlWidth(userSpaceWidth); // set frame width of "virtual web browser"
-
- // choose target paper format
- pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
-
- // define PDF page margins
- pd4ml.setPageInsetsMM(new Insets(topValue, leftValue, bottomValue, rightValue));
-
- // source HTML document also may have margins, could be suppressed this way
- // (PD4ML *Pro* feature):
- pd4ml.addStyle("BODY {margin: 0}", true);
-
- // If built-in basic PDF fonts are not sufficient or
- // if you need to output non-Latin texts, TTF embedding feature should help
- // (PD4ML *Pro*)
- pd4ml.useTTF("c:/windows/fonts", true);
-
- ByteArrayOutputStream baos = new ByteArrayOutputStream();
- // actual document conversion from HTML string to byte array
- pd4ml.render(new StringReader(htmlDocument), baos);
- // if the HTML has relative references to images etc,
- // use render() method with baseDirectory parameter instead
- baos.close();
-
- System.out.println( "resulting PDF size: " + baos.size() + " bytes" );
- // in Web scenarios it is a good idea to send the size with
- // "Content-length" HTTP header
-
- File output = new File(outputPath);
- java.io.FileOutputStream fos = new java.io.FileOutputStream(output);
- fos.write( baos.toByteArray() );
- fos.close();
-
- System.out.println( outputPath + "\ndone." );
- }
-
- private final static String readFile( String path, String encoding ) throws IOException {
-
- File f = new File( path );
- FileInputStream is = new FileInputStream(f);
- BufferedInputStream bis = new BufferedInputStream(is);
-
- ByteArrayOutputStream fos = new ByteArrayOutputStream();
- byte buffer[] = new byte[2048];
-
- int read;
- do {
- read = is.read(buffer, 0, buffer.length);
- if (read > 0) {
- fos.write(buffer, 0, read);
- }
- } while (read > -1);
-
- fos.close();
- bis.close();
- is.close();
-
- return fos.toString(encoding);
- }
- }
先说一下应用环境: 采用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发送来的包。
存储过程是一组预先编译好的sql语句。将他放在服务器上面,由用户通过指定存储过程的名字来执行它。 存储过程的优点: 封装——可用于操作数据库对象的方法,用户只需要知道它的输入输出参数并理解其目的即可。 改善性能——已经预先编译 减少网络流量——只返回最后的结果集 重要性——针对复杂逻辑,应用已经测试号的存储过程,不容易发生错误。 安全性——如果数据库拥有者DBO或者系统管理员SA编译并保存了存储结构,存储过程就有了对它使用的数据库对象的所有访问权限。因此系统管理员可以向单独的用于授予对数据对象的最小访问权限,而不是直接允许用户使用数据库对象。 这次项目开发中运用了不少的存储过程,中间遇到了一个小问题,大家可以看看: 事情是这样的:我想根据卡号、教师编号、教师姓名、联系电话这四个条件查询教师编号,这四个条件可以不存在,可以只存在一个,可以只存在两个,可以只存在三个,可以存在四个。开始我写的存储过程是这样的 - <span style="font-size:24px;">CREATE PROCEDURE [dbo].[procCardByMore]</span>
- @cardNo varchar (50),
- @TeacherID varchar(50),
- @Name varchar(50),
- @telephone varchar(50)
- AS
- DECLARE @sql varchar(1000)
- SET @sql='SELECT TeacherID as 教师编号,Name as 教师姓名,GradeName as 所属年级,cardNo as 卡号,cash as 卡内余额,realName as 管理员,OpenTime as 开卡时间,state as 状态,telephone as 联系电话 FROM view_CardDetail '
-
- IF(@cardNo <>'')
- BEGIN
- SET @sql=@sql+'and cardNo ='''+@cardNo+''''
- END
-
- IF(@TeacherID <>'')
- BEGIN
- SET @sql=@sql+'and TeacherID ='''+@TeacherID+''''
- END
-
- IF(@Name <>'')
- BEGIN
- SET @sql=@sql+'and Name ='''+@Name +''''
- END
-
- IF(@Name <>'')
- BEGIN
- SET @sql=@sql+'and telephone ='''+@telephone +''''
- END
-
- exec(@sql)
这里面假如卡号不为空的话,那么写出来的sql语句是这样的: - 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。然而这个时候如果加上个必然条件那就完美了,接下来的存储过程创建语句是这样的: - CREATE PROCEDURE [dbo].[procCardByMore]
- @cardNo varchar (50),
- @TeacherID varchar(50),
- @Name varchar(50),
- @telephone varchar(50)
- AS
- DECLARE @sql varchar(1000)
- 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 '
-
- IF(@cardNo <>'')
- BEGIN
- SET @sql=@sql+'and cardNo ='''+@cardNo+''''
- END
-
- IF(@TeacherID <>'')
- BEGIN
- SET @sql=@sql+'and TeacherID ='''+@TeacherID+''''
- END
-
- IF(@Name <>'')
- BEGIN
- SET @sql=@sql+'and Name ='''+@Name +''''
- END
-
- IF(@Name <>'')
- BEGIN
- SET @sql=@sql+'and telephone ='''+@telephone +''''
- END
-
- exec(@sql)
这样的话执行出来的结果是这样的: - 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“的需求,但是它的存在却恰好解决了两者互不相容的尴尬局面。 受上面的启发,下面的情况是这样解决的: 需要根据教师编号和起始日期查询教师的消费记录情况,两个条件的存在情况各自随便。 存储过程代码如下: - CREATE PROCEDURE [dbo].[procConsumeByMore]
- @TeacherID varchar(50),
- @TimeStart datetime,
- @TimeEnd datetime
- AS
- DECLARE @sql varchar(1000)
- 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 '
-
-
- IF(@TeacherID <>'')
- BEGIN
- SET @sql=@sql+'and TeacherID ='''+@TeacherID+''''
- END
-
- IF( @TimeStart<>null and @TimeEnd<>null)
- BEGIN
- SET @sql=@sql+'and consumeTime between '''+@TimeStart +''' and '''+@TimeEnd+''''
- END
-
- exec(@sql)
这里当@TimeStart和@TimeEnd为空的时候,空字符串不能转换成日期类型,这时候假如两个变量为空,我可以给他们赋一个完全的值: - exec procConsumeByMore '', '1799-01-01','9999-12-29'
如上面的代码就可以选择出所有的消费记录了。 上面两件事情中必然事件这个配角起了不可忽视的作用,然而必然事件却不是我们在查询过程中需要的条件。 生活中配角并不意味着无趣和呆板,配角一样可以灵动,只是它把对别人的善意放在第一位,不把张扬作为表达自己的方式。‘上善若水,水善利万物而不争’,但是水又无处不在,其实就是这样一种状态。创造一个最好的配角,并不比创造一个主角容易。
写了一个简单的委托的试用测试: 首先创建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 called ns"); } - (void)func4 { NSLog(@"function 4 called ns"); } 在 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 调用添加: [java] view plaincopyprint? test = [[FunctionTest alloc]init]; test.delegate = self; [test func1]; [test func2];
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; } } }
文档处理就是在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中
第一次去面试的时候人家人如何在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优化方面,希望大家留下宝贵的意见,多对交流!
|