Skip to content

Commit

Permalink
v11.10.2023.1001 事务查询支持ForUpdate行级锁;优化多租户支持;使用第三代XML模型;增强批量操作能力;优化代码生成器
Browse files Browse the repository at this point in the history
  • Loading branch information
nnhy committed Oct 1, 2023
1 parent 1e0e098 commit a4a68b4
Show file tree
Hide file tree
Showing 16 changed files with 75 additions and 68 deletions.
2 changes: 1 addition & 1 deletion XCode/DataAccessLayer/Common/DbBase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -272,7 +272,7 @@ public virtual String ServerVersion
public Int32 CommandTimeout { get; set; }

/// <summary>性能追踪器</summary>
public ITracer Tracer { get; set; }
public ITracer? Tracer { get; set; }
#endregion

#region 方法
Expand Down
8 changes: 4 additions & 4 deletions XCode/DataAccessLayer/Common/DbSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -524,7 +524,7 @@ public virtual T ExecuteScalar<T>(String sql, CommandType type = CommandType.Tex
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
public virtual DbCommand CreateCommand(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps)
public virtual DbCommand CreateCommand(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps)
{
var cmd = OnCreateCommand(sql, type, ps);
Transaction?.Check(cmd, true);
Expand All @@ -540,7 +540,7 @@ public virtual DbCommand CreateCommand(String sql, CommandType type = CommandTyp
protected virtual DbCommand OnCreateCommand(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps)
{
var cmd = Database.Factory?.CreateCommand();
if (cmd == null) return null;
if (cmd == null) throw new InvalidOperationException();

cmd.CommandType = type;
cmd.CommandText = sql;
Expand Down Expand Up @@ -624,7 +624,7 @@ public virtual Task<Int32> ExecuteAsync(String sql, CommandType type = CommandTy
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns>新增行的自动编号</returns>
public virtual Task<Int64> InsertAndGetIdentityAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps)
public virtual Task<Int64> InsertAndGetIdentityAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps)
{
using var cmd = OnCreateCommand(sql, type, ps);

Expand All @@ -643,7 +643,7 @@ public virtual Task<Int64> InsertAndGetIdentityAsync(String sql, CommandType typ
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
public virtual Task<T> ExecuteScalarAsync<T>(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps)
public virtual Task<T> ExecuteScalarAsync<T>(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps)
{
using var cmd = OnCreateCommand(sql, type, ps);
return ExecuteAsync(cmd, true, async cmd2 =>
Expand Down
8 changes: 4 additions & 4 deletions XCode/DataAccessLayer/Common/IAsyncDbSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ public interface IAsyncDbSession : IDisposable2
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns>总记录数</returns>
Task<Int64> QueryCountAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
Task<Int64> QueryCountAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);

/// <summary>执行SQL查询,返回总记录数</summary>
/// <param name="builder">查询生成器</param>
Expand All @@ -37,7 +37,7 @@ public interface IAsyncDbSession : IDisposable2
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
Task<Int32> ExecuteAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
Task<Int32> ExecuteAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);

/// <summary>执行DbCommand,返回受影响的行数</summary>
/// <param name="cmd">DbCommand</param>
Expand All @@ -49,14 +49,14 @@ public interface IAsyncDbSession : IDisposable2
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
Task<Int64> InsertAndGetIdentityAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
Task<Int64> InsertAndGetIdentityAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);

/// <summary>执行SQL语句,返回结果中的第一行第一列</summary>
/// <typeparam name="T">返回类型</typeparam>
/// <param name="sql">SQL语句</param>
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
Task<T> ExecuteScalarAsync<T>(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
Task<T> ExecuteScalarAsync<T>(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);
#endregion
}
2 changes: 1 addition & 1 deletion XCode/DataAccessLayer/Common/IDatabase.cs
Original file line number Diff line number Diff line change
Expand Up @@ -216,7 +216,7 @@ public interface IDatabase : IDisposable2
/// <summary>创建参数数组</summary>
/// <param name="ps"></param>
/// <returns></returns>
IDataParameter[] CreateParameters(IDictionary<String, Object> ps);
IDataParameter[] CreateParameters(IDictionary<String, Object>? ps);

/// <summary>根据对象成员创建参数数组</summary>
/// <param name="model"></param>
Expand Down
16 changes: 8 additions & 8 deletions XCode/DataAccessLayer/Common/IDbSession.cs
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public interface IDbSession : IDisposable2
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns>记录集</returns>
DataSet Query(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
DataSet Query(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);

/// <summary>执行DbCommand,返回记录集</summary>
/// <param name="cmd">DbCommand</param>
Expand All @@ -94,7 +94,7 @@ public interface IDbSession : IDisposable2
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns>总记录数</returns>
Int64 QueryCount(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
Int64 QueryCount(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);

/// <summary>执行SQL查询,返回总记录数</summary>
/// <param name="builder">查询生成器</param>
Expand All @@ -111,7 +111,7 @@ public interface IDbSession : IDisposable2
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
Int32 Execute(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
Int32 Execute(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);

/// <summary>执行DbCommand,返回受影响的行数</summary>
/// <param name="cmd">DbCommand</param>
Expand All @@ -123,22 +123,22 @@ public interface IDbSession : IDisposable2
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
Int64 InsertAndGetIdentity(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
Int64 InsertAndGetIdentity(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);

/// <summary>执行SQL语句,返回结果中的第一行第一列</summary>
/// <typeparam name="T">返回类型</typeparam>
/// <param name="sql">SQL语句</param>
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
T ExecuteScalar<T>(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
T ExecuteScalar<T>(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);

/// <summary>创建DbCommand</summary>
/// <param name="sql">SQL语句</param>
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
DbCommand CreateCommand(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps);
DbCommand CreateCommand(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps);
#endregion

#region 批量操作
Expand Down Expand Up @@ -170,7 +170,7 @@ public interface IDbSession : IDisposable2
/// <param name="addColumns">要累加更新的字段,默认累加</param>
/// <param name="list">实体列表</param>
/// <returns></returns>
Int32 Update(IDataTable table, IDataColumn[] columns, ICollection<String> updateColumns, ICollection<String> addColumns, IEnumerable<IModel> list);
Int32 Update(IDataTable table, IDataColumn[] columns, ICollection<String>? updateColumns, ICollection<String>? addColumns, IEnumerable<IModel> list);

/// <summary>批量插入或更新</summary>
/// <param name="table">数据表</param>
Expand All @@ -179,7 +179,7 @@ public interface IDbSession : IDisposable2
/// <param name="addColumns">主键已存在时,要累加更新的字段</param>
/// <param name="list">实体列表</param>
/// <returns></returns>
Int32 Upsert(IDataTable table, IDataColumn[] columns, ICollection<String> updateColumns, ICollection<String> addColumns, IEnumerable<IModel> list);
Int32 Upsert(IDataTable table, IDataColumn[] columns, ICollection<String>? updateColumns, ICollection<String>? addColumns, IEnumerable<IModel> list);
#endregion

#region 高级
Expand Down
8 changes: 4 additions & 4 deletions XCode/DataAccessLayer/DAL_DbOperate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -264,7 +264,7 @@ public Task<Int64> InsertAndGetIdentityAsync(String sql)
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns></returns>
public Task<Int32> ExecuteAsync(String sql, CommandType type, params IDataParameter[] ps)
public Task<Int32> ExecuteAsync(String sql, CommandType type, params IDataParameter[]? ps)
{
return ExecuteByCacheAsync(sql, type, ps, (s, t, p) => AsyncSession.ExecuteAsync(s, t, p));
}
Expand All @@ -274,7 +274,7 @@ public Task<Int32> ExecuteAsync(String sql, CommandType type, params IDataParame
/// <param name="type">命令类型,默认SQL文本</param>
/// <param name="ps">命令参数</param>
/// <returns>新增行的自动编号</returns>
public Task<Int64> InsertAndGetIdentityAsync(String sql, CommandType type, params IDataParameter[] ps)
public Task<Int64> InsertAndGetIdentityAsync(String sql, CommandType type, params IDataParameter[]? ps)
{
return ExecuteByCacheAsync(sql, type, ps, (s, t, p) => AsyncSession.InsertAndGetIdentityAsync(s, t, p));
}
Expand Down Expand Up @@ -412,7 +412,7 @@ private TResult QueryByCache<T1, T2, T3, TResult>(T1 k1, T2 k2, T3 k3, Func<T1,
Append(sb, k3);
key = sb.Put(true);

if (cache.TryGetValue<TResult>(key, out var value)) return value;
if (cache.TryGetValue<TResult>(key, out var value)) return value!;
}

Interlocked.Increment(ref _QueryTimes);
Expand Down Expand Up @@ -525,7 +525,7 @@ private async Task<TResult> QueryByCacheAsync<T1, T2, T3, TResult>(T1 k1, T2 k2,
Append(sb, k3);
key = sb.Put(true);

if (cache.TryGetValue<TResult>(key, out var value)) return value;
if (cache.TryGetValue<TResult>(key, out var value)) return value!;
}

Interlocked.Increment(ref _QueryTimes);
Expand Down
3 changes: 2 additions & 1 deletion XCode/DataAccessLayer/DAL_Mapper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -230,7 +230,7 @@ public Task<T> ExecuteScalarAsync<T>(String sql, Object? param = null) =>
}

private ConcurrentDictionary<Type, String> _keyMaps = new();
private String OnGetKeyName(Type type)
private String? OnGetKeyName(Type type)
{
if (GetKeyName == null) return null;

Expand Down Expand Up @@ -285,6 +285,7 @@ public Int32 Insert(IModel data, IDataTable table, IDataColumn[]? columns = null
UseParameter = true
};
var sql = builder.GetSql(Db, table, columns, data);
if (sql.IsNullOrEmpty()) return 0;

return ExecuteByCache(sql, "", builder.Parameters, (s, t, p) => Session.Execute(s, CommandType.Text, p));
}
Expand Down
24 changes: 12 additions & 12 deletions XCode/DataAccessLayer/Database/DaMeng.cs
Original file line number Diff line number Diff line change
Expand Up @@ -101,7 +101,7 @@ public override String FormatValue(IDataColumn field, Object? value)
/// <param name="value">值</param>
/// <param name="type">类型</param>
/// <returns></returns>
public override IDataParameter CreateParameter(String name, Object value, Type type = null)
public override IDataParameter CreateParameter(String name, Object? value, Type? type = null)
{
//var type = field?.DataType;
if (type == null)
Expand Down Expand Up @@ -232,16 +232,16 @@ public override Task<Int64> QueryCountFastAsync(String tableName)
if (p >= 0 && p < tableName.Length - 1) tableName = tableName[(p + 1)..];
tableName = tableName.ToUpper();

var owner = (Database as DaMeng).Owner;
if (owner.IsNullOrEmpty()) owner = (Database as DaMeng).User;
var owner = (Database as DaMeng)!.Owner;
if (owner.IsNullOrEmpty()) owner = (Database as DaMeng)!.User;
owner = owner.ToUpper();

// 某些表没有聚集索引,导致查出来的函数为零
var sql = $"select NUM_ROWS from all_tables where OWNER='{owner}' and TABLE_NAME='{tableName}'";
return ExecuteScalarAsync<Int64>(sql);
}

public override async Task<Int64> InsertAndGetIdentityAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps)
public override async Task<Int64> InsertAndGetIdentityAsync(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps)
{
BeginTransaction(IsolationLevel.Serializable);
try
Expand All @@ -264,16 +264,16 @@ public override async Task<Int64> InsertAndGetIdentityAsync(String sql, CommandT
/// <param name="type"></param>
/// <param name="ps"></param>
/// <returns></returns>
protected override DbCommand OnCreateCommand(String sql, CommandType type = CommandType.Text, params IDataParameter[] ps)
protected override DbCommand OnCreateCommand(String sql, CommandType type = CommandType.Text, params IDataParameter[]? ps)
{
var cmd = base.OnCreateCommand(sql, type, ps);
if (cmd == null) return null;
//if (cmd == null) return null;

// 如果参数Value都是数组,那么就是批量操作
if (ps != null && ps.Length > 0 && ps.All(p => p.Value is IList))
{
var arr = ps.First().Value as IList;
cmd.SetValue("ArrayBindCount", arr.Count);
if (ps.First().Value is IList arr)
cmd.SetValue("ArrayBindCount", arr.Count);
cmd.SetValue("BindByName", true);

// 超时时间放大10倍
Expand Down Expand Up @@ -456,20 +456,20 @@ public String Owner
get
{
var owner = Database.Owner;
if (owner.IsNullOrEmpty()) owner = (Database as DaMeng).User;
if (owner.IsNullOrEmpty()) owner = (Database as DaMeng)!.User;

return owner;
}
}

/// <summary>用户名</summary>
public String UserID => (Database as DaMeng).User.ToUpper();
public String UserID => (Database as DaMeng)!.User.ToUpper();

/// <summary>取得所有表构架</summary>
/// <returns></returns>
protected override List<IDataTable> OnGetTables(String[] names)
{
DataTable dt = null;
DataTable? dt = null;

// 不缺分大小写,并且不是保留字,才转大写
if (names != null)
Expand All @@ -480,7 +480,7 @@ protected override List<IDataTable> OnGetTables(String[] names)
}

// 采用集合过滤,提高效率
String tableName = null;
String? tableName = null;
if (names != null && names.Length == 1) tableName = names.FirstOrDefault();
if (tableName.IsNullOrEmpty()) tableName = null;

Expand Down
10 changes: 4 additions & 6 deletions XCode/Entity/EntityExtend.cs
Original file line number Diff line number Diff line change
@@ -1,6 +1,4 @@
using System;
using System.Collections.Generic;
using System.Runtime.Serialization;
using System.Runtime.Serialization;
using System.Web.Script.Serialization;
using System.Xml.Serialization;
using NewLife.Reflection;
Expand All @@ -15,7 +13,7 @@ public class EntityExtend
[XmlIgnore, ScriptIgnore, IgnoreDataMember]
public Int32 Expire { get; set; }

private Dictionary<String, CacheItem> _cache;
private Dictionary<String, CacheItem>? _cache;

/// <summary>实例化一个不区分键大小写的实体扩展</summary>
public EntityExtend()
Expand All @@ -28,7 +26,7 @@ public EntityExtend()
/// <param name="key">键</param>
/// <param name="func">获取值的委托,该委托以键作为参数</param>
/// <returns></returns>
public virtual T Get<T>(String key, Func<String, T> func = null)
public virtual T? Get<T>(String key, Func<String, T>? func = null)
{
//if (func == null) throw new ArgumentNullException(nameof(func));
if (key == null) return default;
Expand Down Expand Up @@ -59,7 +57,7 @@ public virtual T Get<T>(String key, Func<String, T> func = null)

var value = func(key);

if (!Equals(value, default(T))) dic[key] = new CacheItem(value, Expire);
if (!Equals(value, default(T))) dic[key] = new CacheItem(value!, Expire);

return value;
}
Expand Down
14 changes: 8 additions & 6 deletions XCode/Entity/EntityQueue.cs
Original file line number Diff line number Diff line change
Expand Up @@ -41,10 +41,10 @@ public class EntityQueue : DisposeBase
public Int32 Speed { get; private set; }

/// <summary>链路追踪</summary>
public ITracer Tracer { get; set; } = DAL.GlobalTracer;
public ITracer? Tracer { get; set; } = DAL.GlobalTracer;

private TimerX _Timer;
private String _lastTraceId;
private TimerX? _Timer;
private String? _lastTraceId;
#endregion

#region 构造
Expand Down Expand Up @@ -119,7 +119,7 @@ public Boolean Add(IEntity entity, Int32 msDelay)
/// <summary>当前缓存个数</summary>
private Int32 _count;

private void Work(Object state)
private void Work(Object? state)
{
var list = new List<IEntity>();
var n = 0;
Expand Down Expand Up @@ -181,6 +181,8 @@ private void Work(Object state)
private void Process(Object state)
{
var list = state as ICollection<IEntity>;
if (list == null) return;

var ss = Session;

var speed = Speed;
Expand Down Expand Up @@ -233,7 +235,7 @@ private void Process(Object state)
// 最大间隔
if (p > 5000) p = 5000;

if (p != Period)
if (p != Period && _Timer != null)
{
Period = p;
_Timer.Period = p;
Expand All @@ -249,7 +251,7 @@ private void Process(Object state)
}

// 马上再来一次,以便于连续处理数据
_Timer.SetNext(-1);
_Timer?.SetNext(-1);
}

/// <summary>处理一批数据。插入或更新</summary>
Expand Down
Loading

0 comments on commit a4a68b4

Please sign in to comment.