9月 28

自从用过Dapper之后,我已深深不能自拔,太方便了,即可以自己控制sql,又有orm的特性,关键是因为使用emit的缘故效率还很高.

所以我在很多的小项目中都使用dapper了.

但是总会有一些更简单的项目,甚至可以不用写sql的情况,所以我就寻寻觅觅,找到了Dapper.SimpleCRUD这么一个扩展.

 

该扩展目前支持下面8个方法

This extension adds the following 8 helpers:

  • Get(id) – gets one record based on the primary key

  • GetList<Type>() – gets list of records all records from a table

  • GetList<Type>(anonymous object for where clause) – gets list of all records matching the where options

  • GetList<Type>(string for conditions) – gets list of all records matching the conditions

  • GetListPaged<Type>(string for conditions) – gets paged list of all records matching the conditions

  • Insert(entity) – Inserts a record and returns the new primary key

  • Update(entity) – Updates a record

  • Delete<Type>(id) – Deletes a record based on primary key

  • Delete(entity) – Deletes a record based on the typed entity

  • DeleteList<Type>(string for conditions) – deletes list of all records matching the conditions

  • RecordCount<Type>(string for conditions) -gets count of all records matching the conditions

通过Attrubte的方式,可以自动对应数据库表和字段

    [Table("Users")]
    public class User
    {
        [Key]
        public int UserId { get; set; }
        [Column("strFirstName"]
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public int Age { get; set; }
    }

最后上一段代码

这个是导入我的旧Blog数据到wordpress的时候用到的,其中包含了wordpress数据库表的意义和关系

    class Program
    {

        public static string ConnectionString = "Server=127.0.0.1;Database=db_blog;Uid=root;Pwd=root;CharSet=utf8;Allow Zero Datetime=True";

        static void Main(string[] args)
        {
            SimpleCRUD.SetDialect(SimpleCRUD.Dialect.MySQL);


            using (MySqlConnection conn = new MySqlConnection(ConnectionString))
            {


                Dictionary<long, CatagoryInfo> dicOld = new Dictionary<long, CatagoryInfo>();
                {
                    var list = conn.GetList<CatagoryInfo>();
                    foreach (var item in list)
                    {
                        TermInfo info = new TermInfo();
                        info.name = item.CategoryName;
                        info.slug = item.CategoryKey;
                        info.term_group = 0;
                        var id = conn.Insert<long>(info);
                        dicOld.Add(id, item);
                    }
                }
                //准备数据,分类
                Dictionary<string, TermInfo> dicCategory = new Dictionary<string, TermInfo>();


                {
                    var list = conn.GetList<TermInfo>();
                    foreach (var item in list)
                    {
                        dicCategory.Add(item.slug, item);
                    }
                }

                Dictionary<long, long> dicPosts = new Dictionary<long, long>();//前面是postid,后面是分类id
                //插入post
                {
                    var list = conn.GetList<ArticleInfo>();
                    foreach (var item in list)
                    {
                        PostInfo post = new PostInfo();
                        post.LL = item.Id;
                        post.post_author = 1;
                        post.post_date = item.AddDate;
                        post.post_date_gmt = item.AddDate;
                        post.post_modified = item.AddDate;
                        post.post_modified_gmt = item.AddDate;
                        post.post_content = item.Content;
                        post.post_title = item.Title;
                        post.post_excerpt = string.Empty;
                        post.post_password = string.Empty;
                        post.post_name = string.Empty;
                        post.to_ping = string.Empty;
                        post.pinged = string.Empty;
                        post.post_content_filtered = string.Empty;
                        post.post_mime_type = string.Empty;
                        post.post_status = "publish";
                        post.comment_status = "open";
                        post.ping_status = "closed";
                        post.post_type = "post";
                        post.menu_order = 0;
                        post.comment_count = 0;
                        var id = conn.Insert<long>(post);
                        dicPosts.Add(id, dicCategory[item.Category].term_id);
                    }
                }

                Dictionary<long, int> postCategoryCount = new Dictionary<long, int>();//文章对应的分类下的数量
                {

                    foreach (var item in dicPosts)
                    {
                        if (postCategoryCount.ContainsKey(item.Value))
                            postCategoryCount[item.Value]++;
                        else
                            postCategoryCount.Add(item.Value, 1);
                    }
                }

                {
                    int i = 0;
                    foreach (var item in dicCategory)
                    {
                        i++;
                        TermTaxonomyInfo tt = new TermTaxonomyInfo();
                        tt.count = postCategoryCount[item.Value.term_id];
                        tt.description = dicOld[item.Value.term_id].CategoryName;
                        tt.parent = 0;
                        tt.taxonomy = "category";
                        tt.term_id = dicCategory[item.Key].term_id;
                        var id = conn.Insert<long>(tt);
                    }

                    foreach (var item in dicPosts)
                    {
                        TeamRelationships tr = new TeamRelationships();
                        tr.object_id = item.Key;
                        tr.term_taxonomy_id = item.Value;
                        tr.term_order = 0;

                        conn.Insert<long>(tr);
                    }
                } 
            }
        }

         
    }

苦逼的entity代码,这两张是我的旧数据

    [Table("tb_article")]
    public class ArticleInfo
    { 
        [Key]
        public int Id { get; set; } 
        public string Title { get; set; } 
        public string Content { get; set; } 
        public string Category { get; set; }  
        public string Summary { get; set; } 
        public DateTime AddDate { get; set; }
        public int ArchiveKey { get; set; }  
    }
    [Table("tb_category")]
    public class CatagoryInfo
    { 
        public int Order { get; set; }
        [Key]
        public string CategoryKey { get; set; }
        public string CategoryName { get; set; } 
    }

以下四张是wordpress最重要的4张表

    [Table("wp_posts")]
    public class PostInfo
    { 
        [Key]
        public long ID { get; set; }
        public long LL { get; set; } 
        public long post_author { get; set; } 
        public DateTime post_date { get; set; }
        public DateTime post_date_gmt { get; set; }
        public string post_content { get; set; } 
        public string post_title { get; set; }
        public string post_excerpt { get; set; }
        public string post_status { get; set; }
        public string comment_status { get; set; }
        public string ping_status { get; set; }
        public string post_password { get; set; }
        public string post_name { get; set; } 
        public string to_ping { get; set; }
        public string pinged { get; set; } 
        public DateTime post_modified { get; set; }
        public DateTime post_modified_gmt { get; set; } 
        public string post_content_filtered { get; set; } 
        public long post_parent { get; set; }
        public int menu_order { get; set; }
        public string post_type { get; set; }
        public string post_mime_type { get; set; } 
        public long comment_count { get; set; } 
    }
    [Table("wp_term_relationships")]
    public class TeamRelationships
    { 
        [Key]
        public long LL { get; set; }
        public long object_id { get; set; } 
        public long term_taxonomy_id { get; set; }
        public int term_order { get; set; } 
    }
    [Table("wp_terms")]
    public class TermInfo
    {
        [Key]
        public long term_id { get; set; }
        public string name { get; set; }
        public string slug { get; set; }
        public long term_group { get; set; }
    }
    [Table("wp_term_taxonomy")]
    public class TermTaxonomyInfo
    {
        [Key]
        public long term_taxonomy_id { get; set; }
        public long term_id { get; set; }
        public long parent { get; set; }
        public long count { get; set; }
        public string description { get; set; }
        public string taxonomy { get; set; }
    }

wordpress表的关系

wp_terms   分类或者标签表

name是名字,slug则是友好的url里面的标识 

wp_term_taxonomy   记录的wp_terms表里标签或分类的属性

tearn_id  对应wp_terms里的id

taxonomy是分类,有两个值 category表示分类,post_tag表示标签

count则是固化的数值   

wp_term_relationships 

object_id  表示 wp_posts里的id  

tearm_taxonomy_id则表示的wp_term_taxonomy的id

written by ocean \\ tags: ,

9月 21

最近在搞测试,TFS相关的资料比较少,好不容易搞定,马上写个blog记录下来 

 

我使用的是 Microsoft Team Foundation Server 2010 VS使用的是 2013

TFS端安装和配置 

首先是安装TFS,这个没什么说的,基本上一路Next就可以搞定,就是注意需要安装一个sql server.

完了之后进去Team Foundation Server Administration Console

在Team Project Collections里面配置一个Collection

因为要做自动编译,所以需要在Build Configuration里面新建一个Controller和一个Agent

 

VS端

Team->Connect to Team Foundation Server

添加刚才新建的TFS

进入Term Explorer–>Source Control Explorer

先将本地代码签入TFS,

签入的时候注意,需要先建立Team Project

然后将本地的代码Check IN.

接下来配置Builds

Team->Builds->New Build Definiton 

Trigger 里面可以选择不同的触发方式,我在这里选择了第二个,每次签入触发

Source Settings里面就是对应的需要做自动编译测试的项目

Build Defaults里面需要注意Staging location,就是存放结果的地方,我是在TFS服务器上做了个共享目录

Process里面Items to Build选定需要编译测试的solution文件即可,还有一些高级测试配制方法

然后就OK了 

 

接下来每次check in代码的时候都可以自动编译和测试,当然,测试仅限于项目中的测试代码

还可以查看报表等东西.这个就有待继续研究了

 

最后记录一下网上找到的资源

https://www.visualstudio.com/en-us/setup-ci-build-in-vs.aspx

http://www.cnblogs.com/elvis0123

安装 TFS

http://www.cnblogs.com/wanghuilt/archive/2013/03/14/2959037.html

written by ocean \\ tags: ,

9月 20

之前做HTML数据提取都是用的正则自己写,这次做采集的时候发现了个好的东西 HtmlAgilityPack

用来解析HTML提取数据想当方便

 

在Visual Studio里面直接安装

Install-Package HtmlAgilityPack

解析使用的是xpath

XPath 是一门在 XML 文档中查找信息的语言。XPath 可用来在 XML 文档中对元素和属性进行遍历。

XPath 是 W3C XSLT 标准的主要元素,并且 XQuery 和 XPointer 都构建于 XPath 表达之上。

因此,对 XPath 的理解是很多高级 XML 应用的基础。

 

下面列出了最有用的路径表达式:

表达式 描述
nodename 选取此节点的所有子节点。
/ 从根节点选取。
// 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
. 选取当前节点。
.. 选取当前节点的父节点。
@ 选取属性。

以下面这个XML文档做例子

<?xml version="1.0" encoding="ISO-8859-1"?> 
<bookstore>  
<book>
  <title>Harry Potter</title>
  <price>29.99</price>
</book> 
<book>
  <title>Learning XML</title>
  <price>39.95</price>
</book> 
</bookstore>

 

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore

选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性。

 

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

 

路径表达式 结果
bookstore 选取 bookstore 元素的所有子节点。
/bookstore

选取根元素 bookstore。

注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!

bookstore/book 选取属于 bookstore 的子元素的所有 book 元素。
//book 选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book 选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang 选取名为 lang 的所有属性

 

路径表达式 结果
/bookstore/book[1] 选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()] 选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1] 选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()<3] 选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang] 选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang='eng'] 选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00] 选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title 选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

 

