将数据库中二进制数据以异步方式写入磁盘

二进制|数据|数据库|异步

方式一:一次获取,异步写入
/// <summary>
/// 缓冲区大小
/// </summary>
public const int numPixels = 512 * 512;
/// <summary>
/// 将数据文件写入磁盘
/// </summary>
/// <param name="strSql"></param>
/// <returns></returns>
public static bool MakeFileWithWriteListByAdapter(string strSql,out string strErr)
{
if(File.Exists(ConfigProxy.GetValueByKey("ListFile")))File.Delete(ConfigProxy.GetValueByKey("ListFile"));
DataTable objTable;
if(!OleDataBaseProxy.ExecuteSql(strSql,out objTable,out strErr))return false;
string outputPath = ConfigProxy.GetValueByKey("OutputPath");
if(objTable.Rows.Count < 1) return false;
string strDirectory = outputPath + "\\";
if(!Directory.Exists(strDirectory)) Directory.CreateDirectory(strDirectory);
for(int i = 0;i< objTable.Rows.Count; i ++)
{

string fileName = objTable.Rows[i]["附件名称"].ToString();
//记录输出列表
LogProxy.WriteList(strDirectory + fileName);
//获取文件数据
byte [] ImageContent = (byte[])objTable.Rows[i]["附件内容"];
AutoResetEvent manualEvent = new AutoResetEvent(false);
FileStream fStream =
new FileStream(strDirectory + fileName,FileMode.Create,
FileAccess.ReadWrite, FileShare.None, 4096, true);
IAsyncResult asyncResult = fStream.BeginWrite(
ImageContent, 0, ImageContent.Length,
new AsyncCallback(EndWriteCallback),
new State(fStream, manualEvent));
manualEvent.WaitOne(5000, false);
fStream.Close();
}
strErr = "";
return true;
}
class State
{
public FileStream fStream;
public AutoResetEvent autoEvent;

public State(FileStream fStream, AutoResetEvent autoEvent)
{
this.fStream = fStream;
this.autoEvent = autoEvent;
}
}
static void EndWriteCallback(IAsyncResult asyncResult)
{

State stateInfo = (State)asyncResult.AsyncState;
int workerThreads;
int portThreads;
try
{
ThreadPool.GetAvailableThreads(out workerThreads,
out portThreads);
stateInfo.fStream.EndWrite(asyncResult);
Thread.Sleep(1500);
}
finally
{
stateInfo.autoEvent.Set();
}
}

方式二:联机读取,异步写入

/// <summary>
/// 缓冲区大小
/// </summary>
public const int numPixels = 512 * 512;
/// <summary>
/// 将数据文件写入磁盘
/// </summary>
/// <param name="strSql"></param>
/// <returns></returns>
public static bool MakeFileWithWriteListByReader(string strSql,out string strErr)
{
if(File.Exists(ConfigProxy.GetValueByKey("ListFile")))File.Delete(ConfigProxy.GetValueByKey("ListFile"));
string outputPath = ConfigProxy.GetValueByKey("OutputPath");
string strDirectory = outputPath + "\\";
if(!Directory.Exists(strDirectory)) Directory.CreateDirectory(strDirectory);
System.Data.OleDb.OleDbCommand cmd = new OleDbCommand();
OleDbConnection Cnn = new OleDbConnection(ConfigProxy.GetValueByKey("OleConnectionString"));
cmd.Connection = Cnn;
cmd.CommandText = strSql;
//开启连接
try
{
Cnn.Open();
}
catch(Exception Err)
{
strErr = Err.Message;
return false;
}
byte[] pixels = new byte[numPixels];
OleDbDataReader reader = cmd.ExecuteReader();
byte[]ImageContent;
//逐条处理
while(reader.Read())
{
string fileName = reader.GetString(1);
//记录输出列表
LogProxy.WriteList(strDirectory + fileName);
//获取文件数据
ImageContent = new byte[Convert.ToInt64(reader.GetString(7))];
reader.GetBytes(6,0,ImageContent,0,Convert.ToInt32(reader.GetString(7)));
AutoResetEvent manualEvent = new AutoResetEvent(false);
FileStream fStream =
new FileStream(strDirectory + fileName,FileMode.Create,
FileAccess.ReadWrite, FileShare.None, 4096, true);
IAsyncResult asyncResult = fStream.BeginWrite(
ImageContent, 0, ImageContent.Length,
new AsyncCallback(EndWriteCallback),
new State(fStream, manualEvent));
manualEvent.WaitOne(5000, false);
fStream.Close();
}
reader.Close();
//关闭连接
if(Cnn.State == System.Data.ConnectionState.Open)
{
Cnn.Close();
}
strErr = "";
//释放资源
Cnn.Dispose();
cmd.Dispose();
GC.Collect();
return true;
}
class State
{
public FileStream fStream;
public AutoResetEvent autoEvent;

public State(FileStream fStream, AutoResetEvent autoEvent)
{
this.fStream = fStream;
this.autoEvent = autoEvent;
}
}
static void EndWriteCallback(IAsyncResult asyncResult)
{

State stateInfo = (State)asyncResult.AsyncState;
int workerThreads;
int portThreads;
try
{
ThreadPool.GetAvailableThreads(out workerThreads,
out portThreads);
stateInfo.fStream.EndWrite(asyncResult);
Thread.Sleep(1500);
}
finally
{
stateInfo.autoEvent.Set();
}
}

两种方式的比较:

方式一:适合于数据库负载较大,二进制数据大小已知的情况;
方式二:适合于数据库负载较小,二进制数据大小未知的情况;

