【问题标题】:Create a local db in winform and get data from server in the backgroundwinform创建本地db,后台从服务器获取数据
【发布时间】:2015-12-17 13:58:33
【问题描述】:

我正在寻找一种方法来提高我的应用程序的性能,该应用程序过度使用托管在服务器上的数据库,因此应用程序需要远程访问数据库,导致它很慢,所以我在考虑创建一个本地数据库并在应用程序运行的那一刻从服务器填充它,然后每隔一小时或当用户决定注销时定期对托管的 mySQl 数据库执行更新,我遇到的主要问题是我将拥有 10-20 个用户,他们不会更新相同类型的数据,但我如何知道哪些表已更新,并据此将更改应用于我的托管数据库?是否有任何文章或链接对此问题有进一步的解释?

我的应用程序是一个 C# windows 窗体应用程序,数据库是 mysql 数据库。

我有一个查询需要很长时间才能执行是这个:

 /**
  * getting the schedule based on the submitted id
  * */
    public static Schedule2 getTeachersSchedule(String therapistID, int weekday, int period, int school_year)
    {
        // connecting to mysql database
        try
        {
            using (MySqlConnection myConn = new MySqlConnection(connectionString))
            {
                using (MySqlCommand command = new MySqlCommand("Select * FROM student_schedule2, weekday, school_year, period, task where school_year_id = school_year_id_fk AND therapist_id_fk =" + therapistID + " AND weekday_id = weekday_id_fk AND period_id=period_id_fk AND task_id=task_id_fk AND weekday_id=" + weekday + " AND period_id=" + period + " AND school_year_id =" + school_year, myConn))
                {
                    MySqlDataReader reader;
                    myConn.Open();
                    reader = command.ExecuteReader();
                    Schedule2 schedule = null;
                    while (reader.Read())
                    {
                        schedule = new Schedule2();
                        schedule.ID = reader.GetInt32("student_schedule2_id");
                        try
                        {
                            if (reader["student_id_fk"] != DBNull.Value)
                                schedule.student = getStudent(reader.GetString("student_id_fk"));
                            else
                                schedule.student = null;
                            Weekday weekDay = new Weekday();
                            weekDay.ID = reader.GetInt32("weekday_id");
                            weekDay.weekdayName = reader.GetString("weekday_name");
                            schedule.weekday = weekDay;
                            schedule.semesterName = reader.GetString("semester_name");
                            Period periodObj = new Period();
                            SchoolYear schoolYEar = new SchoolYear();
                            periodObj.ID = reader.GetInt32("period_id");
                            periodObj.period_name = reader.GetString("period_name");
                            schedule.period = periodObj;
                            schoolYEar.ID = reader.GetInt32("school_year_id");
                            schoolYEar.year_name = reader.GetString("school_year_name");
                            schedule.schoolYear = schoolYEar;
                            Task course = new Task();
                            course.ID = reader.GetInt32("task_id");
                            course.taskName = reader.GetString("task_name");
                            schedule.task = course;
                            schedule.therapist = getTherapist(reader.GetString("therapist_id_fk"));
                        }
                        catch
                        {

                        }

                    }

                    myConn.Close();
                    return schedule;
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
            return null;
        }
    }

【问题讨论】:

  • 这很快就会变得非常复杂。首先,您知道不会更改的任何系统设置或其他数据都可以读取到静态类中的字段中,而不会出现太多问题。其余部分太复杂,无法笼统地涵盖 - 对于您所说的少数用户,我怀疑不值得尝试添加同步。
  • @Octopoid 所以你建议我不应该考虑这样做?问题是互联网有时很慢,因此导致我的应用程序很慢
  • 是的,我很欣赏这一点,但是同步数据库确实非常复杂。最简单的方法是下载所有内容,然后在退出时同步并处理任何数据冲突,但这会使您的应用程序加载速度非常慢,而且提供一个处理冲突的接口是很多工作。更好的方法是只缓存他们实际查看的数据,但这只会有助于重复查看记录,并且变得非常复杂。老实说,最好的办法就是尽可能提高数据库的性能。
  • 最好使用当前执行速度特别慢的示例 SQL 语句更新您的问题,这样我们就可以看到问题可能是什么。你在使用复杂的连接吗?你要拉多少数据?您是否正在执行许多 1 会执行的语句?但是,如果问题真的只是互联网速度非常慢,那么您可能无能为力来帮助他们,而无需尝试实施大公司已经尝试过并且多次失败(非常好)的事情!..跨度>
  • 例如,我有一个时间表表,其中包含每个用户每天 8 个时段和每周 5 天的数据,当我尝试获取数据时,我通常为每个用户一次查询一个数据库日期和期间,所以我有 8 个星期天的查询,8 个星期一的查询等等,这个页面需要很长时间才能加载,我将编辑问题并添加这个查询的代码

标签: c# mysql database winforms caching


【解决方案1】:

您的方法容易产生陈旧数据并且很可能速度较慢,因为所有数据都将通过网络发送。

我建议您查看您的 SQL 查询并确定它们缓慢的原因。向表中添加索引会有很大帮助。

【讨论】:

  • 我的表中已经有了索引,是否应该增加它们以使它们执行得更快?你能举个例子说明我应该添加哪些索引吗?
猜你喜欢
  • 1970-01-01
  • 2021-09-07
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 2018-09-26
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多