当前位置: 首页 > 编程日记 > 正文

高性能ORM框架XLinq功能详细介绍

之前简单介绍了XLinq的一些功能,有很多功能都没有提到,现在给XLinq加了一些功能,这次把所有功能都介绍一遍。

设计目标

  1. 易用性

    在使用一个框架的时候

    应该没几个人会喜欢写一大堆的配置文件吧

    也应该没几个人会喜欢为了完成一个小功能却需要写一大堆代码

    这是XLinq开发的首要目标之一,就是尽可能提高易用性

    最小配置的情况下仅需要一句连接字符串的配置就可以使用

    默认支持的是Sql Server 2008 R2数据库,理论上说也大部分支持了sql server系的其他数据库

  2. 高性能

    目前针对查询时的DataReader转List和批量插入有针对性优化,其他的不太重要的例如批量更新这个并没有太多优化

  3. 易于调试

    出了问题能够以最快速度让使用者定位到问题,其实这些是细节问题

  4. 支持LINQ

    这个其实是跟易用性挂勾的,园子里面有大神写的ORM,声称"无Linq",其实我也不太想用Linq,因为解析Linq实在太难,坑太多,但又找不到另一种比Linq更让我满意的方案。然后我去看了他的ORM的使用方法,发现一旦复杂起来不见得会比Linq更清晰,并且实体类的设计实在是···

    Linq实现复杂的语法确实比较蛋疼,sql语句里面直接来几个case when,linq就得写晕过去,至少解析的时候会晕过去。

    但在我看来,既然linq语句都比较复杂了,那肯定是有很多的逻辑在里面,就像上面说的case when,那么为什么不把这些逻辑分拆成好几个linq去执行呢?或者干脆点写存储过程里面。

  5. 多数据库支持

使用方法

  1. 建立控制台应用程序,暂时只支持.net 4.5.2版本
  2. 安装xlinq nuget包

  3. 建立数据库XLinq及相关表

  4. 添加配置文件
    1. <connectionStrings>
    2.   <add name="test" connectionString="Data Source=(local);;initial catalog=XLinq;User Id=xinchen;Password=123456"/>
    3. </connectionStrings>
  5. 建立TestDataContext类和User实体类
    1. public class TestDataContext:DataContext
    2.     {
    3.         public TestDataContext():base("test")
    4.         {
    5.         }
    6.     }
    7. public class User
    8.     {
    9.         public int Id { get; set; }
    10.         public string Username { get; set; }
    11.     }
  6. 开始使用
    1. TestDataContext db = new TestDataContext();
    2.            db.Set<User>().ToList();

