现在呆惯了外企,觉得跳槽出去都没地方去,在外企请假干什么的方便,而且相对轻松,就是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,如需转载请自行联系原作者