机房重构总结(一)

1、【对七层的理解:】


上图就是我个人重构的整体架构。在代码实现的过程中才算是慢慢理解七层的各自功能。下面说一下自己的理解:

UI层:设计满足用户需求的界面,并进行必要的文字说明。声明所需变量,实例化实体、外观层并调用外观层的方法。

Façade层:更好的解耦UI层和BLL层。假如BLL层的方法改变某一部分的时候UI层不至于跟着一起变动,减少了工作量。

BLL层:是业务逻辑层。从数据访问层获取数据,显示在显示层,从显示层获取用户指令和数据,执行业务逻辑;从显示层获取用户指令和数据,通过数据访问层写入数据源。UI提出请求,收集数据传给业务逻辑层转向BLL再返回给UI

IDAL层:提供D层接口。直接与BLL联系。

DAL层:直接访问数据库,针对数据库的增,删,改,查。

Entity层:可以简单的理解为是一个描述业务实体的类,是数据传输的载体。为我们在关系数据库和对象之间架起了一座桥梁。

Factory+反射+配置文件:作数据连接。把东西写活了,在换数据库的时候就省事多了。

其实加设计模式就是为了更好地解耦,提高工作效率。

2、【功能实现流程】

①登录功能

②一般用户的查询功能

③修改密码

④操作员注册、充值、退卡;信息查询(组合查询)、学生信息管理

⑤管理员用户管理、基本数据设定

⑥结账、账单查看

⑦上下机

⑧整体代码优化改进

3、【注释:类头注释、类中注释】

注释的重要性:使得代码增加了可读性,使别人更容易读懂代码。

方法:首先找到Class.vb这个文件。我的再C:\Program Files(x86)\Microsoft\VisualStudio\10.0\Common7\IDE\ItemTemplatesCache\VisualBasic\Code\2052\Class.zip这个目录下进行设置。

编写完之后的效果如下:


4、【期间学到的新知识】

(1)SQLHelper类的应用

是什么?

SqlHelper是一个基于.NET Framework的数据库操作组件。组件中包含数据库操作方法,SqlHelper用于简化你重复的去写那些数据库连接(SqlConnection),SqlCommand,SqlDataReader等等。SqlHelper 封装过后通常是只需要给方法传入一些参数如数据库连接字符串,SQL参数等,就可以访问数据库了,很方便。

为什么?

在这个类里面可以定义数据库的连接、有无参数的增删改查。写到一个类里面到时候哪里用到了数据库操纵语句就可以从哪里调用一下。跟之前用的模块一样。把公有的东西写到一起,用的时候直接调用一下就可以啦。

代码实现:

