以前只听过SQL server数据缓存依赖,但一直没使用,由于项目需要,才研究了一番,发现了一个很诡异的问题,竟然是一个操作顺序问题导致的。

SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式。

1  轮询模式实现步骤

此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持

主要包含以下几步:

1.1 使用aspnet_regsql命令行或SqlCacheDependencyAdmin来配置连接数据库

ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;  //启用 ServiceBroker,需要在数据库中执行,或者在数据库右键属性,选项中修改ENABLE BROKER为true

//注意修改时,需要关闭所有和此数据库关联的窗口,否则修改不成功。

报如下错误:

Alter failed for Database 'pu'.  (Microsoft.SqlServer.Smo)         
                         An exception occurred while executing a Transact-SQL statement or batch. (Microsoft.SqlServer.ConnectionInfo)             
                       Database state cannot be changed while other users are using the database 'pu'
                      ALTER DATABASE statement failed. (Microsoft SQL Server, Error: 5070)

一.对数据启用缓存依赖

在visual studio command prompt中执行以下命令

aspnet_regsql -C "Data Souce=localhost;Integrated Security=True;Initial Catalog=SqlTest" -ed

注释:aspnet_regsql是命令行工具 本命令表示启用SqlTest数据库缓存依赖

当执行该命令后,将会在数据库SqlTest中创建表:AspNet_SqlCacheTablesForChangeNotification,如图:

tableName:记录被缓存的表

notificationCreated:记录缓存被创建的时间

changeId:计数器,当表数据修改后,自动增加1

同事创建5个存储过程:

AspNet_SqlCachePollingStoredProcedure

AspNet_SqlCacheQueryRegisteredTablesStoredProcedure

AspNet_SqlCacheRegisterTableStoredProcedure

AspNet_SqlCacheUnRegisterTableStoredProcedure

AspNet_SqlCacheUpdateChangeIdStoredProcedure

二.对数据表启用缓存依赖

在visual studio command prompt中执行以下命令

aspnet_regsql -C "Data Souce=localhost;Integrated Security=True;Initial Catalog=Pubs" -et -t Customers

注释:对Customers表启用缓存依赖

当执行该命令后,将在数据库表AspNet_SqlCacheTablesForChangeNotification中添加一条记录,如图:

三.配置应用程序

  1. <caching>
  2. <sqlCacheDependency enabled="true" pollTime="1000">
  3. <databases>
  4. <add name="mydatabase" connectionStringName="pubsConnectionstring"/>
  5. </databases>
  6. </sqlCacheDependency>
  7. </caching>

注释:pollTime设置为1000ms,意思是应用程序按照1s的频率进行轮询,如果数据库表Customers数据被修改,则缓存在1m内失效,重新加载新的数据,然后缓存,知道数据被再次修改,检测数据库表的变化,connectionStringName被设置为要对哪一个数据库进行轮询的数据库连接字符串

此时已经对sql轮询模式已经设置完毕。

注意:系统默认不能识别aspnet_regsql,.net 4.0中aspnet_regsql的默认路径为C:\Windows\Microsoft.NET\Framework\v4.0.30319,需要首先把当前目录修改为C:\Windows\Microsoft.NET\Framework\v4.0.30319,才可以执行此命令。

