求大神支招!-----跨节点并行处理的合并问题

柠檬片-味道 2015-05-07 04:06:36
数据表分配在不同的站点,当用户输入一条复杂的查询sql语句,通过解析模块分成几个子语句,采用并行处理方式,让子语句到对应的各站点上去执行,提高处理的速度。代码如下:

//源sql(应用中复杂的sql包含十多张表)
string sql = "Select neflow.id,ne.depart from materialneedflow neflow left outer join materialneed ne on ne.id=neflow.applyid where ne.id=1 and neflow.id=1";
//解析成两条sql,分别去对应的站点执行
string sql11 = "select id,applyid from materialneedflow where id=1";
string sql12 = "select id,depart from materialneed where id=1";

DataSet dataset = new DataSet();
Dictionary<string, string[]> dict = new Dictionary<string, string[]>();
dict.Add("materialneedflow", new string[] { "Data Source=202.193.75.136/ORCL;User ID=site4;Password=123456", sql11 });
dict.Add("materialneed", new string[] { "Data Source=202.193.74.48/ORCL;User ID=site4;Password=123456", sql12 });
//并行地到两个站点去执行,问题1:并行方面能不能修改默认配置呢?
var tables = (from x in dict.AsParallel()
select Query(x)).ToList();
Dictionary<string, DataTable> dict1 = new Dictionary<string, DataTable>();
for (int i = 0; i < tables.Count; i++)
{
dict1.Add(tables[i].TableName, tables[i]);
}
//对查出来的两个结果集合并;问题2:这里字段我都转换了类型,但是要写成一个通用模块的话,希望能从Oracle数据库(用的Oracle)中获取类型自动转换c#中类型,该怎么实现啊???
var result = from neflow in dict1["materialneedflow"].AsEnumerable()
join ne in dict1["materialneed"].AsEnumerable()
on Convert.ToDecimal(IsDBNull(neflow["applyid"])) equals Convert.ToDecimal(ne["id"])
select new
{
status = Convert.ToDecimal(neflow["id"]),
orderdate = Convert.ToDecimal(IsDBNull(ne["depart"]))
};

static DataTable Query(KeyValuePair<string, string[]> dict)
{
string host = dict.Value[0];
string sql = dict.Value[1];
using (OracleConnection conn = new OracleConnection(host))
{
OracleDataAdapter da = new OracleDataAdapter(sql, conn);
conn.Open();
DataSet ds = new DataSet();
da.Fill(ds);
DataTable table = ds.Tables[0];
table.TableName = dict.Key;
return table;
}
}
public static object IsDBNull(object value)
{
if (value == DBNull.Value)
{
return null;
}
else
{
return value;
}
}
问题1:并行方面能不能修改默认配置呢?
问题2:linq合并那,字段我都转换了类型,但是要写成一个通用模块的话,希望能从Oracle数据库(用的Oracle)中获取类型自动转换c#中类型,该怎么实现啊???
...全文
364 13 打赏 收藏 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
引用 11 楼 u010816844 的回复:
我是按照这种方法写的,Datatable的内置合并方法有实现join的功能吗?
如果结构不一样,那就要使用 DataTAble 的 DataRelation 机制而不是 Merge 方法。
  • 打赏
  • 举报
回复
你所谓“第一个问题”,其实你已经写的差不多了。从配置文件中读取数据并且形成你的 dict,可以这样写
var dic = (from ConnectionStringSettings c in ConfigurationManager.ConnectionStrings
            select c).ToDictionary(c => c.Name, c => c.ConnectionString);
至于第二个问题,编程中直接根据业务实体进行查询就行了,不要耗费过多精力去搞什么“通用转换”。例如这里 http://bbs.csdn.net/topics/391025696 所述的方法就是一个通用的SQLHelper。一个SQLHelper只是工具,它方便于你直接了当地写一行 result =...... 那样的查询语句,就可以了。在 SQlHelper 之中没有必要自身过多写代码去执行什么“转换为c#对象”问题。
柠檬片-味道 2015-05-07
  • 打赏
  • 举报
