问题是这样的,我们这里要做一个数据库测试,要用到CACHE功能,而且还要并发进行,也就是说,要这样完成,首先,要同时生成十个THREAD,然后它们都去调一个方法,这个方法从数据库里多次查询出一些相同信息,但是...,第一次查询时候要把结果集DATASET放进CACHE里,也就是说,多个线程调用同一个CACHE里的内容,只有当里面没有的时候才查询一次,以后都直接从CACHE里取就可以,但是我怎么做都实现不了,请问,这种东西可实现吗,请解释,谢谢,一下是我的部分代码...调用那个方法在不用THREAD的时候是好使的,就是只有第一次查询了,之后都从CACHE里取的,但是多THREAD一调用就不好使了,愁啊...,谁知道啊,请帮助一下啊...
msn:[email protected]
protected void Button2_Click(object sender, EventArgs e)
{
............
sqlCnn = new SqlConnection(strCnn);
sqlCnn.Open();
for (int i = 0; i < 10; i++)
{
Thread th = new Thread(new ThreadStart(byThread));
th.Start(); }
} private void byThread()
{
......数据库连接建立... sqlCnn = new SqlConnection(strCnn);
sqlCnn.Open();
long beginTime = DateTime.Now.Ticks;
DataSet ds = null; HttpContext context = HttpContext.Current;
if (context != null)
{
ch = context.Cache;
}
else
{
ch = HttpRuntime.Cache;
} for (int i = 0; i < 1000; i++)
{
if (null != ch["dsAll"])
{
ds = (DataSet)ch["dsAll"];
//DataRow[] temRow = ds.Tables["images"].Select();
}
else
{
ds = new DataSet();
SqlCommand cmm = new SqlCommand();
cmm.Connection = sqlCnn;
cmm.CommandText = "select ImageBody from images";
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = cmm;
adp.Fill(ds, "images"); Cache.Insert("dsAll", ds,
new SqlCacheDependency("ImageDB", "images"));
}
}
long endTime = DateTime.Now.Ticks;
this.allTime = allTime + (endTime - beginTime);
TextBox1.Text = allTime.ToString();
Thread.Sleep(0);
}
msn:[email protected]
protected void Button2_Click(object sender, EventArgs e)
{
............
sqlCnn = new SqlConnection(strCnn);
sqlCnn.Open();
for (int i = 0; i < 10; i++)
{
Thread th = new Thread(new ThreadStart(byThread));
th.Start(); }
} private void byThread()
{
......数据库连接建立... sqlCnn = new SqlConnection(strCnn);
sqlCnn.Open();
long beginTime = DateTime.Now.Ticks;
DataSet ds = null; HttpContext context = HttpContext.Current;
if (context != null)
{
ch = context.Cache;
}
else
{
ch = HttpRuntime.Cache;
} for (int i = 0; i < 1000; i++)
{
if (null != ch["dsAll"])
{
ds = (DataSet)ch["dsAll"];
//DataRow[] temRow = ds.Tables["images"].Select();
}
else
{
ds = new DataSet();
SqlCommand cmm = new SqlCommand();
cmm.Connection = sqlCnn;
cmm.CommandText = "select ImageBody from images";
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = cmm;
adp.Fill(ds, "images"); Cache.Insert("dsAll", ds,
new SqlCacheDependency("ImageDB", "images"));
}
}
long endTime = DateTime.Now.Ticks;
this.allTime = allTime + (endTime - beginTime);
TextBox1.Text = allTime.ToString();
Thread.Sleep(0);
}
解决方案 »
- 转换成伪静态 按钮传值失效 (点击按钮 跳到错误页面)
- jQuery UI 对话框弹出后在视窗下,如何实现对话框在视窗中央
- jquery获取函数的返回值问题!
- 为什么会出现这样的提示?错误在哪里?asp.net(C#)
- CRM开发页面设计讨论,来者都有分。
- 请问:我的台式的是赛扬1.7 ,256做.net开发, 那我如果想买个笔记本用,该用什么配置的呢?(在线等,望版主保留此贴二天)谢谢!!!!
- 水晶报表问题!
- 高分求助excel导入
- 问个有关textbox的技巧问题。
- 请问DataSet中的查询出的记录数如何求得?
- SELECT 姓名,性别,是否迷茫 FROM 程序员 WHERE 无知='YES' AND 岁数>30
- 哪里有html控件列表和web控件列表。
双线程就得了。Thread thread1 = new Thread(new ThreadStart(getpage));
thread1.Name = "myTopWin01";
thread1.Start();
thread1.Join();
if (!thread1.IsAlive)//如果线程不是未正常终止或中止
{
Thread.Sleep(1);//阻塞指定的1毫秒
}
{
Monter.Enter(ch);
if(null == ch["dsAll"])){
ds = new DataSet();
SqlCommand cmm = new SqlCommand();
cmm.Connection = sqlCnn;
cmm.CommandText = "select ImageBody from images";
SqlDataAdapter adp = new SqlDataAdapter();
adp.SelectCommand = cmm;
adp.Fill(ds, "images"); Cache.Insert("dsAll", ds,
new SqlCacheDependency("ImageDB", "images"));}
Monter.Exit(ch);
}大致就是上面的代码意思,在插入之前进行同步,避免重复插入。
sqlCnn.Open();
在这一步中间怀疑是不是会拖死ODBC??
DateSet添充应该放到外面..
然后操作每一条记录的时候把当前线程加一个锁.防止其它线程同时访问当前的记录