1.2  配置文件

  1. <?xmlversion="1.0"?>
  2. <configuration>
  3. <connectionStrings>
  4. <add name="PubsConnectionString"connectionString="Data Source=10.32.153.165; Initial Catalog=pubs;uid=sa;pwd=q1w2e31@;"providerName="System.Data.SqlClient"/>
  5. </connectionStrings>
  6. <system.web>
  7. <compilationdebug="true"targetFramework="4.0"/>
  8. <caching>
  9. <sqlCacheDependencyenabled ="true"pollTime ="1000">
  10. <databases>
  11. <!--name:必需的 String 属性。 要添加到配置集合中的 SqlCacheDependencyDatabase 对象的名称。
  12. 此名称用作 @ OutputCache 指令上 SqlDependency 属性的一部分。
  13. pollTime:设置 SqlCacheDependency 轮询数据库表以查看是否发生更改的频率(以毫秒计算)。这儿是一个测试,所以设为10秒,请加大此值
  14. connectionStringName 必选的 String 特性。为数据库设置连接字符串名称。 在 connectionStrings 元素(ASP.NET 设置架构) 配置节中引用连接字符串。-->
  15. <addname="Pubs"connectionStringName = "PubsConnectionString"/>
  16. </databases>
  17. </sqlCacheDependency>
  18. </caching>
  19. </system.web>
  20. </configuration>
  1. <?xml version="1.0"?>
  2. <configuration>
  3. <connectionStrings>
  4. <add name="PubsConnectionString" connectionString="Data Source=10.32.153.165; Initial Catalog=pubs;uid=sa;pwd=q1w2e31@;" providerName="System.Data.SqlClient" />
  5. </connectionStrings>
  6. <system.web>
  7. <compilation debug="true" targetFramework="4.0" />
  8. <caching>
  9. <sqlCacheDependency enabled = "true" pollTime = "1000" >
  10. <databases>
  11. <!--name:必需的 String 属性。 要添加到配置集合中的 SqlCacheDependencyDatabase 对象的名称。
  12. 此名称用作 @ OutputCache 指令上 SqlDependency 属性的一部分。
  13. pollTime:设置 SqlCacheDependency 轮询数据库表以查看是否发生更改的频率(以毫秒计算)。这儿是一个测试,所以设为10秒,请加大此值
  14. connectionStringName 必选的 String 特性。为数据库设置连接字符串名称。 在 connectionStrings 元素(ASP.NET 设置架构) 配置节中引用连接字符串。-->
  15. <add name="Pubs" connectionStringName = "PubsConnectionString" />
  16. </databases>
  17. </sqlCacheDependency>
  18. </caching>
  19. </system.web>
  20. </configuration>

注意:connectionStrings,和caching两节的关系,caching节的connectionStringName需要和connectionStrings中的name对应的。

1.3   SqlCacheDependencyAdmin使用

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Web.Caching;
  8. using System.Configuration;
  9. using System.Data.SqlClient;
  10. namespace TestWebSqlCacheDependency
  11. {
  12. public partial class _Default : System.Web.UI.Page
  13. {
  14. string key = "model_type";
  15. protected void Page_Load(object sender, EventArgs e)
  16. {
  17. TextBox1.Text = test();// test();
  18. }
  19. private string test()
  20. {
  21. //从缓存中取值
  22. string model = null;
  23. if (HttpRuntime.Cache[key] !=null)
  24. {
  25. model = HttpRuntime.Cache[key].ToString();
  26. }
  27. if (model ==null)
  28. {
  29. //取数据
  30. model = getDBValue();
  31. //启用更改通知
  32. SqlCacheDependencyAdmin.EnableNotifications(
  33. ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString);
  34. //连接到 SQL Server 数据库并为 SqlCacheDependency 更改通知准备数据库表
  35. SqlCacheDependencyAdmin.EnableTableForNotifications(
  36. ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString,"TableTest");//第二个参数是要监控的表名称
  37. //制定缓存策略
  38. SqlCacheDependency scd = new SqlCacheDependency("Pubs","TableTest");
  39. //注意此处的Pubs需要要配置文件的caching节下的databases节下的name对应,而不是随便写的,目前个人测试的结论就是这样。第二个参数是要监控的表名称
  40. //插入缓存
  41. HttpRuntime.Cache.Insert(key, model, scd);
  42. }
  43. return model;
  44. }
  45. private string getDBValue()
  46. {
  47. SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString);
  48. cn.Open();
  49. SqlCommand cd = cn.CreateCommand();
  50. cd.CommandText = " select top 1 TableTest.col2 from TableTest ";
  51. object o = cd.ExecuteScalar();
  52. cn.Close();
  53. if (o != null)
  54. {
  55. return o.ToString();
  56. }
  57. return null;
  58. }
  59. }
  60. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System.Web.Caching;
  8. using System.Configuration;
  9. using System.Data.SqlClient;
  10. namespace TestWebSqlCacheDependency
  11. {
  12. public partial class _Default : System.Web.UI.Page
  13. {
  14. string key = "model_type";
  15. protected void Page_Load(object sender, EventArgs e)
  16. {
  17. TextBox1.Text = test();// test();
  18. }
  19. private string test()
  20. {
  21. //从缓存中取值
  22. string model = null;
  23. if (HttpRuntime.Cache[key] != null)
  24. {
  25. model = HttpRuntime.Cache[key].ToString();
  26. }
  27. if (model == null)
  28. {
  29. //取数据
  30. model = getDBValue();
  31. //启用更改通知
  32. SqlCacheDependencyAdmin.EnableNotifications(
  33. ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString);
  34. //连接到 SQL Server 数据库并为 SqlCacheDependency 更改通知准备数据库表
  35. SqlCacheDependencyAdmin.EnableTableForNotifications(
  36. ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString, "TableTest");//第二个参数是要监控的表名称
  37. //制定缓存策略
  38. SqlCacheDependency scd = new SqlCacheDependency("Pubs", "TableTest");
  39. //注意此处的Pubs需要要配置文件的caching节下的databases节下的name对应,而不是随便写的,目前个人测试的结论就是这样。第二个参数是要监控的表名称
  40. //插入缓存
  41. HttpRuntime.Cache.Insert(key, model, scd);
  42. }
  43. return model;
  44. }
  45. private string getDBValue()
  46. {
  47. SqlConnection cn = new SqlConnection(ConfigurationManager.ConnectionStrings["PubsConnectionString"].ConnectionString);
  48. cn.Open();
  49. SqlCommand cd = cn.CreateCommand();
  50. cd.CommandText = " select top 1 TableTest.col2 from TableTest ";
  51. object o = cd.ExecuteScalar();
  52. cn.Close();
  53. if (o != null)
  54. {
  55. return o.ToString();
  56. }
  57. return null;
  58. }
  59. }
  60. }