回复
引用 9 楼 sp1234 的回复:
假设你的查询写在这样的方法里
public static DataTable MyQuery(string DbConnection)
{
    ..........
}
并且你的数据库的连接串保存在这样的集合里
List<string> Connections
那么你可以这样写并发查询语句
var result = (from conn in Connections.AsParallel() select MyQuery(conn)).ToArray();
得到了DataTable的数组之后,你可以使用DataTable内置的合并方法将数据合并。
我是按照这种方法写的,Datatable的内置合并方法有实现join的功能吗?
  • 打赏
  • 举报
回复
引用 5 楼 u010816844 的回复:
刚才翻书琢磨后,还是不知道怎么实现,刚接触LInq没多久,望指教哈 具体该怎么实现??前提是,查询的时候并不知道数据库有哪些表,没有也无法创建对应的实体
跟实体怎么发生关系呢? 编程中使用“实体定义”是一种对象化的程序编程模式。数据库查询只不过是比较底层的编程概念,比实体定义低级。对于底层的东西,你要不要抽象它、结构化它、对象化它,那是另一个问题。跟你这个问题无关。
  • 打赏
  • 举报
回复
假设你的查询写在这样的方法里
public static DataTable MyQuery(string DbConnection)
{
    ..........
}
并且你的数据库的连接串保存在这样的集合里
List<string> Connections
那么你可以这样写并发查询语句
var result = (from conn in Connections.AsParallel() select MyQuery(conn)).ToArray();
得到了DataTable的数组之后,你可以使用DataTable内置的合并方法将数据合并。
柠檬片-味道 2015-05-07
  • 打赏
  • 举报
回复
引用 7 楼 caozhy 的回复:
不是,这都是内存的并行,也就是在内存中查询。
如果要实现站点并行处理,该怎么操作呢?
threenewbee 2015-05-07
  • 打赏
  • 举报
回复
不是,这都是内存的并行,也就是在内存中查询。
柠檬片-味道 2015-05-07
  • 打赏
  • 举报
回复
引用 4 楼 caozhy 的回复:
Parallel.For是内存中的并行,不是数据库查询的并行。 据我所知,sql server和my sql都有现成的群集功能,不需要自己写代码,也不好维护。oracle应该也有。
dict.AsParallel()是站点的并行吗??
柠檬片-味道 2015-05-07
  • 打赏
  • 举报
回复
刚才翻书琢磨后,还是不知道怎么实现,刚接触LInq没多久,望指教哈 具体该怎么实现??前提是,查询的时候并不知道数据库有哪些表,没有也无法创建对应的实体
threenewbee 2015-05-07
  • 打赏
  • 举报
回复
Parallel.For是内存中的并行,不是数据库查询的并行。 据我所知,sql server和my sql都有现成的群集功能,不需要自己写代码,也不好维护。oracle应该也有。
  • 打赏
  • 举报
回复
不要返回DataTable,而是应该返回一致的实体数据,否则你根本没办法处理
柠檬片-味道 2015-05-07
  • 打赏
  • 举报
回复
引用 1 楼 starfd 的回复:
Parallel.For 分别取数据,最后合并
我是这样操作的,合并那需要把Object类型转换成相应的数据类型进行联接或查询,该怎么自动获取呢?
  • 打赏
  • 举报
