文档章节

用Socket快速判断数据库连接

白志华
 白志华
发布于 2015/10/18 10:55
字数 872
阅读 4
收藏 0
    大家在做项目的时候,一般都是和数据库有关的。而相信许多人在用代码打开数据库的时候,没有判断数据库连接是否成功。如果写对了还好,但是出错了,会等老长时间(默认15s,不过 实际响应 可能会更长)。而且还会出现卡死的情况,给用户的感觉就会变得非常差劲。所以快速判断数据库连接是否成功,就显得尤为重要了。
 
    一般情况下,如果连接字符串正确,那么连接到数据库用的时间一般在5s以内。所以我们可以在连接字符串的最后添加一个等待时间:timeout。如:
string strCon = "Data Source=192.168.24.66;Initial Catalog=master;User ID=sa;password=123456;Connection Timeout=5";
   如果连接不成功,应该在5-8s内做出回应。但是并不能确定一定是连接字符串出错。如果大量人访问的话,很可能会出现等待时间超过5s的情况。而且,如果连接不成功,我们依旧最起码得等待5秒。等待的滋味是不好受的,用户一定会给你一个叉叉,所以我们还需要用其他办法来快速判断。
 
    这里我们用Socket来实现这一功能。(至于Socket是什么,有兴趣的朋友可以自己查查资料)
    先用Socket来判断与服务器是否连接成功,然后在进行数据库操作。
#region 采用Socket方式,测试服务器连接

            /// <summary>
            /// 采用Socket方式,测试服务器连接
            /// </summary>
            /// <param name="host">服务器主机名或IP</param>
            /// <param name="port">端口号</param>
            /// <param name="millisecondsTimeout">等待时间:毫秒</param>
            /// <returns></returns>
            public static bool TestConnection(string host, int port, int millisecondsTimeout)
            {
                TcpClient client = new TcpClient();
                try
                {
                    var ar = client.BeginConnect(host, port, null, null);
                    ar.AsyncWaitHandle.WaitOne(millisecondsTimeout);
                    return client.Connected;
                }
                catch (Exception e)
                {
                    throw e;
                }
                finally
                {
                    client.Close();
                }
            }

            #endregion
下面是数据库的操作,可以根据自己的情况修改。
/// <summary>
       /// 数据库连接操作,可替换为你自己的程序
       /// </summary>
       /// <param name="ConnectionString">连接字符串</param>
       /// <returns></returns>
        private  static bool TestConnection(string ConnectionString)
        {
            bool result = true;

            try
            {
                SqlConnection m_myConnection = new SqlConnection(ConnectionString);
                m_myConnection.Open();

                //数据库操作......

                m_myConnection.Close();
            }
            catch (Exception ex)
            {
                System.Diagnostics.Debug.WriteLine(ex.ToString());
                result = false;
            }
            return result;
        }
我这里用winForm来测试的。
private void btnSocket_Click(object sender, EventArgs e)
        {
            string strCon = "Data Source=192.168.24.566;Initial Catalog=qmaster;User ID=sa;password=123456";
             
            string[] s=strCon.Split(';');
            s = s[0].Split('=');
            //获取IP
            string strIP =s[1];

            //发送数据,判断是否连接到指定ip
            if (TestConnection(strIP , 1433, 500))
            {
                 //连接成功
                MessageBox.Show("Socket Link Succeed","连接服务器");

                // 数据库操作,我这里用了连接测试。可根据你的系统自行修改
                if (TestConnection(strCon))
                    MessageBox.Show("Sql Link Succeed","连接数据库");
                else
                    MessageBox.Show("Sql Link Failed", "连接数据库");
            }
            else
                MessageBox.Show("Socket Link Failed","连接服务器");
        }

 
    用Socket来测试是否连接到服务器非常方便,也非常快捷,不用让用户等待那么长时间,而且这样做还可以知道是服务器地址出错,还是数据库出错。经测试,如果数据库地址出错,在1-3s内即可反馈出结果。提示用户“Socket Link Failed”。而数据库名错误,则只提示“Sql Link Failed”。
    这么方便、快捷、高效、易排错的方法,你会不会错过,我不知道,反正我是不会错过了!

版权声明:本文为博主原创文章,未经博主允许不得转载。

本文转载自:http://blog.csdn.net/xiaoxian8023/article/details/7248792

共有 人打赏支持
白志华
粉丝 29
博文 265
码字总数 57524
作品 0
长沙
程序员
一个JAVA码农的Node之旅——新手篇

本篇是一个Node新手做完实际项目后的心得总结。Node高手完全可以略过本文。 摘要 如果BOSS要求你在短期内快速实现一套聊天云服务平台, 你的第一反应是什么? 让我细细一想实现成本: 要维护社交...

力谱宿云
2016/04/06
4.1K
11
网络扫描器的设计与实现(转)

  摘要:信息安全是为了保障计算机系统软件、应用软件及网络软件可靠运行;防止信息的非授权访问、获取与篡改;保证信息完整性与可用性。本文分析了网络扫描器在信息安全领域的作用与设计实...

zt371
2009/05/05
696
0
zero——Go实现轻量级的Tcp服务器

zero是我用Go实现的一个非常轻量的Socket服务器,可用于快速制作游戏Demo,整个项目不超过500行代码。提供心跳检测,会话管理功能。 接收发送数据使用二进制数据流的方式,可以非常方便的配合...

shy0218
2017/12/25
0
0
Thrift RPC实战(四) common-pool2连接池

我们在服务器开发的过程中,往往会有一些对象,它的创建和初始化需要的时间比较长,比如数据库连接,网络IO,大数据对象等。在大量使用这些对象时,如果不采用一些技术优化,就会造成一些不可...

lemonLove
06/21
0
0
渡世白玉/QSocket5Tunnel

QSocket5Tunnel 是一个基于Qt的QTcpSocket和QTcpServer写的一个socket5代理的数据中转软件。分为客户端和服务端两部分,客户端负责本地建立socket5代理,服务端负责负责请求代理客户端需要请...

渡世白玉
2014/11/11
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Memcached启动参数详解

memcached -d -m 1024 -l 192.168.100.101 -p 11211 -P /tmp/memcached.pid -c 1024 -f 1.25 -n 80 -t 16 运行参数描述 -d:以守护(daemon)进程方式启动; -u:是运行Memcache的用户,例如 ......

月下狼
24分钟前
0
0
xgboost-kaggle

https://www.kaggle.com/dansbecker/xgboost This tutorial is part of the Learn Machine Learning series. In this step, you will learn how to build and optimize models with the powe......

tantexian
25分钟前
0
0
nginx学习八 代理服务

最常用的语法 proxy_pass Syntax: proxy_pass URL;Default: --Context:location.if in location,limit_exception 反向代理 例:/etc/nginx/conf.d/default.conf 反向代理(代理服务端)......

Romanceling
32分钟前
0
0
npm ERR! Unexpected end of JSON ...

npm install 报错: npm ERR! Unexpected end of JSON input while parsing near '..."^2.8.14"},"_hasShrin' npm ERR! A complete log of this run can be found in: ... 打开终端 命令: 第......

大_侠
36分钟前
0
0
Android中的设计模式之责任链模式

参考 《设计模式:可复用面向对象软件的基础 》5.1 Chain of responsibility 职责链 对象行为型模式 《Android源码设计模式解析与实战》第9章 使编程更有灵活性--责任链模式 意图 使多个对象...

newtrek
39分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部