轮询模式的实质,就是在数据库中多了一个表AspNet_SqlCacheTablesForChangeNotification,在需要监视改变的表也多了一个Trigger,触发器名称为:表名_AspNet_SqlCacheNotification_Trigger,在每次表中有数据时,会触发此触发器,向AspNet_SqlCacheTablesForChangeNotification表中插入数据,系统会隔一段时间查询一次,发现有改变时,就会清空相对应的cache,caching节的pollTime其实就是查询间隔,也就是说,如果此时间设置的很长,数据库中的数据修改后,需要很长时间,才能清空对应的cache,最长延时可到达pollTime对应的时间,性能并不是很好。

2  通知模式实现步骤

SQL SERVER 2005(包括SQL SERVER 2005)以上的数据库才可以使用。

2.1 启用Service Broker

Select DATABASEpRoPERTYEX('数据库名称','IsBrokerEnabled') --检测是否启用了 ServiceBroker,1 表示已经启用 0 表示没有启用

ALTER DATABASE <DatabaseName> SET ENABLE_BROKER;  //启用 ServiceBroker,需要在数据库中执行,或者在数据库右键属性,选项中修改 ENABLE BROKER为true, 与轮询模式完全一致,但不要aspnet_regsql相应的脚本。

2.2  启动调用SqlDependency.Start,结束时调用SqlDependency.Stop()