Public Class SqlHelper
    '定义并连接数据库
    Dim strCon As String = ConfigurationManager.AppSettings("ConnString")
    '定义一个数据库连接对象
    Dim conn As SqlConnection = New SqlConnection(strCon)
    '定义一个命令对象
    Dim cmd As New SqlCommand
    '关闭连接
    Private Sub CloseConn(ByVal conn As SqlConnection)
        '如果没有关闭,则关闭连接
        If (conn.State <> ConnectionState.Closed) Then
            conn.Close()
            conn = Nothing
        End If
    End Sub
    '关闭命令
    Private Sub CloseCmd(ByVal cmd As SqlCommand)
        '如果没有关闭命令,则关闭命令
        If Not IsNothing(cmd) Then
            cmd.Dispose()  '处理
            cmd = Nothing
        End If
    End Sub
    '有参数的增删改
    Public Function ExecuteNoQuery(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As Integer
        '将传入的值,分别为cmd的属性赋值
        cmd.Parameters.AddRange(sqlParams)  '传入参数
        cmd.CommandType = cmdType
        cmd.Connection = conn    '设置连接
        cmd.CommandText = cmdText
        'cmd = New SqlCommand(cmdText, conn)
        Dim result As Integer
        '执行操作
        Try
            conn.Open()
            result = cmd.ExecuteNonQuery()  '执行增删改操作并返回受影响的行数
            cmd.Parameters.Clear()  '清除参数

        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")
        Finally
            Call CloseConn(conn)  '关闭连接
            Call CloseCmd(cmd)  '关闭命令
        End Try
        Return result
    End Function
    '无参数的增删改
    Public Function ExecuteNoQuery(ByVal cmdText As String, ByVal cmdType As CommandType) As Integer
        '将传入的参数分别为cmd属性赋值
        cmd.CommandType = cmdType
        cmd.Connection = conn
        cmd.CommandText = cmdText '设置查询单 的语句
        'cmd = New SqlCommand(cmdText, conn)
        Dim res As Integer
        '执行操作
        Try
            conn.Open()
            res = cmd.ExecuteNonQuery() '执行增删改操作并返回收到影响的行数
            cmd.Parameters.Clear() '清除参数

        Catch ex As Exception
            MsgBox(ex.Message, , "数据库操作")
        Finally
            Call CloseConn(conn)
            Call CloseCmd(cmd)
        End Try
        Return res
    End Function
    '有参数查询
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType, ByVal sqlParams As SqlParameter()) As DataTable

        Dim sqlAdapter As New SqlDataAdapter  '声明适配器
        Dim dt As New DataTable   '声明数据表
        Dim ds As New DataSet   '声明数据缓存

        cmd.CommandType = cmdType
        cmd.Connection = conn
        cmd.CommandText = cmdText   '设置查询语句
        '将传入的值分别赋给cmd的属性

        cmd.Parameters.AddRange(sqlParams)  '将参数传入


        'cmd = New SqlCommand(cmdText, conn)
        sqlAdapter = New SqlDataAdapter(cmd)  '实例化适配器

        '执行操作
        Try
            sqlAdapter.Fill(ds)  '用适配器对ds进行填充
            dt = ds.Tables(0)  '返回数据集的第一个表
            cmd.Parameters.Clear()  '清除参数

        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn(conn)
            Call CloseCmd(cmd)
        End Try
        Return dt
    End Function
    '无参数查询
    Public Function ExecSelect(ByVal cmdText As String, ByVal cmdType As CommandType) As DataTable
        Dim sqlAdapter As SqlDataAdapter   '声明适配器
        Dim dt As New DataTable   '声明数据表
        Dim ds As New DataSet   '声明数据缓存

        '将传入的值分别给cmd属性赋值
        cmd.CommandType = cmdType   '设置一个值,解释cmdText
        cmd.Connection = conn
        cmd.CommandText = cmdText

        sqlAdapter = New SqlDataAdapter(cmd)  '实例化适配器
        '执行操作
        Try
            sqlAdapter.Fill(ds)  '用适配器对ds进行填充
            dt = ds.Tables(0)  '返回数据集的第一个表

        Catch ex As Exception
            MsgBox("查询失败", CType(vbOKOnly + MsgBoxStyle.Exclamation, MsgBoxStyle), "警告")
        Finally
            Call CloseConn(conn)
            Call CloseCmd(cmd)
        End Try
        Return dt
    End Function

End Class

(2)泛型集合

什么是泛型集合?

泛型是指具有占位符(类型参数)的类、结构、接口和方法,这些占位符是类、结构、接口和方法所存储或使用的一个或多个类型的占位符。泛型集合可以将类型参数用作它所存储的对象的类型的占位符;类型参数作为其方法的参数类型出现。

为什么要用泛型集合?

通常情况下,都建议使用泛型集合,因为这样可以获得类型安全的直接优点而不需要从基集合类型派生并实现类型特定的成员。此外,如果集合元素为值类型,泛型集合类型的性能通常优于对应的非泛型集合类型。总的来说,使用泛型集合,可以更快捷的得到所需要的数据,相当于走了一条捷径。