其中:两种方式的异步机制都是相同的,没有任何区别;异步机制的优点在于充分发挥了操作系统的优点
注意:在需要对性能进行同比测试的上下文中不能采用异步机制而必须尽量采用同步机制,以提高真实性

时间: 2016-02-06

将数据库中二进制数据以异步方式写入磁盘的相关文章

如何显示数据库中以 OLE 对象方式存储的 JPEG 图片

对象|数据|数据库|显示 在 ASP 中, 我们经常需要在 Web 页面上显示以二进制方式保存在数据库中的图片. 一般的图片显示没有什么问题, 因为这方面的文章已经很多了, 我就不再阐述. 但有时候数据库中的图片是通过其他办公软件输入的, 或者通过其他方式, 比如在 Access 中直接添加. 这时, 图片以 OLE 对象的方式保存在数据库中, 在图片真实内容的前面, 还保存了一些其他的信息, 比如图片的路径和文件名,等等. 如果我们还用一般的输出方式的话, 就会出错, 导致图片不能显示. 幸好

怎么把数据库中的某列循环写入数组并且与select选择的值进行比较

问题描述 做了个机房的申请系统,可以根据时间搜索机房是否可选,数据库中字段分别为开始周次sweek,结束周次eweek,星期day,节次time,要实现用户在select中选择的时间与机房已经安排的时间不冲突,按照下面的代码执行的话,只会同一个机房的最后一次安排中发生冲突(比如有个机房在三个时段被安排过了,但是只能在最后一次安排中发生时间冲突,之前两次安排的时间依旧可以选择这个机房),不知道错误在哪儿,希望大家帮帮新人for(inti=0;i<=count-1;i++){int[]sweek1=

jxl 数据库中几十万条数据写入Excel 内存溢出

问题描述 各位大虾.我用jxl将数据写入Excel报错:java.lang.OutOfMemoryError:Javaheapspace我从网上找了很多方法,如将每1万条数据写入一个sheet中,修改Xmx参数增加堆的最大使用内存.但是还是出错.跪谢了. 解决方案 解决方案二:优化一下代码,及时释放内存,应该可以的解决方案三:那是因为你需要的内存远远大于你设置的内存大小必须要一次性全部写入么,不能写一个sheet保存一下然后下一个sheet

asp.net 怎么能实现下载数据库中二进制的图片

问题描述 asp.net 怎么能实现下载数据库中二进制的图片 sql中是以二进制的方式存入图片的 想在 GridView( 或其它控件)中添加一列'下载',点下载按钮就下载对应imageid中的图片,怎么实现,请举例说明 解决方案 服务器端直接用 Response.BinaryWrite((byte[])dataset.Tables[0].Rows[0]["图片字段"]); 返回客户端 客户端加上 <img src="服务器地址" /> 解决方案二: 完

如何才能快速知道数据库中每个表的大小?

数据|数据库 sp_spaceused显示行数.保留的磁盘空间以及当前数据库中的表所使用的磁盘空间,或显示由整个数据库保留和使用的磁盘空间. 语法sp_spaceused [[@objname =] 'objname']    [,[@updateusage =] 'updateusage'] 参数[@objname =] 'objname' 是为其请求空间使用信息(保留和已分配的空间)的表名.objname 的数据类型是 nvarchar(776),默认设置为 NULL. [@updateus

ASP中数据库操作中游标和加锁方式

数据|数据库|游标 一般而言,下面是个典型的打开数据库的过程. < % '游标类型 Const adOpenForwardOnly = 0 Const adOpenKeyset = 1 Const adOpenDynamic = 2 Const adOpenStatic = 3 '加锁类型 Const adLockReadOnly = 1 Const adLockPessimistic = 2 Const adLockOptimistic = 3 Const adLockBatchOptimis

sql-VB写到SQL的数据为什么不按写入的先后顺序保存在数据库中?

问题描述 VB写到SQL的数据为什么不按写入的先后顺序保存在数据库中? 比如SQL数据库中有A,B,C三个数据,我删掉数据B,然后再写入数据D,数据库中存储顺序为什么是A,D,C,而不是A,C,D? 解决方案 你是怎么判断不是按照写入的先后顺序保存的? 根据自增长字段吗?

遍历-要将数据库中以字符串形式存在的表达式写入if..else if...else if代码中,怎样做到

问题描述 要将数据库中以字符串形式存在的表达式写入if..else if...else if代码中,怎样做到 如题,本来可以一直用if...else if... 把所有的表达式都遍历一遍以找出吻合的项的但现在要求弄个规则库,把表达式的信息都放在规则库中,方便对这些起约束作用的表达式就行管理,如增删查找等操作:我的设想是弄个数据库表,把表达式都存在表中,然后弄个if..else if循环遍历整个表的表达式,但问题是表达式存入数据库中在取出来是字符串,写入代码的时候会有""引号,不符合代码

asp.net-从SQL数据库中获取数据写入WORD文档,请附加代码,谢谢

问题描述 从SQL数据库中获取数据写入WORD文档,请附加代码,谢谢 基本格式:数据写入时需按一定格式(写入内容包含表格.文字.图片).标题居中等等 标题(含字体) 一.内容1 1.******* 2.***** 二.内容二 (1)***** 三.表格(或图片) 解决方案 c#里有一个非常不错的类库 叫aspose 里面可以操作word插入各种html以及表单以及图片. 非常不错 建议LZ搜索下 有很多相关代码,不想搜索你可以Call我 我发给你就是了 解决方案二: 在bai度中搜"java导出