热门文章
阿标在线 动力3.62HTML生成3.62网站文件说明
动力3.62整合动网7.0 SP2插
MDAC2.8 下载!
动力3.62版 防止垃圾留言
动力3.6全方位改动方法
让3.62不同频道实现不同风
把3.62首页登陆为横向代码
动易3.6首页随机FLASH修改
362首页和文章频道页图文幻
个性化修改3.6宝典
3.62轻易实现网摘功能
如何正确统计中文字数?
弹出JAVASCRIPT语法错误对
后台使“网站顶部LOGO地址
最新图片文章横向移动的修
html 生成艺术字
3.6 Sp2 Logo和Banner及广
日期值的计算
汉字转拼音
首页“图片更新”图片滚动
简体中文转换为繁体中文的
如何在css中定义链接的下划
两种数据库二进制字段存取控制方式的对比
[ 录入:阿标 | 点击数: | 更新时间:2005-3-7 17:05:00]
方式一:对于小容量的数据,进行一次载入内存,一次性获取
/// <summary>
/// 小容量附件数据读取性能测试
/// </summary>
/// <param name="strSql"></param>
/// <returns></returns>
public static bool ProcessDataFromDataBaseByAdapter(string strSql,out string strErr)
{
long t0 = Environment.TickCount;
DataTable table ;
if(!OleDataBaseProxy.ExecuteSql(strSql,out table,out strErr))return false;
long imageDataSizeCount = 0;
if(!CapabilityProxy.ProcessDataFromDataBase(ref table,out imageDataSizeCount,out strErr))return false;
long t1 = Environment.TickCount;
LogProxy.WriteLog("数据库性能测试:总耗时 "+ Convert.ToString(t1-t0) +" ms,数据量:" + imageDataSizeCount.ToString() + " bytes");
strErr = "";
return true;
}
/// <summary>
/// 执行数据查询操作
/// </summary>
/// <param name="strSql"></param>
/// <param name="table"></param>
/// <param name="strErr"></param>
/// <returns></returns>
public static bool ExecuteSql(string strSql,out System.Data.DataTable table,out string strErr)
{
System.Data.OleDb.OleDbConnection Cnn = new OleDbConnection();
Cnn.ConnectionString = ConfigProxy.GetValueByKey("OleConnectionString");
System.Data.OleDb.OleDbDataAdapter adapter = new OleDbDataAdapter(strSql,Cnn);
table = new System.Data.DataTable();
try
{
adapter.Fill(table);
}
catch(Exception Err)
{
strErr = Err.Message;
return false;
}
strErr = "";
//释放资源
Cnn.Dispose();
adapter.Dispose();
GC.Collect();
return true;
}
/// <summary>
/// 对数据库记录进行处理
/// </summary>
/// <param name="table"></param>
/// <param name="imageDataSizeCount"></param>
/// <param name="strErr"></param>
/// <returns></returns>
private static bool ProcessDataFromDataBase(ref DataTable table,out long imageDataSizeCount,out string strErr)
{
imageDataSizeCount = 0;
for(int i = 0;i < table.Rows.Count;i ++)
{
byte [] ImageContent = (byte[])table.Rows[i]["附件内容"];
imageDataSizeCount += Convert.ToInt64(table.Rows[i]["附件容量"]);
CapabilityProxy.ProcessImageData(ref ImageContent);
}
strErr = "";
return true;
}
方式二:在线进行,按指定尺寸分段获取
/// <summary>
/// 大容量附件数据读取性能测试
/// </summary>
/// <param name="strSql"></param>
/// <returns></returns>
public static bool ProcessDataFromDataBaseByReader(string strSql,out string strErr)
{
long t0 = Environment.TickCount;
long imageDataSizeCount = 0;
System.Data.OleDb.OleDbCommand cmd = new OleDbCommand();
OleDbConnection Cnn = new OleDbConnection(ConfigProxy.GetValueByKey("OleConnectionString"));
cmd.Connection = Cnn;
cmd.CommandText = strSql;
OleDbDataReader reader;
//开启连接
try
{
Cnn.Open();
}
catch(Exception Err)
{
strErr = Err.Message;
return false;
}
byte[] pixels = new byte[numPixels];
long readCount = 0;
reader = cmd.ExecuteReader();
//逐条处理
while(reader.Read())
{
for(long i = 0; i< Convert.ToInt64(reader.GetString(7)); i = i + numPixels)
{
readCount = reader.GetBytes(6,i,pixels,0,numPixels);
if(readCount == 0)
{
break;
}
else if(readCount == numPixels)
{
ProcessImageData(ref pixels);
}
else
{
byte[]buff = new byte[readCount];
ProcessImageData(ref buff);
}
imageDataSizeCount += readCount;
}
}
reader.Close();
//关闭连接
if(Cnn.State == System.Data.ConnectionState.Open)
{
Cnn.Close();
}
long t1 = Environment.TickCount;
LogProxy.WriteLog("数据库性能测试:总耗时 "+ Convert.ToString(t1-t0) +" ms,数据量:" + imageDataSizeCount.ToString() + " bytes");
//释放资源
Cnn.Dispose();
cmd.Dispose();
GC.Collect();
strErr = "";
return true;
}
/// <summary>
/// 缓冲区大小
/// </summary>
public static int numPixels = int.Parse(ConfigProxy.GetValueByKey("BufferSize"));
/// <summary>
/// 处理器延时
/// </summary>
public static int processImageRepeats = int.Parse(ConfigProxy.GetValueByKey("CpuLateTime"));
两种方式的比较:
第一种方式:减少数据库压力,数据大小已知
第二种方式:增加数据库压力,数据大小未知
总结:
根据实际应用情况进行选择,在二进制字段内容大小已知,数据库负担压力比较大的情况下选择第一种方式;在二进制字段内容大小未知,数据库负担压力较小的情况下选择第二种方式。