代码实现:

 Public Shared Function converToList(Of T As {New})(ByVal dt As DataTable) As IList(Of T)
            '(Of T as {New})中的New是用来约束T的,必须有
            '定义并实例化泛型集合
            Dim myList As New List(Of T)
            '得到实体类的类型名
            Dim myType As Type = GetType(T)   '此声明不知道如何使用,后边也没有用到
            Dim dr As DataRow   '定义行集
            Dim tempName As String = String.Empty  '定义一个临时变量
            ' 便利DataTable的所有数据行
            For Each dr In dt.Rows
                Dim myT As New T
                Dim propertys() As PropertyInfo = myT.GetType().GetProperties() '定义属性集合
                Dim pr As PropertyInfo
                '遍历对象的所有属性
                For Each pr In propertys
                    tempName = pr.Name '将属性名称赋值给临时变量
                    '检查DataTable是否包含此列
                    If (dt.Columns.Contains(tempName)) Then   '将此属性与datatable里的列明比较,查看datatable是否包含此属性  
                        '判断此属性是否有Setter
                        If (pr.CanWrite = False) Then  '判断属性是否可写,如果不能则跳出循环
                            Continue For
                        End If
                        Dim value As Object = dr(tempName) '定义一个对象型的变量类保存变量
                        If (value.ToString <> DBNull.Value.ToString) Then '如果非空,则赋给对象属性
                            pr.SetValue(myT, value, Nothing)  '在运行期间,通过反射,动态的访问一个对象的属性
                        End If
                    End If

                Next
                myList.Add(myT) '添加到集合

            Next
            Return myList '返回实体集合
        End Function

(3)存储过程

是什么?

存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它。

为什么?

存储过程只在创造时进行编译,以后每次执行存储过程都不需再重新编译,而一般SQL语句每执行一次就编译一次,所以使用存储过程可提高数据库执行速度;当对数据库进行复杂操作时(如对多个表进行Update,Insert,Query,Delete时),可将此复杂操作用存储过程封装起来与数据库提供的事务处理结合一起使用;存储过程可以重复使用,可减少数据库开发人员的工作量。所以说,为了减轻DAL层的负担,可以使用存储过程,把数据控制语句写到数据库中。查询的时候直接调用存储过程,方便快捷。

举例说明:


(4)其他设计模式的应用

在弄组合查询的时候,因为有三个窗体界面设计基本一致。如果单一进行设计的话要做三次,在这里可以应用模板模式,这样的话可以减少代码量也可以减少代码设计的时间消耗,使用继承的窗体就可以把问题完全解决喽。除此之外还有好多地方可以用到设计模式,比如说,上下机可以用到策略模式定义一系列算法;登录时用单例模式设置权限等等。


当然,在重构的过程中学到的知识远不止这些,也还有好多东西需要进一步探索:触发器、视图等。一个多月的重构历程让我回味无穷。

 