通配符 描述
* 匹配任何元素节点。
@* 匹配任何属性节点。
node() 匹配任何类型的节点。

 

路径表达式 结果
/bookstore/* 选取 bookstore 元素的所有子元素。
//* 选取文档中的所有元素。
//title[@*] 选取所有带有属性的 title 元素。

 

路径表达式 结果
//book/title | //book/price 选取 book 元素的所有 title 和 price 元素。
//title | //price 选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price 选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

 

 最后记录一段在解析中用到的代码

                HtmlDocument doc = new HtmlDocument();
                doc.LoadHtml(html);  
                var nodes = doc.DocumentNode.SelectNodes("/html/body/div[2]/div[2]/div[2]/div[1]/div[3]/div[1]/ul/li[@class='hui-list-item1']"); 
                int total = nodes.Count;
                for (int i = total - 1; i >= 0; i--)
                {
                    string url = nodes[i].SelectSingleNode("div/div[2]/div[2]/h3/a").Attributes["href"].Value;  
                        itemsInfo.Title = nodes[i].SelectSingleNode("div/div[2]/div[2]/h3/a").InnerText.Replace("\n", string.Empty).Trim();
                        itemsInfo.Content = nodes[i].SelectSingleNode("div/div[2]/div[2]/div[1]/div/p").InnerText.Replace("\n", string.Empty).Trim(); 
                            var img = nodes[i].SelectSingleNode("div/div[2]/div[1]/a/img").Attributes["data-src"].Value; 
                            string ecString = nodes[i].SelectSingleNode("div/div[1]/div[1]/a[1]").InnerText.Replace("\n", string.Empty).Trim(); 
                            string timeString = nodes[i].SelectSingleNode("div/div[1]/div[2]/span[3]").InnerText.Replace("\n", string.Empty).Trim();   
                }

written by ocean \\ tags: ,

9月 18

做了个Bootstrap的小项目,实在不能忍受浏览器自带alert的丑陋,于是找了个漂亮的弹框插件.

Bootbox.js 是一个小型的 JavaScript 库用来创建简单的可编程对话框,基于 Twitter 的 Bootstrap 开发。

 

官方下载地址

https://github.com/makeusabrew/bootbox

 

bootbox.js使用三方法设计模仿他们的本地JavaScript一些方法。

bootbox.alert(message, callback)
bootbox.prompt(message, callback)
bootbox.confirm(message, callback)

Alert

        bootbox.alert("http://blog.wx6.org", function () {
            //todo
        });

Confirm

        bootbox.confirm("http://blog.wx6.org", function (result) {
            //todo
        });

Prompt

        bootbox.prompt("http://blog.wx6.org", function (result) {
            if (result === null) {
                //todo
            } else {
                //todo
            }
        });

最复杂的Dialog,我是内签了一个iframe

           bootbox.dialog({  
               message: "<iframe id='ifr' width=100% height=600px frameborder=0 src='SelectImgFromWeiXinMessage.aspx' scrolling=false ></iframe>",  
               title: "选择图片",   
               buttons: {  
                   Cancel: {  
                       label: "Cancel",  
                       className: "btn-default",  
                       callback: function () {  
                       }  
                   }  
                   , OK: {  
                       label: "OK",  
                       className: "btn-primary",  
                       callback: function () {  
                          //debugger;
                          //var src= window.frames["ifr"].document.getElementById("imgsrc").value;
                          //alert(src); 
                       }  
                   }  
               } 
           });

当然它还可以用div等方式

附上dialog的API

bootbox.dialog({
  // dialog的内容
  message: "I am a custom dialog",
   
  // dialog的标题
  title: "Custom title",
   
  // 退出dialog时的回调函数,包括用户使用ESC键及点击关闭
  onEscape: function() {},
   
  // 是否显示此dialog,默认true
  show: true,
   
  // 是否显示body的遮罩,默认true
  backdrop: true,
   
  // 是否显示关闭按钮,默认true
  closeButton: true,
   
  // 是否动画弹出dialog,IE10以下版本不支持
  animate: true,
   
  // dialog的类名
  className: "my-modal",
   
  // dialog底端按钮配置
  buttons: {
     
    // 其中一个按钮配置
    success: {   
      // 按钮显示的名称
      label: "Success!",
       
      // 按钮的类名
      className: "btn-success",
       
      // 点击按钮时的回调函数
      callback: function() {}
    },
     
    // 另一个按钮配置
    "Danger!": {
      className: "btn-danger",
      callback: function() {}
    }
  }
});

written by ocean

9月 15

自从做了苦逼的站长,就没安宁过,现在又要折腾服务器了

这次从日本的linode换回国内的vps

用惯了Ubuntu,可惜这家只有centos,又要折腾一次环境,做个记录

更新

yum update

  

首先安装需要的库

yum -y install wget glib2-devel libtiff libtiff-devel libjpeg libjpeg-devel giflib giflib-devel libpng libpng-devel libX11 libX11-devel freetype freetype-devel fontconfig fontconfig-devel libexif libexif-devel gcc-c++ gettext unzip zip bzip2 bzip2-devel curl-devel gtk2-devel boost-devel

 

添加rpm源

rpm --import " 
yum-config-manager --add-repo http://jenkins.mono-project.com/repo/centos/

 

查找可用的mono版本

yum search mono

 

安装

yum  install mono-complete

 

written by ocean

9月 14

小程序需要做个后台服务定时采集数据,本来是在global里面写的Timer,但是发现Jexus里面这样用会造成不稳定,于是想法设法做类似windows的服务.

 

最开始研究的使用mono-service 做,后来发现例子很少,一直不能成功.

于是转而用Supervisor,线上一段摘录

Supervisor是一个C/S系统,它可以在类unix操作系统让用户来监视和控制后台服务进程的数量,一个很重要的功能就是监控服务器的主要后台进程,并在出现问题是自动重启。

 

首先安装

安装完成之后做配置   /etc/supervisor/supervisord.conf

添加如下代码

[include]
files = /etc/supervisor/conf.d/*.conf

/etc/supervisor/conf.d 新建yhhz5.conf

[program:yhhz5s]  
command=mono /var/www/yhhz5s/XXX.Console.exe
directory=/var/www/yhhz5s/
user=root
stderr_logfile = /root/error.log
stdout_logfile = /root/main.log
autostart=true
autorestart=true
startsecs=10

启动服务和停止服务

supervisorctl stop yhhz5s
supervisorctl start yhhz5s

打开命令行

supervisorctl

打开命令行之后查看状态

status

 

程序本身写成一个console

            int second = int.Parse(System.Configuration.ConfigurationSettings.AppSettings["Interval"]); 
            if (DateTime.Now.Hour >= 21 || DateTime.Now.Hour < 9)  //晚上21点到第二天早上9点,采集频率降低为20分钟一次 
                second = int.Parse(System.Configuration.ConfigurationSettings.AppSettings["IntervalAtNight"]); 
            second = second / 2; 
            Thread.Sleep(second * 1000); 
            LogHelper.Info("__________________________________________________________");
            LogHelper.Info("====================End Application======================="); 
            CollectStart.Start(); 
            LogHelper.Info("====================End Application=======================");
            LogHelper.Info("ˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉˉ"); 
            Thread.Sleep(second * 1000);

 

written by ocean \\ tags:

9月 13

使用workflow来做测试

written by ocean \\ tags:

9月 11

update by 2016.4.19

# Google Start
220.255.2.153 	www.google.com
220.255.2.153 	google.com
220.255.2.153 	gcr.io
220.255.2.153 	www.gcr.io
220.255.2.153 	com.google
220.255.2.153 	admin.google.com
220.255.2.153 	accounts.google.com
220.255.2.153 	passwords.google.com
220.255.2.153 	bpui0.google.com
220.255.2.153 	cse.google.com
220.255.2.153 	clients1.google.com
220.255.2.153 	clients2.google.com
220.255.2.153 	clients3.google.com
220.255.2.153 	clients4.google.com
220.255.2.153 	clients5.google.com
220.255.2.153 	clients6.google.com
220.255.2.153 	abusereporting-pa.clients6.google.com
220.255.2.153 	clients7.google.com
220.255.2.153 	contributor.google.com
220.255.2.153 	desktop.google.com
220.255.2.153 	desktop2.google.com
220.255.2.153 	encrypted.google.com
220.255.2.153 	encrypted-tbn0.google.com
220.255.2.153 	encrypted-tbn1.google.com
220.255.2.153 	encrypted-tbn2.google.com
220.255.2.153 	encrypted-tbn3.google.com
220.255.2.153 	fi.google.com
220.255.2.153 	goto.google.com
220.255.2.153 	gxc.google.com
220.255.2.153 	history.google.com
220.255.2.153 	investor.google.com
220.255.2.153 	jmt0.google.com
220.255.2.153 	keep.google.com
220.255.2.153 	linkhelp.clients.google.com
220.255.2.153 	upload.clients.google.com
220.255.2.153 	myaccount.google.com
220.255.2.153 	peering.google.com
220.255.2.153 	places.google.com
220.255.2.153 	pki.google.com
220.255.2.153 	script.google.com
220.255.2.153 	security.google.com
220.255.2.153 	services.google.com
220.255.2.153 	store.google.com
220.255.2.153 	suggestqueries.google.com
220.255.2.153 	support.google.com
220.255.2.153 	upload.google.com
220.255.2.153 	uploads.clients.google.com
220.255.2.153 	uploads.client.google.com
220.255.2.153 	upload.client.google.com
220.255.2.153 	video.google.com
220.255.2.153 	video-stats.video.google.com
220.255.2.153 	voice.google.com
220.255.2.153 	upload.video.google.com
220.255.2.153 	vp.video.google.com
220.255.2.153 	ads.google.com
220.255.2.153 	www.googlegroups.com
220.255.2.153 	a.orkut.gmodules.com
220.255.2.153 	www.googlestore.com
220.255.2.153 	ig.ig.gmodules.com
220.255.2.153 	redirector.c.youtube.com
220.255.2.153 	relay.google.com
220.255.2.153 	image.google.com
220.255.2.153 	mapsengine.google.com
220.255.2.153 	client-channel.google.com
220.255.2.153 	0.client-channel.google.com
220.255.2.153 	1.client-channel.google.com
220.255.2.153 	2.client-channel.google.com
220.255.2.153 	3.client-channel.google.com
220.255.2.153 	4.client-channel.google.com
220.255.2.153 	5.client-channel.google.com
220.255.2.153 	6.client-channel.google.com
220.255.2.153 	7.client-channel.google.com
220.255.2.153 	8.client-channel.google.com
220.255.2.153 	9.client-channel.google.com
220.255.2.153 	10.client-channel.google.com
220.255.2.153 	11.client-channel.google.com
220.255.2.153 	12.client-channel.google.com
220.255.2.153 	13.client-channel.google.com
220.255.2.153 	14.client-channel.google.com
220.255.2.153 	15.client-channel.google.com
220.255.2.153 	16.client-channel.google.com
220.255.2.153 	17.client-channel.google.com
220.255.2.153 	18.client-channel.google.com
220.255.2.153 	19.client-channel.google.com
220.255.2.153 	20.client-channel.google.com
220.255.2.153 	21.client-channel.google.com
220.255.2.153 	22.client-channel.google.com
220.255.2.153 	23.client-channel.google.com
220.255.2.153 	24.client-channel.google.com
220.255.2.153 	25.client-channel.google.com
220.255.2.153 	26.client-channel.google.com
220.255.2.153 	27.client-channel.google.com
220.255.2.153 	28.client-channel.google.com
220.255.2.153 	29.client-channel.google.com
220.255.2.153 	google.com.hk
220.255.2.153 	www.google.com.hk
220.255.2.153 	accounts.google.com.hk
220.255.2.153 	clients1.google.com.hk
220.255.2.153 	desktop.google.com.hk
220.255.2.153 	encrypted.google.com.hk
220.255.2.153 	gxc.google.com.hk
220.255.2.153 	video.google.com.hk
220.255.2.153 	id.google.com.hk
220.255.2.153 	mobile.google.com.hk
220.255.2.153 	picasaweb.google.com.hk
220.255.2.153 	www.googlechinawebmaster.com
220.255.2.153 	google.com.tw
220.255.2.153 	www.google.com.tw
220.255.2.153 	accounts.google.com.tw
220.255.2.153 	books.google.com.tw
220.255.2.153 	clients1.google.com.tw
220.255.2.153 	desktop.google.com.tw
220.255.2.153 	encrypted.google.com.tw
220.255.2.153 	groups.google.com.tw
220.255.2.153 	gxc.google.com.tw
220.255.2.153 	id.google.com.tw
220.255.2.153 	images.google.com.tw
220.255.2.153 	picasaweb.google.com.tw
220.255.2.153 	plus.url.google.com.tw
220.255.2.153 	toolbar.google.com.tw
220.255.2.153 	toolbarqueries.google.com.tw
220.255.2.153 	video.google.com.tw
220.255.2.153 	google.co.jp
220.255.2.153 	www.google.co.jp
220.255.2.153 	accounts.google.co.jp
220.255.2.153 	blogsearch.google.co.jp
220.255.2.153 	books.google.co.jp
220.255.2.153 	clients1.google.co.jp
220.255.2.153 	desktop.google.co.jp
220.255.2.153 	encrypted.google.co.jp
220.255.2.153 	groups.google.co.jp
220.255.2.153 	gxc.google.com.co.jp
220.255.2.153 	id.google.com.co.jp
220.255.2.153 	images.google.co.jp
220.255.2.153 	maps.google.co.jp
220.255.2.153 	news.google.co.jp
220.255.2.153 	picasaweb.google.co.jp
220.255.2.153 	plus.url.google.co.jp
220.255.2.153 	scholar.google.co.jp
220.255.2.153 	toolbar.google.co.jp
220.255.2.153 	toolbarqueries.google.co.jp
220.255.2.153 	translate.google.co.jp
220.255.2.153 	google.com.sg
220.255.2.153 	www.google.com.sg
220.255.2.153 	accounts.google.com.sg
220.255.2.153 	blogsearch.google.com.sg
220.255.2.153 	books.google.com.sg
220.255.2.153 	clients1.google.com.sg
220.255.2.153 	desktop.google.com.sg
220.255.2.153 	encrypted.google.com.sg
220.255.2.153 	groups.google.com.sg
220.255.2.153 	gxc.google.com.sg
220.255.2.153 	id.google.com.sg
220.255.2.153 	images.google.com.sg
220.255.2.153 	maps.google.com.sg
220.255.2.153 	news.google.com.sg
220.255.2.153 	picasaweb.google.com.sg
220.255.2.153 	plus.url.google.com.sg
220.255.2.153 	scholar.google.com.sg
220.255.2.153 	toolbar.google.com.sg
220.255.2.153 	toolbarqueries.google.com.sg
220.255.2.153 	translate.google.com.sg
220.255.2.153 	apps.google.com
220.255.2.153 	googlemashups.com
220.255.2.153 	www.googlemashups.com
64.233.162.87	appengine.google.com
220.255.2.153 	uploads.stage.gdata.youtube.com
220.255.2.153 	answers.google.com
220.255.2.153 	wenda.google.com.hk
220.255.2.153 	blogsearch.google.com
220.255.2.153 	blogsearch.google.com.hk
220.255.2.153 	blogsearch.google.com.tw
220.255.2.153 	accounts.blogger.com
220.255.2.153 	www.blogger.com
220.255.2.153 	blogger.com
220.255.2.153 	blogger.google.com
220.255.2.153 	www2.blogger.com
220.255.2.153 	www.blogblog.com
220.255.2.153 	www1.blogblog.com
220.255.2.153 	www2.blogblog.com
220.255.2.153 	beta.blogger.com
220.255.2.153 	buttons.blogger.com
220.255.2.153 	buzz.blogger.com
220.255.2.153 	draft.blogger.com
220.255.2.153 	status.blogger.com
220.255.2.153 	help.blogger.com
220.255.2.153 	photos1.blogger.com
220.255.2.153 	bp0.blogger.com
220.255.2.153 	bp1.blogger.com
220.255.2.153 	bp2.blogger.com
220.255.2.153 	bp3.blogger.com
220.255.2.153 	img.blogblog.com
220.255.2.153 	img1.blogblog.com
220.255.2.153 	img2.blogblog.com
220.255.2.153 	www.textcube.com
220.255.2.153 	www.blogspot.com
220.255.2.153 	blogspot.com
220.255.2.153 	books.google.com
220.255.2.153 	books.google.com.hk
220.255.2.153 	bks0.books.google.com
220.255.2.153 	bks1.books.google.com
220.255.2.153 	bks2.books.google.com
220.255.2.153 	bks3.books.google.com
220.255.2.153 	bks4.books.google.com
220.255.2.153 	bks5.books.google.com
220.255.2.153 	bks6.books.google.com
220.255.2.153 	bks7.books.google.com
220.255.2.153 	bks8.books.google.com
220.255.2.153 	bks9.books.google.com
220.255.2.153 	bks10.books.google.com
220.255.2.153 	bks0.books.google.com.hk
220.255.2.153 	bks1.books.google.com.hk
220.255.2.153 	bks2.books.google.com.hk
220.255.2.153 	bks3.books.google.com.hk
220.255.2.153 	bks4.books.google.com.hk
220.255.2.153 	bks5.books.google.com.hk
220.255.2.153 	bks6.books.google.com.hk
220.255.2.153 	bks7.books.google.com.hk
220.255.2.153 	bks8.books.google.com.hk
220.255.2.153 	bks9.books.google.com.hk
220.255.2.153 	bks10.books.google.com.hk
220.255.2.153 	buzz.google.com
220.255.2.153 	calendar.google.com
220.255.2.153 	checkout.google.com
220.255.2.153 	wallet.google.com
220.255.2.153 	www.chrome.com
220.255.2.153 	developer.chrome.com
220.255.2.153 	chrome.google.com
220.255.2.153 	browsersync.google.com
220.255.2.153 	toolbarqueries.google.com
220.255.2.153 	toolbarqueries.google.com.hk
220.255.2.153 	toolbarqueries.clients.google.com
220.255.2.153 	chromium.org
220.255.2.153 	aboutme.google.com
220.255.2.153 	www.chromium.org
220.255.2.153 	dev.chromium.org
220.255.2.153 	blog.chromium.org
# 74.125.248.71	build.chromium.org
# 74.125.248.72	src.chromium.org
# 74.125.248.73	git.chromium.org
# 220.255.2.153 	codereview.chromium.org
64.233.162.87	download-chromium.appspot.com
220.255.2.153 	accounts.google.com.gi
220.255.2.153 	accounts.google.co.nz
220.255.2.153 	id.google.co.nz
220.255.2.153 	www.googlecode.com
220.255.2.153 	googlesource.com
220.255.2.153 	gerrit.googlesource.com
220.255.2.153 	chromium.googlesource.com
220.255.2.153 	kernel.googlesource.com
220.255.2.153 	gwt.googlesource.com
220.255.2.153 	code.google.com
220.255.2.153 	uploads.code.google.com
220.255.2.153 	chromium.googlecode.com
220.255.2.153 	closure-library.googlecode.com
220.255.2.153 	earth-api-samples.googlecode.com
220.255.2.153 	gmaps-samples-flash.googlecode.com
220.255.2.153 	googleappengine.googlecode.com
220.255.2.153 	google-code-feed-gadget.googlecode.com
220.255.2.153 	google-code-prettify.googlecode.com
220.255.2.153 	www.googlesource.com
220.255.2.153 	android.googlesource.com
220.255.2.153 	cloud.google.com
220.255.2.153 	console.cloud.google.com
220.255.2.153 	developers.google.com
220.255.2.153 	cloudssh.developers.google.com
220.255.2.153 	console.developers.google.com
220.255.2.153 	source.developers.google.com
220.255.2.153 	directory.google.com
220.255.2.153 	dir.google.com
220.255.2.153 	design.google.com
220.255.2.153 	events.google.com
220.255.2.153 	googledrive.com
220.255.2.153 	docs.google.com
220.255.2.153 	drive.google.com
220.255.2.153 	drive0.google.com
220.255.2.153 	drive1.google.com
220.255.2.153 	drive2.google.com
220.255.2.153 	drive3.google.com
220.255.2.153 	drive4.google.com
220.255.2.153 	drive5.google.com
220.255.2.153 	drive6.google.com
220.255.2.153 	drive7.google.com
220.255.2.153 	drive8.google.com
220.255.2.153 	drive9.google.com
220.255.2.153 	docs0.google.com
220.255.2.153 	docs1.google.com
220.255.2.153 	docs2.google.com
220.255.2.153 	docs3.google.com
220.255.2.153 	docs4.google.com
220.255.2.153 	docs5.google.com
220.255.2.153 	docs6.google.com
220.255.2.153 	docs7.google.com
220.255.2.153 	docs8.google.com
220.255.2.153 	docs9.google.com
220.255.2.153 	writely.google.com
220.255.2.153 	upload.docs.google.com
220.255.2.153 	upload.drive.google.com
220.255.2.153 	0.docs.google.com
220.255.2.153 	1.docs.google.com
220.255.2.153 	2.docs.google.com
220.255.2.153 	3.docs.google.com
220.255.2.153 	4.docs.google.com
220.255.2.153 	5.docs.google.com
220.255.2.153 	6.docs.google.com
220.255.2.153 	7.docs.google.com
220.255.2.153 	8.docs.google.com
220.255.2.153 	9.docs.google.com
220.255.2.153 	10.docs.google.com
220.255.2.153 	11.docs.google.com
220.255.2.153 	12.docs.google.com
220.255.2.153 	13.docs.google.com
220.255.2.153 	14.docs.google.com
220.255.2.153 	15.docs.google.com
220.255.2.153 	16.docs.google.com
220.255.2.153 	0.drive.google.com
220.255.2.153 	1.drive.google.com
220.255.2.153 	2.drive.google.com
220.255.2.153 	3.drive.google.com
220.255.2.153 	4.drive.google.com
220.255.2.153 	5.drive.google.com
220.255.2.153 	6.drive.google.com
220.255.2.153 	7.drive.google.com
220.255.2.153 	8.drive.google.com
220.255.2.153 	9.drive.google.com
220.255.2.153 	10.drive.google.com
220.255.2.153 	11.drive.google.com
220.255.2.153 	12.drive.google.com
220.255.2.153 	13.drive.google.com
220.255.2.153 	14.drive.google.com
220.255.2.153 	15.drive.google.com
220.255.2.153 	16.drive.google.com
220.255.2.153 	spreadsheet.google.com
220.255.2.153 	spreadsheets.google.com
220.255.2.153 	spreadsheets0.google.com
220.255.2.153 	spreadsheets1.google.com
220.255.2.153 	spreadsheets2.google.com
220.255.2.153 	spreadsheets3.google.com
220.255.2.153 	spreadsheets4.google.com
220.255.2.153 	spreadsheets5.google.com
220.255.2.153 	spreadsheets6.google.com
220.255.2.153 	spreadsheets7.google.com
220.255.2.153 	spreadsheets8.google.com
220.255.2.153 	spreadsheets9.google.com
220.255.2.153 	drivenotepad.appspot.com
220.255.2.153 	8c953efe117cb4ee14eaffe2b417623a104ce4e6.googledrive.com
220.255.2.153 	v3.cache1.c.docs.google.com
220.255.2.153 	domains.google.com
220.255.2.153 	security.googleblog.com
220.255.2.153 	dl-ssl.google.com
220.255.2.153 	dl.google.com
220.255.2.153 	earth.google.com
220.255.2.153 	auth.keyhole.com
220.255.2.153 	geoauth.google.com
220.255.2.153 	finance.google.com
220.255.2.153 	fusion.google.com
220.255.2.153 	groups.google.com
220.255.2.153 	groups.google.com.hk
220.255.2.153 	groups-beta.google.com
220.255.2.153 	productforums.google.com
220.255.2.153 	blob-s-docs.googlegroups.com
220.255.2.153 	health.google.com
220.255.2.153 	images.google.com
220.255.2.153 	images.google.com.hk
220.255.2.153 	tbn0.google.com
220.255.2.153 	tbn1.google.com
220.255.2.153 	tbn2.google.com
220.255.2.153 	tbn3.google.com
220.255.2.153 	tbn4.google.com
220.255.2.153 	tbn5.google.com
220.255.2.153 	tbn6.google.com
220.255.2.153 	inputtools.google.com
220.255.2.153 	knol.google.com
220.255.2.153 	mars.google.com
220.255.2.153 	maps.google.com
220.255.2.153 	maps.google.com.hk
220.255.2.153 	maps.google.com.tw
220.255.2.153 	local.google.com
220.255.2.153 	ditu.google.com
220.255.2.153 	maps-api-ssl.google.com
220.255.2.153 	map.google.com
220.255.2.153 	kh.google.com
220.255.2.153 	khmdb.google.com
220.255.2.153 	khm.google.com
220.255.2.153 	khm0.google.com
220.255.2.153 	khm1.google.com
220.255.2.153 	khm2.google.com
220.255.2.153 	khm3.google.com
220.255.2.153 	cbk0.google.com
220.255.2.153 	cbk1.google.com
220.255.2.153 	cbk2.google.com
220.255.2.153 	cbk3.google.com
220.255.2.153 	khms.google.com
220.255.2.153 	khms0.google.com
220.255.2.153 	khms1.google.com
220.255.2.153 	khms2.google.com
220.255.2.153 	khms3.google.com
220.255.2.153 	cbks0.google.com
220.255.2.153 	cbks1.google.com
220.255.2.153 	cbks2.google.com
220.255.2.153 	cbks3.google.com
220.255.2.153 	mw1.google.com
220.255.2.153 	mw2.google.com
220.255.2.153 	mt.google.com
220.255.2.153 	mt0.google.com
220.255.2.153 	mt1.google.com
220.255.2.153 	mt2.google.com
220.255.2.153 	mt3.google.com
64.233.191.197  gg.google.com
220.255.2.153 	id.google.com
220.255.2.153 	mts.google.com
220.255.2.153 	mts0.google.com
220.255.2.153 	mts1.google.com
220.255.2.153 	mts2.google.com
220.255.2.153 	mts3.google.com
220.255.2.153 	mobilemaps.clients.google.com
220.255.2.153 	music.google.com
220.255.2.153 	music.googleusercontent.com
220.255.2.153 	uploadsj.clients.google.com
220.255.2.153 	news.google.com
220.255.2.153 	news.google.com.hk
220.255.2.153 	news.google.com.tw
220.255.2.153 	orkut.google.com
220.255.2.153 	www.orkut.com
220.255.2.153 	www.orkut.gmodules.com
220.255.2.153 	img1.orkut.com
220.255.2.153 	img2.orkut.com
220.255.2.153 	img3.orkut.com
220.255.2.153 	img4.orkut.com
220.255.2.153 	img5.orkut.com
220.255.2.153 	img6.orkut.com
220.255.2.153 	img7.orkut.com
220.255.2.153 	img8.orkut.com
220.255.2.153 	img9.orkut.com
220.255.2.153 	static1.orkut.com
220.255.2.153 	static2.orkut.com
220.255.2.153 	static3.orkut.com
220.255.2.153 	static4.orkut.com
220.255.2.153 	promote.orkut.com
220.255.2.153 	help.orkut.com
220.255.2.153 	blog.orkut.com
220.255.2.153 	en.blog.orkut.com
220.255.2.153 	pack.google.com
220.255.2.153 	cache.pack.google.com
220.255.2.153 	photos.google.com
220.255.2.153 	picasa.google.com
220.255.2.153 	picasaweb.google.com
220.255.2.153 	lh2.google.com
220.255.2.153 	lh3.google.com
220.255.2.153 	lh4.google.com
220.255.2.153 	lh5.google.com
220.255.2.153 	lh6.google.com
220.255.2.153 	upload.photos.google.com
220.255.2.153 	profiles.google.com
220.255.2.153 	plusone.google.com
220.255.2.153 	plus.google.com
220.255.2.153 	plus.google.com.hk
220.255.2.153 	plus.url.google.com
220.255.2.153 	plus.url.google.com.hk
220.255.2.153 	reader.google.com
220.255.2.153 	research.google.com
220.255.2.153 	sb.google.com
220.255.2.153 	sb-ssl.google.com
220.255.2.153 	safebrowsing.google.com
220.255.2.153 	alt1-safebrowsing.google.com
220.255.2.153 	safebrowsing.clients.google.com
220.255.2.153 	safebrowsing-cache.google.com
220.255.2.153 	sandbox.google.com
220.255.2.153 	scholar.google.com
220.255.2.153 	scholar.google.com.hk
220.255.2.153 	scholar.google.com.tw
220.255.2.153 	sites.google.com
220.255.2.153 	sketchup.google.com
220.255.2.153 	talkgadget.google.com
220.255.2.153 	tools.google.com
220.255.2.153 	toolbar.google.com
220.255.2.153 	toolbar.google.com.hk
220.255.2.153 	translate.google.com
220.255.2.153 	translate.google.com.hk
220.255.2.153 	translate.google.com.tw
220.255.2.153 	trends.google.com
220.255.2.153 	0.gvt0.com
220.255.2.153 	1.gvt0.com
220.255.2.153 	2.gvt0.com
220.255.2.153 	3.gvt0.com
220.255.2.153 	4.gvt0.com
220.255.2.153 	5.gvt0.com
220.255.2.153 	wave.google.com
220.255.2.153 	wave0.google.com
220.255.2.153 	wave1.google.com
220.255.2.153 	googlewave.com
220.255.2.153 	wifi.google.com
220.255.2.153 	gmodules.com
220.255.2.153 	www.gmodules.com
220.255.2.153 	www.ig.gmodules.com
220.255.2.153 	ig.gmodules.com
220.255.2.153 	ads.gmodules.com
220.255.2.153 	p.gmodules.com
220.255.2.153 	1.ig.gmodules.com
220.255.2.153 	2.ig.gmodules.com
220.255.2.153 	3.ig.gmodules.com
220.255.2.153 	4.ig.gmodules.com
220.255.2.153 	5.ig.gmodules.com
220.255.2.153 	6.ig.gmodules.com
220.255.2.153 	maps.gmodules.com
220.255.2.153 	img0.gmodules.com
220.255.2.153 	img1.gmodules.com
220.255.2.153 	img2.gmodules.com
220.255.2.153 	img3.gmodules.com
220.255.2.153 	skins.gmodules.com
220.255.2.153 	friendconnect.gmodules.com
220.255.2.153 	0.blogger.gmodules.com
220.255.2.153 	partnerpage.google.com
220.255.2.153 	apis.google.com

公司的vpn这两天用不了了,上不了google

找了一个更改host的方法,  2015.9.11  亲测可用

 

先记录下来,分享一下

64.233.162.83 www.google.com
64.233.162.83 www.google.com.hk
64.233.162.83 accounts.google.com
64.233.162.83 bpui0.google.com
64.233.162.83 ssl.gstatic.com
64.233.162.83 csi.gstatic.com
64.233.162.83 www.gstatic.com
64.233.162.83 support.google.com
64.233.162.83 clients6.google.com
64.233.162.83 plus.google.com
64.233.162.83 security.google.com

written by ocean \\ tags:

9月 09

新建了一个网站 优惠汇总网 

用的asp.net mvc+mysql的方式,第一次用asp.net mvc写代码,难免有很多走弯路的地方

开发完了调试了一下,已经可以跑在mono下了.

 

 

现在想监控一下性能,最开始是直接放在 GLobal.asax.cs里面的

        protected void Application_BeginRequest(object sender, EventArgs e)
        { 
            HttpContext.Current.Items["ExecuteTime"] = DateTime.Now; 
        }

        protected void Application_EndRequest(object sender, EventArgs e)
        {
            if (HttpContext.Current.Items["ExecuteTime"] != null)
            {
                //todo
            }
        }

大概是这样写的

在Application_BeginRequest记录开始时间,在Application_EndRequest记录结束时间,两个一减几个日志,完事.

 

这样优点很明显,代码简单呀有木有,缺点也很明显,这样胡子眉毛一把抓,完全搞不清耗时在哪些地方.于是决定改进一下.

先看了一下miniprofiler的介绍,可惜这个只适合开发环境,我是要在生成环境部署,于是果断pass

再然后发现了nanoprofiler,发现挺好,于是添加进网站测试了一下,果然很OK,部署到mono环境,一直报404找不到.看来是不兼容呀,而且这个好像不是很流行,于是再换

这次是用的Glimpse,发现也很强大,所有东西都能查到,稍微控制下权限就能用的.但是太强大了,我又不愿意这么重,最后又走到自己开发的路子上.

 

因为我用的是Dapper,所以就做了一下修改

        public static int Execute(
#if CSHARP30
this IDbConnection cnn, string sql, object param, IDbTransaction transaction, int? commandTimeout, CommandType? commandType
#else
this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null
#endif
)
        {   //add by ocean
            using (new TimeMonitorForDAL(sql, param))
            {
                var command = new CommandDefinition(sql, (object)param, transaction, commandTimeout, commandType, CommandFlags.Buffered);
                return ExecuteImpl(cnn, ref command);
            }
        }
        public static T ExecuteScalar<T>(
#if CSHARP30
this IDbConnection cnn, string sql, object param, IDbTransaction transaction, int? commandTimeout, CommandType? commandType
#else
this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, int? commandTimeout = null, CommandType? commandType = null
#endif
)
        {
             //add by ocean
            using (new TimeMonitorForDAL(sql, param))
            {
                var command = new CommandDefinition(sql, (object)param, transaction, commandTimeout, commandType, CommandFlags.Buffered);
                return ExecuteScalarImpl<T>(cnn, ref command);
            }
        } 
        public static IEnumerable<T> Query<T>(
#if CSHARP30
this IDbConnection cnn, string sql, object param, IDbTransaction transaction, bool buffered, int? commandTimeout, CommandType? commandType
#else
this IDbConnection cnn, string sql, object param = null, IDbTransaction transaction = null, bool buffered = true, int? commandTimeout = null, CommandType? commandType = null
#endif
)
        {
               //add by ocean
            using (new TimeMonitorForDAL(sql, param))
            {
                var command = new CommandDefinition(sql, (object)param, transaction, commandTimeout, commandType, buffered ? CommandFlags.Buffered : CommandFlags.None);
                var data = QueryImpl<T>(cnn, command, typeof(T));
                return command.Buffered ? data.ToList() : data;
            }
        }

代码太多就不贴了,其实就是在执行的时候添加TimeMonitorForDAL类调用就可以了

TimeMonitorForDAL.cs

    public class TimeMonitorForDAL:IDisposable
    {

         

        DateTime start = DateTime.Now;
         
        private string Sql = string.Empty;
        private string param = string.Empty;


        public TimeMonitorForDAL(string sql, object param)
        { 
            this.Sql = sql;
            if (param != null)
            {
                this.param = JSONHelper.Serialize(param);
            }
        }

        public void Dispose()
        {
            int total = (int)DateTime.Now.Subtract(start).TotalMilliseconds;



            try
            {
                using (MySqlConnection conn = new MySqlConnection(Config.ConnectionString))
                {
                    MySqlCommand cmd = new MySqlCommand(SQL, conn); 
                    cmd.Parameters.Add("SQL", this.Sql);
                    cmd.Parameters.Add("Params", this.param);
                    cmd.Parameters.Add("ElapsedTime", total);
                    cmd.Parameters.Add("TransactionId", "");
                    cmd.Parameters.Add("AddDate", DateTime.Now);
                    conn.Open();
                    cmd.ExecuteNonQuery();
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex);
            }
        } 
        private static string SQL = "insert into sys_timemonitorfordal(`SQL`,`Params`,`ElapsedTime`,`TransactionId`,`AddDate`)values(?SQL,?Params,?ElapsedTime,?TransactionId,?AddDate)";
         
    }

实现了IDisposable的接口,可以方便使用using的语法糖.

 

其实整个代码还是很简单的,这样就可以轻松实现监控sql执行耗时的功能了,而且,其它任何代码都不需要改变

当然,这个方式也是有缺点的,可能会对影响系统性能,废话,每次执行sql要多插入一次log,这个可以之后改成异步的或者一次性写入优化,不过大概的原型就这样了.

最后,贴一下sql的脚本方便备份

-- ----------------------------
-- Table structure for `sys_timemonitorfordal`
-- ----------------------------
DROP TABLE IF EXISTS `sys_timemonitorfordal`;
CREATE TABLE `sys_timemonitorfordal` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `SQL` varchar(4000) DEFAULT NULL,
  `Params` varchar(2000) DEFAULT NULL,
  `ElapsedTime` int(11) DEFAULT NULL,
  `TransactionId` varchar(100) DEFAULT NULL,
  `AddDate` datetime DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM AUTO_INCREMENT=1096 DEFAULT CHARSET=utf8;

 

另外,之所以要把log存在数据库中而不是日志中,主要是统计方便,例如下面这样

SELECT `sql`,count(*),max(ElapsedTime),Min(ElapsedTime),avg(ElapsedTime) from sys_timemonitorfordal GROUP BY `sql`

这样就可以统计出来一段时间以来执行sql的次数,最大耗时,平均耗时,做到有目的的优化sql

written by ocean \\ tags:

9月 07

最早的时候,博客是放在百度空间上的,虽然有诸多不方便的地方,例如长度受限,不能代码高亮等,但是主要看重他的速度快,用着还是很不错的.

突然有一天百度空间强制升级了,想当难用,于是做出一个艰难的决定,独立博客,从此走上一条折腾的道路.

终于博客独立了,整个站点后台是ASP.NET+ACCESS的,前台采用的最简单的静态生成的网页,因为我有一个免费的静态空间.后台都在本地,每次写一篇新的blog,需要重新生成一下所以的html,然后再全部上传到空间覆盖一次,

所幸文章不多,也可以凑合使用.

有一天,申请到了京东云的免费空间,很开心,终于可以把博客迁移到动态了,因为我也已经受够了每次添加或者改动一篇blog需要全部上传html的情况了.可惜京东云不支持我所熟悉的.NET,于是乎我只好把整个博客翻译成java+mysql的架构,用的简单的jsp+ibatis的技术,于是乎,博客上云了,从此再也不用限定于特定的电脑上写博客了(后台在本地).

拥抱云,博客正式迁入京东云

可惜好景不长,京东云被关闭了,于是,我又得为我的小窝找个空间了.这次我痛定思痛,决定还是挂到自己的服务器上

于是 程序迁移到Linode的Linux主机了 

这次采用的是  centos+mono+mysql+asp.net+jexus的架构,因为以前有后台,只是更换了前台动态展示和后台db的访问代码,于是我的小站终于跑在在自己的服务器上,并且是以跨平台的方式.

用了一阵子问题来了,因为自己的服务器在国外,访问速度上受限并且不是很稳定,另外还有一种情况,比方服务器需要维护,这个时候可能需要翻一下blog找找命令,但是因为维护却无法打开blog.于是又想到为blog找个国内的空间.

这个时候看到阿里云的免费空间,可惜又是不熟悉的php空间.

但是突然想到wordprss,这么流行的程序,拿来用用也很好呀,而且免费的php空间多如牛毛,主要是免费了.

于是一不做二不休,花了3天时间直接将站点改成wp的.

当然期间也折腾了一阵子,先是将数据导成wp的格式,

然后修改了一套皮肤用以支持宽屏,

后台换成了熟悉的Ueditor编辑器

这些以后可以开一篇blog来专门讲一次.

就到这里了,希望这次的阿里云可以用的久一点

written by ocean \\ tags: