c#做了一个简单的访问mysql服务器的程序,每次一段时间不查询或更新数据后,连接会卡界面很久

daniwell2 2018-01-07 05:10:00
第一次查询连接很快,但只要每次闲置一段时间,再去请求修改数据库或是查询就会卡很久
...全文
643 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
daniwell2 2018-01-11
  • 打赏
  • 举报
回复
问题解决了 只是访问服务器和界面在同一ui线程导致卡住了 卡顿是服务器一个地方没设置好
绿领巾童鞋 2018-01-09
  • 打赏
  • 举报
回复
如果 有必要 ,那就做成 长连接 ,保持连接对象的状态
  • 打赏
  • 举报
回复
但是你不是这种科学的工程组织方式,我也只能告诉你这个道理。估计你做不到。
  • 打赏
  • 举报
回复
“做了一个简单的访问mysql服务器的程序.......”这个说法,给人的感觉就是你的开发不是测试驱动开发,而是闷着头“做”了好长一段时间,然后最后再来说 bug 问题。这种方式搞开发,放到我们这些项目管理者,也往往是注定要“死掉”的做法。有的不专业的项目管理者,往往就是3、4个月之后才来解决bug问题,而不是从一开始就测试驱动开发,那时候什么都靠猜,甚至能混过去“就算了”。 实际上对于测试驱动开发者,我告诉你,出现你这个问题,其做法就是把程序删除掉,重新开始开发,以测试驱动方式,把问题消灭在刚刚创立程序一开始。
sdfgrtyu 2018-01-08
  • 打赏
  • 举报
回复
卡的话就用多线程啊,,
  • 打赏
  • 举报
回复
首先要确定“闲置一段时间之后”,你的那些查询并不执行。这时候执行你的
conn.Open();
如果要22秒(确定没有其它堆积的并发查询任务的情况下),那么只有查看到数据库的物理连接了。比如说是命名管道连接还是tcp连接,路由器有没有什么问题,等等网络问题,或者数据库服务器问题。你可以使用一个成熟的、流行的客户端查询分析器来试一下,此时应该也用22秒之久才能连上,此时说明你的连网方式有问题。 程序通常经过了自动化测试,每隔几分钟就运行一次测试程序,到发布时这个 conn.Open 代码跑了数万次。所以测试驱动的开发,通常不用调试就能把精力放到正确的地方,不会花精力去怀疑本不该怀疑的地方。如果一定要怀疑,仍是设计测试用例来探测,测试为准!
秋的红果实 2018-01-08
  • 打赏
  • 举报
回复
我用按钮查询select 还是会这样  连接字符串对象为closed 然后在open时会卡很久 407 到429 s 差不多22 ==> 先用sql管理器,登陆sql服务器,看看登陆是不是顺利 贴出链接数据库的字符串,是不是添加了pool=false
xian_wwq 2018-01-08
  • 打赏
  • 举报
回复
建议先把try...catch去掉 一般来说出现异常会导致卡顿 从表象来看, 可能 数据库连接已经异常了
griefforyou 2018-01-08
  • 打赏
  • 举报
回复
连接字符串加上 Min Pool Size=1,最小连接池。
jiaoshiyao 2018-01-08
  • 打赏
  • 举报
回复
找到卡的那一行代码,然后分析,现在你贴出的代码不全
daniwell2 2018-01-08
  • 打赏
  • 举报
回复
引用 3 楼 yenange 的回复:
连接串没有配置连接池?
只设置了pooling=true 但并不懂连接池。。。
daniwell2 2018-01-08
  • 打赏
  • 举报
回复
引用 5 楼 sp1234 的回复:
“闲置一段时间之后”,仅仅进行简单的一个“select 1”查询,看看结果是否真的会“卡很久”。如果不是,那么就是你的程序自身的问题,需要再去调试自己的程序(比如说有没有堆砌起来阻塞的、循环的垃圾任务)。

这里要先进行简单的查询,不要运行你的那些查询。


  private void Button_check_Click(object sender, RoutedEventArgs e)
{

string sqlStr2 = "select * from order1";
DataSet test = MySqlHelper.GetDataSet(MySqlHelper.Conn, CommandType.Text, sqlStr2, null);

foreach (DataRow row in test.Tables[0].Rows)
{
MessageBox.Show(row[0].ToString());
}


}



额 我用按钮查询select 还是会这样 连接字符串对象为closed 然后在open时会卡很久 407 到429 s 差不多22秒
  • 打赏
  • 举报
回复
软件开发的信心来自于几十万次测试的信心,在发布之前就进行了大量回归测试。一般不会提出“莫名其妙的”问题。如果提出这类问题,其实问题的根源主要出在工程组织上,而并不是纠结某个代码的问题。
  • 打赏
  • 举报
回复
“闲置一段时间之后”,仅仅进行简单的一个“select 1”查询,看看结果是否真的会“卡很久”。如果不是,那么就是你的程序自身的问题,需要再去调试自己的程序(比如说有没有堆砌起来阻塞的、循环的垃圾任务)。 这里要先进行简单的查询,不要运行你的那些查询。
秋的红果实 2018-01-07
  • 打赏
  • 举报
回复
凡是用完command,sqldatareader,要dispose(),用完connection,要close()
吉普赛的歌 2018-01-07
  • 打赏
  • 举报
回复
连接串没有配置连接池?
daniwell2 2018-01-07
  • 打赏
  • 举报
回复
每次闲置大概几分钟 点更新就会界面http://bbs.csdn.net/simple_captcha?code=45dd66fc8f0a8aee3ada55507a736a3f806317d3&time=1515317624卡主 然后一直操作就能快速响应 不知道是什么原因引起的卡 然后界面这边也没异步处理,界面就卡死了。
daniwell2 2018-01-07
  • 打赏
  • 举报
回复

        public static DataSet GetDataSet(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {
            //创建一个MySqlCommand对象
            MySqlCommand cmd = new MySqlCommand();
            //创建一个MySqlConnection对象
            MySqlConnection conn = new MySqlConnection(connectionString);


            try
            {
                //调用 PrepareCommand 方法,对 MySqlCommand 对象设置参数
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                //调用 MySqlCommand  的 ExecuteReader 方法
                MySqlDataAdapter adapter = new MySqlDataAdapter();
                adapter.SelectCommand = cmd;
                DataSet ds = new DataSet();

                adapter.Fill(ds);
                //清除参数
                cmd.Parameters.Clear();
                conn.Close();
                return ds;
            }
            catch (Exception e)
            {
                //throw 
                return null;
            }
        }




 private static void PrepareCommand(MySqlCommand cmd, MySqlConnection conn, MySqlTransaction trans, CommandType cmdType, string cmdText, MySqlParameter[] cmdParms)
        {

            if (conn.State != ConnectionState.Open) conn.Open();

            cmd.Connection = conn;
            cmd.CommandText = cmdText;

            if (trans != null)
                cmd.Transaction = trans;

            cmd.CommandType = cmdType;

            if (cmdParms != null)
            {
                foreach (MySqlParameter parm in cmdParms)
                    cmd.Parameters.Add(parm);
            }
        }


 public static int ExecuteNonQuery(string connectionString, CommandType cmdType, string cmdText, params MySqlParameter[] commandParameters)
        {

            MySqlCommand cmd = new MySqlCommand();

            using (MySqlConnection conn = new MySqlConnection(connectionString))
            {
                PrepareCommand(cmd, conn, null, cmdType, cmdText, commandParameters);
                int val = cmd.ExecuteNonQuery();
                cmd.Parameters.Clear();
                conn.Close();
                return val;
            }

        }

//更新按钮
  private void UpInfoClick(object sender, RoutedEventArgs e)
        {
           string UpDateInfo = ValidInput(UpdateId); 
            int RowFle = MySqlHelper.ExecuteNonQuery(MySqlHelper.Conn, CommandType.Text, UpDateInfo, null);
            if (RowFle>0)
            {
                MessageBox.Show($"更新信息成功");
            }
            closeUpInfo();//订阅了表关闭
        }


  //更新表关闭时
        private void UpdateTable_closeUpInfo()
        {
            updateTable.Close();
            CloneInfo();
            if (!Window.GetWindow(dataGrid).IsVisible)
            {
                Window.GetWindow(dataGrid).Show();
            }
            dataGrid.UpdateLayout();
        }

 

110,538

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

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