查询

  1. 单表查询

    Lambda版:

    1. db.Set<User>().Where(x => x.Username == "xxxx").ToList();

    LINQ版:

    1. (from user in db.Set<User>() where user.Username == "xxxx" select user).ToList();

    LINQ版看起来明显感觉比较麻烦,所以在简单查询的时候我更倾向于Lambda表达式

    上面的语句生成的代码是一致的

    1. SELECT
    2. [Users1].[Id] [Id]
    3. ,[Users1].[Username] [Username]
    4.  FROM [Users] [Users1] WHERE ([Users1].[Username] = @param2)
  2. 多表查询

    建立实体类的过程不再说

    两个表连接查询,因为用Lambda实现比较复杂,所以后面都不再用Lambda实现

    1. var query = from user in db.Set<User>()
    2.                         join userRole in db.Set<UserRole>() on user.Id equals userRole.UserId
    3.                         where user.Id == 1 && userRole.RoleId == 1
    4.                         select new
    5.                         {
    6.                             user.Id,
    7.                             userRole.RoleId,
    8.                             user.Username
    9.                         };

    生成的语句

    1. SELECT
    2. [user].[Id] [Id]
    3. ,[userRole].[RoleId] [RoleId]
    4. ,[user].[Username] [Username]
    5.  FROM
    6. [Users] [user] INNER JOIN [UserRoles] [userRole]
    7.  ON [user].[Id] = [userRole].[UserId]
    8.  WHERE (([user].[Id] = @param1) AND ([userRole].[RoleId] = @param2))

    五个表连接查询

    1. var query = from user in db.Set<User>()
    2.                        join userRole in db.Set<UserRole>() on user.Id equals userRole.UserId
    3.                        join rolePrivilege in db.Set<RolePrivilege>() on userRole.RoleId equals rolePrivilege.RoleId
    4.                        join priviege in db.Set<Privilege>() on rolePrivilege.PrivilegeId equals priviege.Id
    5.                        join role in db.Set<Role>() on userRole.RoleId equals role.Id
    6.                        where user.Id == 1 && userRole.RoleId == 1
    7.                        select new
    8.                        {
    9.                            user.Id,
    10.                            userRole.RoleId,
    11.                            user.Username,
    12.                            PrivilegeName = priviege.Name,
    13.                            RoleName = role.Name
    14.                        };

    生成的语句

    1. SELECT
    2. [user].[Id] [Id]
    3. ,[userRole].[RoleId] [RoleId]
    4. ,[user].[Username] [Username]
    5. ,[priviege].[Name] [PrivilegeName]
    6. ,[role].[Name] [RoleName]
    7.  FROM
    8. [Users] [user] INNER JOIN [UserRoles] [userRole]
    9.  ON [user].[Id] = [userRole].[UserId]
    10.  INNER JOIN [RolePrivileges] [rolePrivilege]
    11.  ON [userRole].[RoleId] = [rolePrivilege].[RoleId]
    12.  INNER JOIN [Privileges] [priviege]
    13.  ON [rolePrivilege].[PrivilegeId] = [priviege].[Id]
    14.  INNER JOIN [Roles] [role]
    15.  ON [userRole].[RoleId] = [role].[Id]
    16.  WHERE (([user].[Id] = @param5) AND ([userRole].[RoleId] = @param6))
  3. 左连接查询

    因为linq本身的左连接写法比较蛋疼,所以xlinq也没有办法,后面会想办法简化

    1. var query = from user in db.Set<User>()
    2.                         join userRole in db.Set<UserRole>() on user.Id equals userRole.UserId into urs
    3.                         from ur in urs.DefaultIfEmpty()
    4.                         where user.Id == 1 && ur.RoleId == 1
    5.                         select new
    6.                         {
    7.                             user.Id,
    8.                             ur.RoleId,
    9.                             user.Username
    10.                         };

    生成的语句

    1. SELECT
    2. [user].[Id] [Id]
    3. ,[userRole].[RoleId] [RoleId]
    4. ,[user].[Username] [Username]
    5.  FROM
    6. [Users] [user] Left JOIN [UserRoles] [userRole]
    7.  ON [user].[Id] = [userRole].[UserId]
    8.  WHERE (([user].[Id] = @param5) AND ([userRole].[RoleId] = @param6))
  4. 延迟加载
    1. var query = db.Set<User>().Where(x => x.Username == "xxxxx").Select(x => x.Id);
    2.            foreach (var item in query)
    3.            {
    4.            }
  5. 自连接查询
    1. var query = from user1 in db.Set<User>()
    2.                         join user2 in db.Set<User>() on user1.Id equals user2.Id
    3.                         select user1;

    生成的语句

    1. SELECT
    2. [user1].[Id] [Id]
    3. ,[user1].[Username] [Username]
    4.  FROM
    5. [Users] [user1] INNER JOIN [Users] [user2]
    6.  ON [user1].[Id] = [user2].[Id]
  6. SQL语句查询
    1. db.SqlQuery<User>("select * from dbo.users", new Dictionary<string, object>());
  7. 分页查询
    1. var page = 1;
    2.             var pageSize = 10;
    3.             var query = (from user in db.Set<User>()
    4.                          join userRole in db.Set<UserRole>() on user.Id equals userRole.UserId
    5.                          join rolePrivilege in db.Set<RolePrivilege>() on userRole.RoleId equals rolePrivilege.RoleId
    6.                          join priviege in db.Set<Privilege>() on rolePrivilege.PrivilegeId equals priviege.Id
    7.                          join role in db.Set<Role>() on userRole.RoleId equals role.Id
    8.                          where user.Id == 1 && userRole.RoleId == 1
    9.                          orderby user.Id descending
    10.                          select new
    11.                          {
    12.                              user.Id,
    13.                              userRole.RoleId,
    14.                              user.Username,
    15.                              PrivilegeName = priviege.Name,
    16.                              RoleName = role.Name
    17.                          }).Skip((page - 1) * pageSize).Take(pageSize);

    生成的语句

    1. SELECT [_indexTable].[Id],[_indexTable].[RoleId],[_indexTable].[Username],[_indexTable].[PrivilegeName],[_indexTable].[RoleName] FROM (SELECT [user].[Id] [Id]
    2. ,[userRole].[RoleId] [RoleId]
    3. ,[user].[Username] [Username]
    4. ,[priviege].[Name] [PrivilegeName]
    5. ,[role].[Name] [RoleName]
    6. ,ROW_NUMBER() OVER(ORDER BY [user].[Id]) #index
    7.  FROM [Users] [user] INNER JOIN [UserRoles] [userRole]
    8.  ON [user].[Id] = [userRole].[UserId]
    9.  INNER JOIN [RolePrivileges] [rolePrivilege]
    10.  ON [userRole].[RoleId] = [rolePrivilege].[RoleId]
    11.  INNER JOIN [Privileges] [priviege]
    12.  ON [rolePrivilege].[PrivilegeId] = [priviege].[Id]
    13.  INNER JOIN [Roles] [role]
    14.  ON [userRole].[RoleId] = [role].[Id]
    15.  WHERE (([user].[Id] = @param5) AND ([userRole].[RoleId] = @param6)) ) _indexTable where [_indexTable].[#index] BETWEEN 0 AND 10
  8. 动态查询
    1. IQueryable<User> query = db.Set<User>();
    2.             var filters = new List<SqlFilter>();
    3.             filters.Add(SqlFilter.Create("Id", Operation.Equal, 1));
    4.             filters.Add(SqlFilter.Create("Username", Operation.Like, "aaa"));
    5.             query = query.Where(filters);

    生成的语句

    1. SELECT
    2. [Users1].[Id] [Id]
    3. ,[Users1].[Username] [Username]
    4.  FROM [Users] [Users1] WHERE (([Users1].[Id] = @param2) AND CHARINDEX(@param3,[Users1].[Username])>0)
  9. 取日期查询

    这个功能主要针对EF中无法直接取日期的问题

    1. var query = db.Set<User>().Where(x => x.LoginTime.Date == DateTime.Now.Date);
    2. SELECT
    3. [Users1].[Id] [Id]
    4. ,[Users1].[Username] [Username]
    5. ,[Users1].[LoginTime] [LoginTime]
    6.  FROM [Users] [Users1] WHERE (CONVERT(DATE,[Users1].[LoginTime],211) = @param3)
  10. 计算天数查询
    1. var query = db.Set<User>().Where(x => (x.LoginTime - DateTime.Now).TotalDays <= 7);

    生成的语句

    1. SELECT
    2. [Users1].[Id] [Id]
    3. ,[Users1].[Username] [Username]
    4. ,[Users1].[LoginTime] [LoginTime]
    5.  FROM [Users] [Users1] WHERE (DATEDIFF(DAY,[Users1].[LoginTime],@param2) <= @param3)

修改

  1. 先查询后修改(注意只有十条数据以内才会支持修改)
    1. var query = db.Set<User>().FirstOrDefault();
    2.             query.Username = "xxxxxxx";
    3.             db.SaveChanges();
  2. 直接修改
    1. db.Set<User>().Where(x => x.Id == 1).Update(x => new User
    2.             {
    3.                 Username = "xxxxxxxxxxxxx"
    4.             });

    Update子句必须采用这写法才会有效

删除

  1. 先查询后删除
    1. var query = db.Set<User>().FirstOrDefault();
    2. db.Set<User>().Remove(query);
    3. db.SaveChanges();
  2. 直接删除
    1. db.Set<User>().Where(x => x.Id == 1).Delete();

事务

  1. 普通事务
    1. using (var scope = new TransactionScope())
    2. {
    3.     db.Set<User>().Where(x => x.Id == 1).Delete();
    4.     scope.Complete();
    5. }
  2. 嵌套事务
    1. using (var scope = new TransactionScope())
    2. {
    3.     db.Set<User>().Where(x => x.Id == 1).Delete();
    4.     using (var s1 = new TransactionScope())
    5.     {
    6.         db.Set<Privilege>().Where(x => x.Id == 1).Delete();
    7.         s1.Complete();
    8.     }
    9.     scope.Complete();
    10. }

调试支持

在调试的时候可直接看到SQL语句

多数据库支持

通过配置文件实现多数据库支持

  1. <configSections>
  2.   <section name="xlinq" type="Xinchen.XLinq.ConfigSection,Xinchen.XLinq"/>
  3. </configSections>
  4. <xlinq connectionStringName="test" dataBase="SQLite"></xlinq>

链式Api

有没有园友注意到,我上面用的User实体并没有进行任何特殊处理,但实际翻译出来的语句是识别的Users表

这其实是"抄"的EF的约定大于配置的原则,默认情况下,实体名的复数就是表名,实体中的Id识别为主键并自动增长

如果需要自定义这些规则,则需要使用特性或链式API,我现在更喜欢链式API

  1. public class TestDataContext:DataContext
  2.    {
  3.        public TestDataContext():base("test")
  4.        {
  5.        }
  6.        protected override void ConfigurationModel(Xinchen.XLinq.Configuation.EntityConfigurationManager entityConfiguration)
  7.        {
  8.            entityConfiguration.Entity<User>().TableName("Users").Key(x => x.Id, Xinchen.DbUtils.DataAnnotations.DataSourceTypes.AutoIncreament);
  9.        }
  10.    }

重写DataContext的ConfigurationModel方法即可使用链式API对实体相关信息进行配置,上面是指定了User实体的表名、主键及主键的数据来源为自动增长

创建表

若要创建表,则几乎必须使用链式API对实体进行配置之后才能进行自动创建

另外这个功能有一定的限制,默认情况下不会启用该功能,若启用了也只有在数据库中一个表都没有的情况下才会自动创建表

这样做是因为真正的数据库运行环境其实很可能压根不允许自动创建表,然后就是下面这个样子,这样一来这个功能其实并没有太大用,只有在第一次初始化数据库的时候才会用。

当然也可以始终自动创建表,这个需要稍微配置一下,当allwayAutoCreateTables为true时并且autoCreateTables为true时,将始终自动创建表

下面演示创建一个Test表

DataContext中的配置

  1. public class TestDataContext : DataContext
  2. {
  3.     public TestDataContext()
  4.         : base("test")
  5.     {
  6.     }
  7.     protected override void ConfigurationModel(Xinchen.XLinq.Configuation.EntityConfigurationManager entityConfiguration)
  8.     {
  9.         var testEntity = entityConfiguration.Entity<Test>().TableName("TestTables").Key(x => x.Id, Xinchen.DbUtils.DataAnnotations.DataSourceTypes.AutoIncreament);
  10.         testEntity.Property(x => x.Id).Name("TId");
  11.         testEntity.Property(x => x.Name).MaxLength(100);
  12.     }
  13. }

创建的表

自定义Provider(有这功能,但没有测试)

性能

  1. 查询
    1. class Program
    2. {
    3.     static int count = 1;
    4.     static int rowCount = 1000000;
    5.     static void Main(string[] args)
    6.     {
    7.         TestDataContext xlinqDb = new TestDataContext();
    8.         TestDbContext efDb = GetEF(null);
    9.         var userDB = xlinqDb.Set<User>();
    10.         var userRoleDb = xlinqDb.Set<UserRole>();
    11.         var efUserDb = efDb.Users;
    12.         var efUserRoleDb = efDb.UserRoles;
    13.         ExecuteTimer("XLinq使用Linq", () =>
    14.         {
    15.             for (int i = 0; i < count; i++)
    16.             {
    17.                 userDB.Take(rowCount).ToList();
    18.             }
    19.         });
    20.         ExecuteTimer("XLinq使用SQL", () =>
    21.         {
    22.             var sql = "select top " + rowCount + " * from dbo.users";
    23.             var dict = new Dictionary<string, object>();
    24.             for (int i = 0; i < count; i++)
    25.             {
    26.                 xlinqDb.SqlQuery<User>(sql, dict);
    27.             }
    28.         });
    29.         ExecuteTimer("XLinq多表", () =>
    30.         {
    31.             for (int i = 0; i < count; i++)
    32.             {
    33.                 (from user in userDB
    34.                  join userRole in userRoleDb on user.Id equals userRole.UserId into us
    35.                  from u in us.DefaultIfEmpty()
    36.                  select user).Take(rowCount).ToList();
    37.             }
    38.         });
    39.         efDb = GetEF(efDb);
    40.         efUserDb = efDb.Users;
    41.         efUserRoleDb = efDb.UserRoles;
    42.         ExecuteTimer("EF使用LINQ", () =>
    43.         {
    44.             for (int i = 0; i < count; i++)
    45.             {
    46.                 efUserDb.Take(rowCount).ToList();
    47.             }
    48.         });
    49.         efDb = GetEF(efDb);
    50.         efUserDb = efDb.Users;
    51.         efUserRoleDb = efDb.UserRoles;
    52.         ExecuteTimer("EF使用SQL", () =>
    53.         {
    54.             var sql = "select top " + rowCount + " * from dbo.users";
    55.             for (int i = 0; i < count; i++)
    56.             {
    57.                 efDb.Database.SqlQuery<User>(sql).ToList();
    58.             }
    59.         });
    60.         efDb = GetEF(efDb);
    61.         efUserDb = efDb.Users;
    62.         efUserRoleDb = efDb.UserRoles;
    63.         ExecuteTimer("EF多表", () =>
    64.         {
    65.             for (int i = 0; i < count; i++)
    66.             {
    67.                 (from user in efUserDb
    68.                  join userRole in efUserRoleDb on user.Id equals userRole.UserId into us
    69.                  from u in us.DefaultIfEmpty()
    70.                  select user).Take(rowCount).ToList();
    71.             }
    72.         });
    73.         SqlConnection conn = new SqlConnection();
    74.         conn.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings[1].ConnectionString;
    75.         ExecuteTimer("Dapper", () =>
    76.         {
    77.             var sql = "select top " + rowCount + " * from dbo.users";
    78.             for (int i = 0; i < count; i++)
    79.             {
    80.                 conn.Query<User>(sql);
    81.             }
    82.         });
    83.         Console.ReadKey();
    84.     }
    85.     static void ExecuteTimer(string name, Action action)
    86.     {
    87.         var watcher = Stopwatch.StartNew();
    88.         action();
    89.         watcher.Stop();
    90.         Console.WriteLine(string.Format("{0}查询{1}数据{2}次", name, rowCount, count).PadRight(30) + ":" + watcher.Elapsed);
    91.     }
    92.     static TestDbContext GetEF(TestDbContext ef)
    93.     {
    94.         if (ef != null)
    95.         {
    96.             ef.Dispose();
    97.         }
    98.         TestDbContext efDb = new TestDbContext();
    99.         efDb.Users.Where(x => false).ToList();
    100.         efDb.Configuration.AutoDetectChangesEnabled = false;
    101.         efDb.Configuration.ProxyCreationEnabled = false;
    102.         efDb.Configuration.ValidateOnSaveEnabled = false;
    103.         return efDb;
    104.     }
    105.     public class TestDbContext : DbContext
    106.     {
    107.         public TestDbContext()
    108.             : base("name=test")
    109.         {
    110.         }
    111.         public System.Data.Entity.DbSet<User> Users { get; set; }
    112.         public System.Data.Entity.DbSet<UserRole> UserRoles { get; set; }
    113.     }
    114. }

    测试结果

    查询一次的情况下EF慢的妥妥的,XLinq微弱优势

    查询N次的情况下EF这···还有人说EF慢?不过大概是因为缓存的原因,但最后一张图看着又不太像,或许还跟GC什么的关吧,所以还有人说EF慢么··

    或者是我测试代码有问题?

  2. 插入
    1. class Program
    2. {
    3.     static int count = 10;
    4.     static int rowCount = 1000;
    5.     static void Main(string[] args)
    6.     {
    7.         TestDataContext xlinqDb = new TestDataContext();
    8.         TestDbContext efDb = GetEF(null);
    9.         var userDB = xlinqDb.Set<User>();
    10.         var userRoleDb = xlinqDb.Set<UserRole>();
    11.         var efUserDb = efDb.Users;
    12.         var efUserRoleDb = efDb.UserRoles;
    13.         ExecuteInsertTimer("XLinq", () =>
    14.         {
    15.             for (int i = 0; i < rowCount; i++)
    16.             {
    17.                 userDB.Add(new User()
    18.                 {
    19.                     C1 = "x",
    20.                     C2 = "x",
    21.                     C3 = "x",
    22.                     C4 = "x",
    23.                     C5 = "x",
    24.                     C6 = "x",
    25.                     C7 = "x",
    26.                     C8 = "x",
    27.                     C9 = "x",
    28.                     C10 = "x",
    29.                     Username = "xxxx"
    30.                 });
    31.             }
    32.             xlinqDb.SaveChanges();
    33.         });
    34.         ExecuteInsertTimer("EF", () =>
    35.         {
    36.             for (int i = 0; i < rowCount; i++)
    37.             {
    38.                 efUserDb.Add(new User()
    39.                 {
    40.                     C1 = "x",
    41.                     C2 = "x",
    42.                     C3 = "x",
    43.                     C4 = "x",
    44.                     C5 = "x",
    45.                     C6 = "x",
    46.                     C7 = "x",
    47.                     C8 = "x",
    48.                     C9 = "x",
    49.                     C10 = "x",
    50.                     Username = "xxxx"
    51.                 });
    52.             }
    53.             efDb.SaveChanges();
    54.         });
    55.         Console.ReadKey();
    56.     }
    57.     static void ExecuteTimer(string name, Action action)
    58.     {
    59.         var watcher = Stopwatch.StartNew();
    60.         action();
    61.         watcher.Stop();
    62.         Console.WriteLine(string.Format("{0}查询{1}数据{2}次", name, rowCount, count).PadRight(30) + ":" + watcher.Elapsed);
    63.     }
    64.     static void ExecuteInsertTimer(string name, Action action)
    65.     {
    66.         var watcher = Stopwatch.StartNew();
    67.         action();
    68.         watcher.Stop();
    69.         Console.WriteLine(string.Format("{0}插入{1}条数据", name, rowCount).PadRight(30) + ":" + watcher.Elapsed);
    70.     }
    71.     static TestDbContext GetEF(TestDbContext ef)
    72.     {
    73.         if (ef != null)
    74.         {
    75.             ef.Dispose();
    76.         }
    77.         TestDbContext efDb = new TestDbContext();
    78.         efDb.Users.Where(x => false).ToList();
    79.         efDb.Configuration.AutoDetectChangesEnabled = false;
    80.         efDb.Configuration.ProxyCreationEnabled = false;
    81.         efDb.Configuration.ValidateOnSaveEnabled = false;
    82.         return efDb;
    83.     }
    84.     public class TestDbContext : DbContext
    85.     {
    86.         public TestDbContext()
    87.             : base("name=test")
    88.         {
    89.         }
    90.         public System.Data.Entity.DbSet<User> Users { get; set; }
    91.         public System.Data.Entity.DbSet<UserRole> UserRoles { get; set; }
    92.     }
    93. }

    测试结果

测试源码下载

http://files.cnblogs.com/files/wzxinchen/XlinqDemo.zip

转载于:https://www.cnblogs.com/wzxinchen/p/4700506.html

相关文章:

太好玩了,爬虫、部署API、加小程序,一条龙玩转知乎热榜!

作者 | 周萝卜来源 | 萝卜大杂烩一直想做一个从爬虫到数据处理&#xff0c;到API部署&#xff0c;再到小程序展示的一条龙项目&#xff0c;最近抽了些时间&#xff0c;实现了一个关于知乎热榜的&#xff0c;今天就来分享一下&#xff01;数据爬取首先我们看下需要爬取的知乎热榜…

linux的more 命令

名称&#xff1a;more 使用权限&#xff1a;所有使用者 使用方式&#xff1a;more [-dlfpcsu] [-num] [/pattern] [linenum] [fileNames..] 说明&#xff1a;类似 cat &#xff0c;不过会以一页一页的显示方便使用者逐页阅读&#xff0c;而最基本的指令就是按空白键&#xff08…

20155222卢梓杰 实验三 免杀原理与实践

实验三 免杀原理与实践 1.正确使用msf编码器&#xff0c;msfvenom生成如jar之类的其他文件&#xff0c;veil-evasion&#xff0c;自己利用shellcode编程等免杀工具或技巧 实验步骤如下 1.先对实验二中生成的exe进行检测 65款杀毒软件有36款认为不安全 39款杀毒软件有6款认为不安…

Linux wc命令详解

通常利用Linux的wc命令和其他命令结合来计算行和其他信息。在Linux下用wc进行计数。返回文件的行数、字数、字节数等。看个例子&#xff1a;wc wc1.txt3 5 16 wc1.txt输出信息依次是&#xff1a;行数 字数 字节数 文件名称。再具体点&#xff0c;单个统计。#wc -m filename&…

(剑指Offer)面试题54:表示数值的字符串

题目&#xff1a; 请实现一个函数用来判断字符串是否表示数值&#xff08;包括整数和小数&#xff09;。例如&#xff0c;字符串"100","5e2","-123","3.1416"和"-1E-16"都表示数值。 但是"12e","1a3.14"…

「动手学深度学习」在B站火到没谁,加这个免费实操平台,妥妥天花板!

论 AI 圈活菩萨&#xff0c;非李沐老师莫属。前有编写「动手学深度学习」&#xff0c;成就圈内入门经典&#xff0c;后又在B站免费讲斯坦福 AI 课&#xff0c;一则艰深硬核讲论文的视频播放量36万&#xff0c;不少课题组从导师到见习本科生都在追番。如此给劲的分享&#xff0c…

spring-redis-data的一个坑

事故原因&#xff1a; 运维报告redis内存直线上升&#xff0c;然后查询发现都是setrange操作&#xff0c;review代码&#xff0c;没法发现setrange操作 代码如下&#xff1a; redisTemplate.opsForValue().set(groupidxxxResult.getSeriesNo(), JSON.toJSONString(xxxRquestDTO…

Linux如何搜索文件的方法

#whereis 查找已经安装的软件 在Linux上查找某个文件是一件比较麻烦的事情。毕竟在Linux中需要我们使用专用的“查找”命令来寻找在硬盘上的文件。 Linux下的文件表达格式非常复杂&#xff0c;不象WINDOWS,DOS下都是统一的AAAAAAA.BBB格式 那么方便查找&#xff0c;在WINDOWS中…

python socket编程

python 编写server的步骤&#xff1a;1.第一步是创建socket对象。调用socket构造函数。如&#xff1a;socket socket.socket( family, type )family参数代表地址家族&#xff0c;可为AF_INET或AF_UNIX。AF_INET家族包括Internet地址&#xff0c;AF_UNIX家族用于同一台机器上的…

AI 语言模型真的是越大越好吗?这个模型优于 Gopher

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 近年来对于 AI 语言模型的有一个争议就是 —— 越大越好。 DeepMind 正在质疑这个理由&#xff0c;并表示给 AI 一个记忆可以帮助与它 25倍大小的模型竞争。 去年 6 月&#xff0c;OpenAI 发布 GPT-3 模…

[20180412]订阅+镜像切换

订阅镜像切换 主数据库挂了之后&#xff0c;镜像数据库没挂&#xff0c;那么就需要把镜像数据库设置成主数据库。1.修改主机名&#xff0c;改成和主数据库一样的&#xff0c;重启2.修改数据库中的主机名IF SERVERPROPERTY(ServerName)<>SERVERNAMEBEGINDECLARE srvname s…

【Cocos2d开发】Cocos2d下安卓环境的搭建

在进行Cocos2d游戏开发前 我们先来配置一下环境&#xff0c;我们先来准备一下工具&#xff0c;我们所需要的工具分别为&#xff1a;1.Cocos2d引擎2.JDK3.SDK4.NDK5.ANT6.ADT1.下载Cocos2d-x引擎&#xff0c;目前最新版本为3.6&#xff0c;本教程的所有例子以3.4版本为例&#x…

Linux时间转化方法

Linux时间转化方法&#xff1a;(1)date -d"2008年 12月 17日 星期三 17:27:22 CST" "%s"该命令将2008年 12月 17日 星期三 17:27:22 CST转化为时间戳结果:1229515680(2)将时间戳1123495443 换算成可以识别的年月日分秒date -d 1970-01-01 UTC 1123495443 s…

有的放矢,远程操控中实时音视频的优化之道

5G远程操控场景&#xff0c;对实时音视频传输的时延、卡顿率和抗弱网等指标都有着非常高的要求&#xff0c;本文将会介绍如何结合5G网络特点&#xff0c;在实时音视频通信链路中进行联合优化&#xff0c;满足行业场景远控需求&#xff0c;降低画面时延。 在上一篇文章中&#x…

Quartz动态添加、修改和删除定时任务

2019独角兽企业重金招聘Python工程师标准>>> Quartz动态添加、修改和删除定时任务 转载于:https://my.oschina.net/haokevin/blog/1795161

Linux下运行run文件

必须到Linux下的终端&#xff0c;不能用远程命令 #chmod 755 文件名 #./文件名

第五届中国企业服务年会:洞见2022数智化的“光与火”

汇智聚能&#xff0c;一起点亮“高增长的下一步”。 在疫情防控与复工复产双重因素的带动下&#xff0c;企业数智化成为不确定环境中的确定项&#xff0c;“ABCD&#xff08;人工智能、区块链、云计算、数据&#xff09;X”引爆生产力、生产资料、生产关系和基础设施革命&#…

QTP连接oracle

2019独角兽企业重金招聘Python工程师标准>>> 首先&#xff0c;因为群里很多朋友说QTP连接oracle有点麻烦&#xff0c;我针对于连接oracle做一个完整的教程&#xff0c;希望需要学习的朋友都可以来看一下&#xff1b;具体方法如下&#xff1a; 1、无论是什么语言&am…

java子类对象和成员变量的隐写方法重写

1、子类继承的方法只能操作子类继承和隐藏的成员变量名字类新定义的方法可以操作子类继承和子类新生命的成员变量&#xff0c;但是无法操作子类隐藏的成员变量&#xff08;需要适用super关键字操作子类隐藏的成员变量。&#xff09; public class ChengYuanBianLing { publi…

Linux的cron和crontab定时任务

定时任务调用shell本地Windows写一个shell test.sh #!/bin/bashecho "Course Arrange Job runs well at: " date "%Y-%m-%d %H:%M:%S" >> /usr/www/wwwshell/www.txt 先在服务器执行看可不可以 注意需要 # dos2unix ./test.sh 再 # ./test.sh需要…

用AI创造可持续发展社会价值,第二届腾讯Light·公益创新挑战赛正式启动

12月23日&#xff0c;“创变者”2021年度腾讯Light论坛在厦门正式举办。在论坛上&#xff0c;由全国妇联宣传部指导&#xff0c;腾讯公司联合中国儿童中心主办&#xff0c;企鹅伴成长、腾讯华东总部、腾讯SSV创新办学实验室、企鹅爱地球、腾讯优图实验室、腾讯云AI、腾讯云微搭…

CSS3 @keyframes animate

2019独角兽企业重金招聘Python工程师标准>>> 1.keyframes定义和用法 通过 keyframes 规则&#xff0c;您能够创建动画。 创建动画的原理是&#xff0c;将一套 CSS 样式逐渐变化为另一套样式。 在动画过程中&#xff0c;您能够多次改变这套 CSS 样式。 以百分比来…

linux系统命令学习系列-文件和目录管理

复习上节内容&#xff1a;1. 定时执行任务命令crontab –e, crontab –l,crontab –r2. 作业&#xff1a;定义一个定时任务&#xff0c;每分钟向/tmp/test.txt文件输出hello worldcrontab –e*/1 * * * * echo ‘hello world’>>/tmp/test.txt本节我们来说一下文件和目录…

GPT-3再进化:通过浏览网页来提高事实准确率

作者 | OpenAI来源 | 数据实战派为了让 GPT-3 模型可以更准确地对开放式问题进行回答&#xff0c;研究人员使用了基于文本的网络浏览器对 GPT-3 进行微调。微调后的 WebGPT 模型可以对人类实时回答问题的方法进行学习&#xff0c;比如提交搜索、跟踪链接并上下滚动网页。研究人…

lamp-安装脚本-修订版2

#!/bin/bash #write by zhang_pc #at 2015.08.07 #apache2.4 php.5.4 mysql5.5 #脚本说明&#xff0c;如果脚本所在目录有源码包就用本地的&#xff0c;否则就从互联网下载APR_FILESapr-1.5.2.tar.gz APR_DIRapr-1.5.2 ARP_PRE/usr/local/apr APR_URLhttp://mirror.bit.edu.cn/…

Linux的rc.local自启动服务

linux有自己一套完整的启动体系&#xff0c;抓住了linux启动的脉络&#xff0c;linux的启动过程将不再神秘。本文中假设inittab中设置的init tree为&#xff1a;/etc/rc.d/rc0.d/etc/rc.d/rc1.d/etc/rc.d/rc2.d/etc/rc.d/rc3.d/etc/rc.d/rc4.d/etc/rc.d/rc5.d/etc/rc.d/rc6.d/e…

[日常] Go语言圣经-函数递归习题

练习 5.1&#xff1a; 修改findlinks代码中遍历n.FirstChild链表的部分&#xff0c;将循环调用visit&#xff0c;改成递归调用。 练习 5.2&#xff1a; 编写函数&#xff0c;记录在HTML树中出现的同名元素的次数。 练习 5.3&#xff1a; 编写函数输出所有text结点的内容。注意不…

Centos下安装mysql 总结

一、MySQL安装 Centos下安装mysql 请点开:http://www.centoscn.com/CentosServer/sql/2013/0817/1285.html 二、MySQL的几个重要目录 MySQL安装完成后不象SQL Server默认安装在一个目录&#xff0c;它的数据库文件、配置文件和命令文件分别在不同的目录&#xff0c;了解这些目录…

Linux下的Memcache安装(含libevent的安装)

Linux下Memcache服务器端的安装服务器端主要是安装memcache服务器端&#xff0c;目前的最新版本是 memcached-1.3.0 。下载&#xff1a;http://www.danga.com/memcached/dist/memcached-1.2.2.tar.gz另外&#xff0c;Memcache用到了libevent这个库用于Socket的处理&#xff0c;…

谷歌发布 RLDS,在强化学习生成、共享和使用数据集

编译 | 禾木木 出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 大多数强化学习和序列决策算法都需要智能体与环境的大量交互生成训练数据&#xff0c;以获得最佳性能。这种方法效率很低&#xff0c;尤其是在很难做到这种交互的情况下&#xff0c;比如用真实的机器人…