<think>好的,用户想了解智算机房运维的经验和最佳实践。首先,我需要回忆下相关的引用内容,看看是否有直接相关的信息。引用1提到每周和每月分析系统运行情况,生成周报和月报,这可能和监控与数据分析有关。引用2讲的是权限管理,最小权限原则,这可能涉及到安全方面的最佳实践。引用3讨论了高可用性的架构设计和运维策略,包括可用性度量和冗余设计,这些对智算机房运维应该很重要。 接下来,我需要将这些引用内容整合到智算机房的运维实践中。智算机房通常处理高性能计算和人工智能任务,运维需要特别注意资源管理、能效优化、安全性以及高可用性。可能需要从以下几个方面展开: 1. **监控与数据分析**:参考引用1,定期生成运行报告,实时监控资源使用情况,比如GPU利用率、温度等,这对智算机房尤为重要,因为硬件负载通常很高。 2. **权限管理**:引用2提到的权限策略,智算机房可能涉及敏感数据和计算资源,必须严格控制访问权限,避免未授权操作。 3. **高可用架构**:引用3中的高可用性设计,比如冗余网络、分布式存储和容错机制,确保计算任务不会因单点故障中断。 此外,可能还需要考虑能效优化,比如散热管理和电源效率,这些在智算机房中非常重要,因为高密度计算设备会产生大量热量,影响运行稳定性和能耗成本。 还需要考虑自动化运维,比如使用AI预测故障或自动调度任务,这能提升效率。同时,灾备方案和定期演练也是关键,确保在发生故障时能快速恢复。 用户可能没有明确提到具体方面,但作为最佳实践,应该涵盖监控、安全、高可用、能效、自动化和灾备等核心领域。需要将这些点组织成结构化的建议,确保覆盖全面且实用。</think>### 智算机房运维经验与最佳实践 智算机房作为支持高性能计算(HPC)和人工智能(AI)任务的核心基础设施,其运维需结合技术深度与流程规范性。以下是关键经验与实践总结: --- #### 、**资源监控与性能分析** 1. **实时监控与数据采集** - 通过工具(如 Prometheus、Grafana)实时监控 GPU 利用率、CPU 负载、内存占用、网络带宽及存储 I/O,形成可视化看板。 - 针对 AI 训练任务,需额外关注显存占用率、多节点通信延迟等指标,例如使用 $NVIDIA \ DCGM$ 工具采集 GPU 性能数据[^3]。 - **示例代码(数据采集脚本)**: ```bash #!/bin/bash dcgmi dmon -d 10 -e 203,204,1001 > gpu_metrics.log ``` 2. **定期运行分析** - 每周生成资源利用率报告,识别低效任务或资源瓶颈(如存储带宽不足导致训练任务排队)[^1]。 - 每月分析能效比(PUE),优化散热系统与供电策略,例如通过 $PUE = \frac{\text{总能耗}}{\text{IT设备能耗}}$ 公式评估机房能效。 --- #### 二、**高可用架构设计** 1. **冗余与容错** - 网络层:部署多路径互联(如 InfiniBand 双链路)避免单点故障,并通过 $$ \text{网络可用性} = 1 - \frac{\text{故障时间}}{\text{总运行时间}} $$ 量化可靠性。 - 存储层:采用分布式文件系统(如 Lustre)或对象存储(如 Ceph),确保数据副本跨机架分布。 2. **任务调度与弹性伸缩** - 使用 Kubernetes 或 Slurm 调度器动态分配计算资源,支持抢占式任务和优先级队列。 - 突发负载时自动扩展云资源(如混合云架构),避免任务积压。 --- #### 三、**安全与权限管理** 1. **最小权限原则** - 为开发人员、算法工程师、运维团队分别创建独立账号,仅开放必要权限(如开发账号禁止直接访问生产环境数据库)[^2]。 - 敏感操作(如集群重启)需通过审批流程,并记录操作日志。 2. **数据安全** - 训练数据加密存储,传输过程使用 TLS 协议。 - 定期扫描代码仓库与容器镜像,防止恶意代码注入。 --- #### 四、**能效优化实践** 1. **散热管理** - 采用冷热通道隔离技术,结合液冷方案降低 GPU 服务器温度。 - 使用 CFD(计算流体力学)模拟优化气流分布,减少局部热点。 2. **任务能效调优** - 对 AI 训练任务进行混合精度训练(如 FP16/FP32),降低显存占用与能耗。 - 通过 $$ E = P \cdot t $$(能耗=功率×时间)公式评估任务能耗成本,优化超参数配置。 --- #### 五、**自动化运维** 1. **故障自愈** - 部署异常检测模型(如 LSTM 预测硬件故障),自动触发备机切换或告警。 - 硬盘故障时,通过 RAID 重构脚本自动恢复数据。 2. **配置即代码(IaC)** - 使用 Ansible 或 Terraform 定义集群配置,确保环境致性。 - **示例代码(节点部署)**: ```yaml - name: Deploy GPU Node ansible.builtin.shell: | nvidia-smi -L nvcc --version ``` --- #### 六、**灾备与演练** 1. **容灾方案** - 核心数据定期备份至异地机房,满足 $RTO < 2\text{小时}$ 和 $RPO < 15\text{分钟}$ 的目标。 - 模拟机房断电、网络中断等场景,验证故障恢复流程。 ---
评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值