回复
Parallel.For 分别取数据,最后合并
内容概要:本文围绕基于物理场的动态模式分解(piDMD)展开研究,重点探讨其在流体力学、热传导及多物理耦合系统中的建模与应用。通过Matlab代码实现,将传统的动态模式分解(DMD)方法与物理场控制方程相结合,引入物理约束以增强数据驱动模型的物理一致性,从而提升对复杂非线性系统的模态提取精度与长期预测能力。文章系统阐述了piDMD的理论基础、数学推导过程与算法实现步骤,并结合典型物理场仿真案例(如Navier-Stokes方程驱动的流场演化)进行验证,展示了其在降阶建模、主导模态识别和时空动态可视化方面的优越性能,适用于高维、强耦合、非平稳系统的分析与优化。; 适合人群:具备一定数值计算、流体力学、控制理论或数据驱动建模背景,熟悉Matlab编程与线性代数运算,从事科学研究、工程仿真或系统辨识工作的研究生、科研人员及工程师。; 使用场景及目标:①实现对流场、温度场等物理场的高效降阶建模与动态行为预测;②提取符合物理规律的关键模态,用于系统稳定性分析与控制设计;③支撑复杂系统的状态估计、异常检测与优化调控等下游任务。; 阅读建议:建议读者结合提供的Matlab代码逐行调试与运行,深入理解piDMD算法中物理约束的嵌入方式及其对模态质量的影响,同时可尝试将其迁移至其他偏微分方程描述的物理系统中进行拓展验证与应用。
内容概要:本文研究了在峰谷分时电价引导下,基于多目标优化遗传算法NSGA-II的电动汽车充电负荷优化问题。通过构建以电网负荷波动最小化和用户充电成本最低为核心的多目标优化模型,利用NSGA-II算法求解获得帕累托最优解集,实现对大规模电动汽车充电行为的有序引导。文中系统阐述了峰谷电价激励机制的设计原理、电动汽车充电负荷的数学建模方法、多目标优化问题的形式化表达以及NSGA-II算法的具体实现流程,并借助Matlab平台进行仿真验证,结果表明该策略能有效平抑电网负荷峰谷差、降低用户充电支出并提升电力系统的运行效率与稳定性。; 适合人群:具备一定电力系统基础知识和Matlab编程能力,从事智能电网、电动汽车调度、需求侧管理等相关领域的研究生或科研人员。; 使用场景及目标:①研究峰谷电价政策对电动汽车充电行为的影响机制;②掌握NSGA-II算法在电力系统多目标优化中的具体应用;③实现电动汽车集群的有序充电调度以改善电网负荷曲线; 阅读建议:此资源结合了电力经济学与智能优化算法,建议读者在学习过程中重点关注模型构建与算法实现的衔接部分,动手复现仿真代码以深入理解参数设置与结果分析过程。
详情可查看下方数据集可视化效果。 【数据集概况】 · 检测类别(中文):[电梯(elevator)] · 训练集:1468 张 · 验证集:157 张 · 测试集:158 张 · 总计:1783 张 该数据集聚焦于各类建筑内部及外部环境中的电梯目标检测任务,涵盖住宅楼、办公楼、商场、酒店等多种典型场景下的电梯结构。图像采集覆盖不同光照条件、材质类型与安装位置,充分体现了实际应用中电梯的多样性与复杂性,为智能楼宇管理、安防监控及无障碍设施识别等方向提供了高质量的视觉基础支持。... 【训练曲线与评估图】 【模型训练配置】 参数 | 值 模型 | yolo26n 训练轮数 | 100 epochs 输入尺寸 | 640x640 批次大小 | 24 优化器 | auto 初始学习率 | 0.01 训练设备 【关键指标汇总】 训练了 72 个 epoch,最终轮指标: 指标 | 数值 mAP50 | **0.9446** mAP50-95 | 0.6531 Precision | 0.9305 Recall | 0.8777 train/box_loss | 0.5807 train/cls_loss | 0.3505 val/box_loss | 1.0020 val/cls_loss | 0.6208 【训练过程分析】 72 轮训练后 mAP50 达到 0.9446,模型收敛良好。Loss 曲线前段快速下降,后段趋于平稳,val_loss 无反弹,没有明显过拟合。但 mAP50-95 为 0.6531,和 mAP50 差距 0.29,定位精度仍有优化空间。 【模型性能评估】 Precision 0.9305、Recall 0.8777,精度高于召回,存在一定漏检。 【预测效果展示】 验证集预测效果较好,检测框基本准确覆盖电梯,置信度整体偏高。 【改进建议】 1. 丰富场景...

8,492

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 LINQ
社区管理员
  • LINQ
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