最好放进Global中,例如:

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.SessionState;
  7. using System.Data.SqlClient;
  8. using System.Web.Caching;
  9. namespace WebTest2
  10. {
  11. public class Global : System.Web.HttpApplication
  12. {
  13. void Application_Start(object sender, EventArgs e)
  14. {
  15. #region SQL2005
  16. SqlDependency.Start(ConnectionString_SQL2005);//推荐将这段代码加到Global.asax的Application_Start方法中
  17. #endregion
  18. }
  19. void Application_End(object sender, EventArgs e)
  20. {
  21. SqlDependency.Stop(ConnectionString_SQL2005);
  22. }
  23. }
  24. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.SessionState;
  7. using System.Data.SqlClient;
  8. using System.Web.Caching;
  9. namespace WebTest2
  10. {
  11. public class Global : System.Web.HttpApplication
  12. {
  13. void Application_Start(object sender, EventArgs e)
  14. {
  15. #region SQL2005
  16. SqlDependency.Start(ConnectionString_SQL2005);//推荐将这段代码加到Global.asax的Application_Start方法中
  17. #endregion
  18. }
  19. void Application_End(object sender, EventArgs e)
  20. {
  21. SqlDependency.Stop(ConnectionString_SQL2005);
  22. }
  23. }
  24. }

调试时注意一定要运行SqlDependency.Start()这句,否则就会出错,所以测试时不要使用预览模式。由于vs会启动WebDev.WebServer40.EXE ,导致SqlDependency.Start()可能就没有运行,所以调试时一定要把VS启动的WebDev.WebServer40.EXE的前一次模拟服务停止了,使vs重新启动WebDev.WebServer40.EXE,并运行SqlDependency.Start()。

2.3  使用

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System;
  8. using System.Configuration;
  9. using System.Collections.Generic;
  10. using System.Data;
  11. using System.Data.SqlClient;
  12. using System.Web;
  13. using System.Web.UI;
  14. using System.Web.UI.WebControls;
  15. using System.Web.Caching;
  16. namespace WebTest2
  17. {
  18. public partial class _Default : System.Web.UI.Page
  19. {
  20. protected void Page_Load(object sender, EventArgs e)
  21. {
  22. DataTable dt = HttpRuntime.Cache["dt"]as DataTable;
  23. if (dt == null)
  24. {
  25. using (SqlConnection sqlCon =new SqlConnection(WebConfigHelper.ConnectionString_SQL2005))
  26. {
  27. sqlCon.Open();
  28. SqlCommand sqlCmd = new SqlCommand();
  29. sqlCmd.Connection = sqlCon;
  30. sqlCmd.CommandText = "select col2 from dbo.TableTest";
  31. dt = new DataTable();
  32. SqlCacheDependency scd = new SqlCacheDependency(sqlCmd);
  33. SqlDataAdapter sda = new SqlDataAdapter(sqlCmd);
  34. sda.Fill(dt);
  35. HttpRuntime.Cache.Insert("dt", dt, scd);
  36. sqlCon.Close();
  37. }
  38. }
  39. GridView1.DataSource = dt;
  40. GridView1.DataBind();
  41. }
  42. }
  43. }
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Web;
  5. using System.Web.UI;
  6. using System.Web.UI.WebControls;
  7. using System;
  8. using System.Configuration;
  9. using System.Collections.Generic;
  10. using System.Data;
  11. using System.Data.SqlClient;
  12. using System.Web;
  13. using System.Web.UI;
  14. using System.Web.UI.WebControls;
  15. using System.Web.Caching;
  16. namespace WebTest2
  17. {
  18. public partial class _Default : System.Web.UI.Page
  19. {
  20. protected void Page_Load(object sender, EventArgs e)
  21. {
  22. DataTable dt = HttpRuntime.Cache["dt"] as DataTable;
  23. if (dt == null)
  24. {
  25. using (SqlConnection sqlCon = new SqlConnection(WebConfigHelper.ConnectionString_SQL2005))
  26. {
  27. sqlCon.Open();
  28. SqlCommand sqlCmd = new SqlCommand();
  29. sqlCmd.Connection = sqlCon;
  30. sqlCmd.CommandText = "select col2 from dbo.TableTest";
  31. dt = new DataTable();
  32. SqlCacheDependency scd = new SqlCacheDependency(sqlCmd);
  33. SqlDataAdapter sda = new SqlDataAdapter(sqlCmd);
  34. sda.Fill(dt);
  35. HttpRuntime.Cache.Insert("dt", dt, scd);
  36. sqlCon.Close();
  37. }
  38. }
  39. GridView1.DataSource = dt;
  40. GridView1.DataBind();
  41. }
  42. }
  43. }

很明显通知模式,配置文件不需要任何特殊处理,数据库中也没有增加表AspNet_SqlCacheTablesForChangeNotification和Trigger,性能也比轮询模式好的多。只要数据库中数据有改变,cache中的对应数据就会清空,基本上是实时的,不像轮询模式由pollTime决定。

通知模式需要注意的时,一定要在创建数据库之前,把数据库配置管理中的tcp/ip的那个配置改为able,否则就会出项很诡异的错误,能发出通知,但客户端就是不能收到,无论数据库中的数据怎样改变,读取的数据始终是缓存中的数据,但把tcp/ip的那个配置改为able后,再创建的数据库就可以,而且好像只有首次配置才会出现,当再次把able改为diable时在创建数据库,再改为able时,就不会出现了,很奇怪。整整折腾了三天,才发现此问题!!

另外使用windows身份认证创建的数据库也有可能导致此问题,具体原因不明。所以应该使用SQL身份认证创建数据库,不要使用windows身份认证创建数据库。很奇怪后来在测试时,使用windows身份认证创建数据库又可以了,所以具体原因目前不知道。

原因参考

http://www.cnblogs.com/rickie/archive/2006/12/21.html

另外通知模式的查询语句也有一定的要求,这一定要注意。参考支持的 SELECT 语句

存储过程不能包含SET NOCOUNT ON,WITH(NOLOCK),否者数据不能缓存到Cache,每次都是重新读取数据库,不管数据有没有改变。

通知模式的延时估计有几百毫秒,也就是说,在更新数据库后,立即读取Cache数据不是空的,但我测试一秒后就为空了,不会影响实际使用的,但对单元测试会有影响,一定要Thread.sleep(1000),否则单元测试不能通过。

参考文章

SQL数据缓存依赖

SQL Server2005实现数据库缓存依赖的实现步骤

Sql Server 2005/2008 SqlCacheDependency查询通知的使用总结

SqlCacheDependency 类

使用 SqlCacheDependency 类在 ASP.NET 中缓存

启用查询通知

诡异问题详细信息

数据sqlcachedependency轮询功能配置方法

caching 的 sqlCacheDependency 的 databases 元素(ASP.NET 设置架构)

caching 的 sqlCacheDependency 元素(ASP.NET 设置架构)

caching 的 database 的 add 元素(ASP.NET 设置架构

SQL Server 中的查询通知 (ADO.NET)

为通知创建查询

我在这篇文章的末尾分享一下我们最近做项目中关于通知模式中应用的一些经验:

我们有一个复杂的查询语句写在一个存储过程里,但是这是通知模式所不支持的sql语句,所以我们HardCode了一段查询两张表的简单查询语句去达到通知模式中的监控两张表,然后在注册在cache中,下面是代码:

    1. 对两张表监控的SqlCacheDependency的应用
    2. public const string SqlDependencyCacheSql = "SELECT id FROM dbo.Products;SELECT id FROM dbo.ExpiredProducts;";
    3. public static SqlCacheDependency GetSqlCacheDependency()
    4. {
    5. SqlCacheDependency sqlCacheDependency = null;
    6. using (SqlConnection sqlCon = new SqlConnection(dbConnectionString))
    7. {
    8. SqlCommand sqlCmdCache = new SqlCommand(SqlDependencyCacheSql, sqlCon);
    9. sqlCacheDependency = new SqlCacheDependency(sqlCmdCache);
    10. try
    11. {
    12. sqlCon.Open();
    13. sqlCmdCache.ExecuteNonQuery();
    14. }
    15. catch
    16. {
    17. throw;
    18. }
    19. }
    20. return sqlCacheDependency;
    21. }
    22. public static Dictionary<string, Product> Products
    23. {
    24. get
    25. {
    26. if (HttpRuntime.Cache[CacheAllProduct] == null)
    27. {
    28. SqlCacheDependency sqlCacheDependency = BrandPartnerDataAccess.GetSqlCacheDependency();
    29. DataTable dt = DataAccess.GetAllProduct();
    30. HttpRuntime.Cache.Insert(CacheAllProduct, ConvertToProductsDictionary(dt), sqlCacheDependency);
    31. }
    32. return HttpRuntime.Cache[CacheAllProduct] as Dictionary<string, Product>;
    33. }
    34. }

SQL数据缓存依赖总结的更多相关文章

  1. cache应用(asp.net 2.0 SQL数据缓存依赖 [SqlCacheDependency ] )

    Asp.net 2.0 提供了一个新的数据缓存功能,就是利用sql server2005 的异步通知功能来实现缓存 1.首先在sqlserver2005 中创建一个test的数据库. 在SQL Ser ...

  2. SQL数据缓存依赖 [SqlServer | Cache | SqlCacheDependency ]

    前言 本文主要是对<ASP.NET 2.0开发指南>——<数据缓存>章节内容的提取并略有补充. 参考资料 1.     <ASP.NET 2.0开发指南> 2.   ...

  3. 我用ASP.NET缓存之SQL数据缓存依赖(SqlCacheDependency)

    [名词解释] 缓存(Cache)依赖,大白话解释就是缓存是否更新依赖于其它Object.那么SqlCacheDependency指的就是Cache的数据更新依赖于SQL Server数据库表的变化(  ...

  4. SQL server数据缓存依赖

    SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持        主要包含以下几 ...

  5. SQL SERVER 2000 & SQL SERVER 2005 数据缓存依赖

    一.SQL SERVER 7.0/2000和SQL SERVER 2005的简介及比较 1.1     SQL SERVER 7.0/2000 SQL SERVER 7.0/2000没有提供内置的支持 ...

  6. C#中缓存的简单方法及使用Sql设置缓存依赖项

    概述 使用Cache高速缓存可以提高数据的读取速度,减少服务器与客户端之间的数据交互.因为Cache一经创建就会占用服务器上的资源,所以Cache并不是越多越好,一般用于数据较固定,使用较频繁的地方. ...

  7. SQL Server SqlCacheDependency 缓存依赖

     SQL server数据缓存依赖有两种实现模式,轮询模式,通知模式. 1  轮询模式实现步骤 此模式需要SQL SERVER 7.0/2000/2005版本以上版本都支持 主要包含以下几步:  1. ...

  8. System.Web.Caching.Cache类 缓存 各种缓存依赖

    原文:System.Web.Caching.Cache类 缓存 各种缓存依赖 Cache类,是一个用于缓存常用信息的类.HttpRuntime.Cache以及HttpContext.Current.C ...

  9. asp.net mvc5中使用缓存依赖SqlCacheDependency

    缓存是用来提高应用性能,降低服务器压力.适用于数据不易变,数据易通用的情景, 对于动态查询数据,例如数据分析,最好放弃使用缓存.使用缓存最麻烦的就是保持源数据和缓存的中的数据一致. 缓存(Cache) ...

随机推荐

  1. OpenNebula学习第四节之磁盘镜像的制作

    一.准备工作 需要准备一个Ubuntu16.04的ISO文件上传至服务器,如下图所示 二.操作步骤 2.1:创建操作目录 创建一个/var/tmp/cloud_image目录,把Ubuntu16.04 ...

  2. php ci框架中载入css和js文件失败的原因及解决方法

    在将html页面整合到ci框架里面的时候,载入css和js失败. 原因是ci框架是入口的框架 对框架中文件的全部请求都须要经过index.php处理完毕,当载入外部的css和js文件的时候要使 用ba ...

  3. [Angular CLI] Build application without remove dist folder for Docker Volume

    When we develop the Angular app inside Docker container, we can simulate Production envioment by bui ...

  4. Direct2D教程IV——笔刷(Brush)对象

    目前博客园中成系列的Direct2D的教程有 1.万一的 Direct2D 系列,用的是Delphi 2009 2.zdd的 Direct2D 系列,用的是VS中的C++ 3.本文所在的 Direct ...

  5. ecshop中smarty最常用的6大基本语法

    模板制作比较核心的其实就是变量的使用,因为这些就是数据的根本,想从数据库里获取数据并显示在界面就必须使用smarty来展示,下面是关于smarty的介绍和使用.Smarty是一个php模板引擎,它分开 ...

  6. Slitaz定制

    word文档: http://www.docin.com/p-670440986.html Slitaz 定制 什么是 SlitazSlitaz 是一个免费小巧的 GNU/Linux 发行版.它可以从 ...

  7. logistic回归具体解释(二):损失函数(cost function)具体解释

    有监督学习 机器学习分为有监督学习,无监督学习,半监督学习.强化学习.对于逻辑回归来说,就是一种典型的有监督学习. 既然是有监督学习,训练集自然能够用例如以下方式表述: {(x1,y1),(x2,y2 ...

  8. PHP 字符串编码的转换

    原文链接:http://mangguo.org/php-string-encoding-convert-and-detect/ GBK 和 UTF-8 编码的转换是一个非常恶心的事情,比如像 PHP ...

  9. linux 查看网线断开 网卡是否关闭

    linux 查看网线断开 网卡是否关闭 探测是否存在网络接口:  SIOCGIFFLAGS

  10. 【树莓派】RPi desktop系统重启或关机挂起几个问题:plymouth-reboot.service、plymouth-poweroff.service、Deconfiguring network interfaces

    在基于intel平台安装的RPi desktop关机或者重启时,会存在挂起的问题,一直卡着不动. 挂起问题有3个: 系统关机时候,停留在:plymouth-poweroff.service 系统重启时 ...