博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ASP.NET MVC4+BootStrap 实战(四)
阅读量:6256 次
发布时间:2019-06-22

本文共 6004 字,大约阅读时间需要 20 分钟。

现在呆惯了外企,觉得跳槽出去都没地方去,在外企请假干什么的方便,而且相对轻松,就是money少了点,但是饭也要吃饱啊。

今天要讲的当然是最后一个按钮了,fix按钮。我们看一下js代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
$(
"#btnfix"
).click(
function 
() {
        
$.ajax({
            
url: 
"/Home/SolrDataFix?pam=" 
new 
Date().toTimeString(),
            
type: 
"POST"
,
            
datatype: 
"Html"
,
            
beforeSend: 
function 
() {
                
$(
"#divfix"
).show();
            
},
            
complete: 
function 
() {
                
$(
"#divfix"
).hide();
            
},
            
success: 
function 
(data) {
                
if 
(data.IsSuccess) {
                    
alert(
"Fixed successfully!"
);
                
}
                
else 
{
                    
alert(data.ErrorMsg);
                
}
            
},
            
error: 
function 
() {
                
alert(
"Fix失败!"
);
            
}
        
});
    
});

我们fix完成之后会得到一个json格式的数据,我们根据是否成功弹出提示。

接下来我们看看控制器

1
2
3
4
5
6
7
8
9
10
11
public 
JsonResult SolrDataFix()
        
{
            
int 
suc = GRLCBiz.GetInstance().FixSolrData();
 
            
if 
(suc == 1)
            
{
                
return 
Json(
new 
{ IsSuccess = 
true 
}, JsonRequestBehavior.AllowGet);
            
}
 
            
return 
Json(
new 
{ IsSuccess = 
false
, ErrorMsg = 
"Fix failed!" 
}, JsonRequestBehavior.AllowGet);
        
}

在这里,主要是看Biz层的逻辑。其实之前我讲过Compare的时候用多线程,那么fix的时候也必然要使用多线程。不过,这次我们要使用的是.net4以上版本中的Task,看代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
public 
int 
FixSolrData()
        
{
            
if 
(
this
.differenceUserEntityList == 
null
return 
-1;
 
            
this
.movePosition = 0;
            
int 
threadCount = 0;
            
int 
totalCount = differenceUserEntityList.Count;
            
threadCount = totalCount % ConstValues.CONN_ComparePerThread == 0 ? totalCount / ConstValues.CONN_ComparePerThread : totalCount / ConstValues.CONN_ComparePerThread + 1;
 
            
if 
(threadCount > ConstValues.CONN_FixThreadCount)
            
{
                
threadCount = ConstValues.CONN_FixThreadCount;
            
}
 
            
taskList = 
new 
List<Task<
int
>>();
 
            
for 
(
int 
i = 0; i < threadCount; i++)
            
{
                
Task<
int
> task = Task.Factory.StartNew<
int
>(() =>
                
{
                    
return 
SolrDataFixByThread(i);
                
});
                
taskList.Add(task);
            
}
 
            
Task.WaitAll(taskList.ToArray());
            
foreach 
(
var 
task 
in 
taskList)
            
{
                
if 
(task.Result == -1) 
return 
-1;
                
break
;
            
}
 
            
return 
1;
        
}

这里也是先计算线程数,然后我们循环开启Task,执行任务,任务是什么呢,就是SolrDataFixByThread方法。这段代码也是等待所有线程结束以后,我去循环结果,发现如果有某一个线程执行失败,我就返回-1。OK,我们看一下SolrDataFixByThread这个方法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
private 
int 
SolrDataFixByThread(
int 
threadIndex)
        
{
            
try
            
{
                
string
[] copyUserDBIDList = 
null
;
                
while 
(
this
.movePosition < 
this
.differenceUserEntityList.Count)
                
{
                    
lock 
(
this
.differenceUserEntityList)
                    
{
                        
List<
string
> userIDList = differenceUserEntityList.Select(d => d.UserNo.Trim()).ToList();
                        
if 
(
this
.movePosition >= 
this
.differenceUserEntityList.Count)
                        
{
                            
break
;
                        
}
 
                        
if 
(
this
.movePosition <= 
this
.userEntityList.Count - ConstValues.CONN_ComparePerThread)
                        
{
                            
copyUserDBIDList = 
new 
string
[ConstValues.CONN_ComparePerThread];
                            
userIDList.CopyTo(
this
.movePosition, copyUserDBIDList, 0, ConstValues.CONN_ComparePerThread);
                        
}
                        
else
                        
{
                            
copyUserDBIDList = 
new 
string
[userEntityList.Count - 
this
.movePosition];
                            
userIDList.CopyTo(
this
.movePosition, copyUserDBIDList, 0, copyUserDBIDList.Length);
                        
}
 
                        
this
.movePosition += ConstValues.CONN_ComparePerThread;
                    
}
                    
return 
this
.SolrDataFixStart(copyUserDBIDList, threadIndex);
                
}
 
                
return 
1;
            
}
            
catch 
(Exception ex)
            
{
                
LogHelper.WriteExceptionLog(MethodBase.GetCurrentMethod(), ex);
                
return 
-1;
            
}
        
}

和Compare方法大同小异,在此就不多说了。我们看SolrDataFixStart方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private 
int 
SolrDataFixStart(
string
[] userIDList, 
int 
threadIndex)
        
{
            
string 
userIDXml = 
this
.BuildUserIDXml(userIDList);
            
List<UserDBEntity> userDBEntityList = GRLCDAL.GetInstance().GetUserEntityListByIDs(userIDXml);
 
            
List<UserSolrEntity> userSolrEntityList = userDBEntityList.Select((userDBEntity, userSolrEntity) =>
            
{
                
userDBEntity.UserID = userDBEntity.UserID ?? 
string
.Empty;
                
userDBEntity.UserName = userDBEntity.UserName ?? 
string
.Empty;
 
                
return 
new 
UserSolrEntity()
                
{
                    
UserNo = userDBEntity.UserID,
                    
Age = userDBEntity.Age,
                    
IsMarried = userDBEntity.Married == 
"1"
,
                    
Name = userDBEntity.UserName.Trim()
                
};
            
}).ToList();
 
            
return 
SolrHelper.GetInstance().AddEntityList(userSolrEntityList.ToList());
        
}

第一句,BuildUserIDXml,如下

1
2
3
4
5
6
7
8
9
10
11
12
13
private 
string 
BuildUserIDXml(
string
[] userIDList)
        
{
            
XmlDocument xmlDocument = 
new 
XmlDocument();
            
XmlNode xmlRoot = xmlDocument.CreateElement(
"UserIDList"
);
            
foreach 
(
var 
userID 
in 
userIDList)
            
{
                
XmlElement xmlElement = xmlDocument.CreateElement(
"UserID"
);
                
xmlElement.InnerText = userID;
                
xmlRoot.AppendChild(xmlElement);
            
}
 
            
return 
xmlRoot.OuterXml;
        
}

构造了一个很简单的xml格式的数据。然后我们将它传入DAL层的方法GetUserEntityListByIDs

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public 
List<UserDBEntity> GetUserEntityListByIDs(
string 
userIDXml)
        
{
            
string 
sqlScript = 
string
.Empty;
            
try
            
{
                
sqlScript = DBScriptManager.GetScript(
this
.GetType(), 
"GetUserInfoByIDs"
);
                
SqlParameter[] sqlParameters =
                
{
                    
new 
SqlParameter(
"@UserIDXml"
,SqlDbType.Xml)
                
};
 
                
sqlParameters[0].Value = userIDXml;
                
DataSet ds = SqlHelper.ExecuteDataset(ConstValues.CON_DBConnection, CommandType.Text, sqlScript, sqlParameters);
 
                
if 
(ds != 
null 
&& ds.Tables.Count > 0)
                
{
                    
return 
ds.Tables[0].ToEntityList<UserDBEntity>();
                
}
 
                
return 
new 
List<UserDBEntity>();
            
}
            
catch 
(Exception ex)
            
{
                
LogHelper.WriteExceptionLog(MethodBase.GetCurrentMethod(), ex);
                
return 
null
;
            
}
        
}

没什么可说的,大家注意,这里这个参数是xml类型的,在SqlServer中,当我们要传递一批数据进行更新时,往往是传入一个实体List进行更新,就可以采用xml的方式传入SP,进行批量处理。OK,我们看一下这个脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
;
WITH 
UserIDList 
AS
     
(
        
SELECT 
U.C.value(N
'(text())[1]'
,
'CHAR(25)'
AS 
UserID
        
FROM 
@UserIDXml.nodes(N
'UserIDList/UserID'
AS 
U(C)
     
)
      
     
SELECT
        
A.UseNo,
        
ISNULL
(B.
Name
,
''
AS 
Name
,
        
ISNULL
(B.Age,0) 
AS 
Age,
        
ISNULL
(B.Temper,
''
AS 
Married
     
FROM 
Bonus.dbo.[
User
] A 
WITH
(NOLOCK)
     
INNER 
JOIN 
Bonus.dbo.UerInfo B 
WITH
(NOLOCK)
        
ON 
A.UseNo = B.UseNo
     
WHERE 
EXISTS(
        
SELECT 
TOP 
1 1
        
FROM 
UserIDList C
        
WHERE 
C.UserID = A.UseNo
     
)

第一句先解析出数据放入一个临时表UserIDList,大家注意这个临时表只能在紧跟着的后面的语句中使用,而且只能使用一次就销毁了。ok,通过这个脚本,我们就拿到了要同步到Solr的数据,开始同步

同步完成之后,我们看一下Solr数据,linux中的火狐浏览器没有样式

我们还是通过windows浏览

OK,Fix一部分数据之后,对比变成下面的样子

OK,今天就到这里,以后会换个系统讲解。如果想要源码,加群205217091去下载或者直接下载:

本文转自 BruceAndLee 51CTO博客,原文链接:http://blog.51cto.com/leelei/1589481,如需转载请自行联系原作者

你可能感兴趣的文章
类似LIS+贪心(ZOJ1025)
查看>>
[C++再学习系列] 虚函数的4条规则
查看>>
Thread.sleep
查看>>
浅析 ThreadLocal
查看>>
Pycharm批量操作代码快捷键
查看>>
oracle备份与恢复
查看>>
LLDB调试器
查看>>
cordova Ionic 和cordova的区别是什么
查看>>
【ZZ】C 语言中的指针和内存泄漏 & 编写高效的C程序与C代码优化
查看>>
linux暂停一个在运行中的进程【转】
查看>>
设计安全的账号系统
查看>>
SP2 PRIME1 - Prime Generator
查看>>
eclipse maven项目错误
查看>>
Xcode export/upload error: Your session has expired. Please log in 解决方法
查看>>
Daily Scrum - 12/02
查看>>
创建和编辑 crontab 文件
查看>>
钉钉发消息
查看>>
centos7 防火墙端口增加白名单
查看>>
Lucky Sum
查看>>
城市承灾体脆弱性和易损性的影响因素
查看>>