C#国外购买游戏点卡卡 批量生成 怎么实现

 上传我的文档
 下载
 收藏
该文档贡献者很忙,什么也没留下。
 下载此文档
如何使用C#实现QQ号码的批量申请
下载积分:100
内容提示:如何使用C#实现QQ号码的批量申请
文档格式:PDF|
浏览次数:95|
上传日期: 00:49:36|
文档星级:
全文阅读已结束,如果下载本文需要使用
 100 积分
下载此文档
该用户还上传了这些文档
如何使用C#实现QQ号码的批量申请
关注微信公众号在实际项目开发中,业务逻辑层的处理速度往往很快,特别是在开发Socket通信服务的时候,网络传输很快,但是一旦加上数据库操作,性能一落千丈,数据库操作的效率往往成为一个系统整体性能的瓶颈。面对这问题,我们怎么办呢?好,下面我就为大家介绍一种方法:构建SQL池,分离业务逻辑层和数据访问层,让业务逻辑层从低效的数据库操作解脱,以提高系统整体性能。
(一)SQL池
  SQL池是SQL容器,用于存放业务逻辑层抛过来的SQL语句。SQL池主要提供以下几种方法:
1)internal string Pop(),从池中取出SQL。
2)internal void Push(string item),增加一个SQL到池中。
3)internal string[] Clear(),清空SQL池,清空前,返回SQL池中所有SQL语句。
  特别提醒一下,SQL池是面向多线程的,所以必须对公共资源SQL采取锁机制。这里采用互斥锁,当业务逻辑层线程往SQL池中抛入SQL语句时,禁止SQL执行线程执行SQL语句,反之,当SQL执行线程执行SQL语句时,也不允许业务逻辑层线程往SQL池中抛入SQL语句。为什么要这么做?因为SQL执行线程是批量执行SQL语句,在批量执行SQL语句前,会从池中取出所有SQL语句,如果此时业务逻辑层线程往SQL池中抛入SQL语句,则会导致这些SQL语句丢失,得不到执行。
  下面是SQL池代码:
using System.Collections.G
using System.L
using System.T
using System.T
namespace Test1
&&& sealed class SQLPool
&&&&&&& //互斥锁
&&&&&&& public static Mutex mutexSQLPool = new Mutex();
&&&&&&& //SQL池
&&&&&&& Stack&string&
&&&&&&& /// &summary&
&&&&&&& /// 初始化SQL池
&&&&&&& /// &/summary&
&&&&&&& internal SQLPool()
&&&&&&&&&&& this.pool = new Stack&string&();
&&&&&&& /// &summary&
&&&&&&& /// 获取SQL池数量
&&&&&&& /// &/summary&
&&&&&&& internal Int32 Count
&&&&&&&&&&& get { return this.pool.C }
&&&&&&& /// &summary&
&&&&&&& /// 从池中取出SQL
&&&&&&& /// &/summary&
&&&&&&& /// &returns&&/returns&
&&&&&&& internal string Pop()
&&&&&&&&&&& lock (this.pool)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& return this.pool.Pop();
&&&&&&&&&&& }
&&&&&&& /// &summary&
&&&&&&& /// 增加一个SQL到池中
&&&&&&& /// &/summary&
&&&&&&& /// &param name=&item&&&/param&
&&&&&&& internal void Push(string item)
&&&&&&&&&&& if (item.Trim() == &&)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& throw new ArgumentNullException(&Items added to a SQLPool cannot be null&);
&&&&&&&&&&& }
&&&&&&&&&&& //此处向SQL池中push SQL必须与Clear互斥
&&&&&&&&&&& mutexSQLPool.WaitOne();
&&&&&&&&&&& try
&&&&&&&&&&& {
&&&&&&&&&&&&&&& this.pool.Push(item);&&& //此处如果出错,则不会执行ReleaseMutex,将会死锁
&&&&&&&&&&& }
&&&&&&&&&&& catch
&&&&&&&&&&& {&
&&&&&&&&&&& }
&&&&&&&&&&& mutexSQLPool.ReleaseMutex();
&&&&&&& /// &summary&
&&&&&&& /// 清空SQL池
&&&&&&& /// 清空前,返回SQL池中所有SQL语句,
&&&&&&& /// &/summary&
&&&&&&& internal string[] Clear()
&&&&&&&&&&& string[] array = new string[] { };
&&&&&&&&&&& //此处必须与Push互斥
&&&&&&&&&&& mutexSQLPool.WaitOne();
&&&&&&&&&&& try
&&&&&&&&&&& {
&&&&&&&&&&&&&&& array = this.pool.ToArray();&&&& //此处如果出错,则不会执行ReleaseMutex,将会死锁
&&&&&&&&&&&&&&& this.pool.Clear();
&&&&&&&&&&& }
&&&&&&&&&&& catch
&&&&&&&&&&& {&
&&&&&&&&&&& }
&&&&&&&&&&& mutexSQLPool.ReleaseMutex();
&&&&&&&&&&&
(二)SQL池管理
  SQL池管理主要用于管理SQL池,向业务逻辑层线程和SQL执行线程提供接口。
  业务逻辑层线程调用 public void PushSQL(string strSQL) 方法,用于向SQL池抛入SQL语句。
  SQL执行线程调用 public void ExecuteSQL(object obj) 方法,用于批量执行SQL池中的SQL语句。
  注意,SQL池管理类采用单例模型,为什么要采用单例模型?因为SQL池只能存在一个实例,无论是业务逻辑层线程还是SQL执行线程,仅会操作这一个实例,否则,将会导致SQL池不唯一,SQL执行无效。
  下面是SQL池管理类代码:
using System.Collections.G
using System.L
using System.T
namespace Test1
&&& class SQLPoolManage
&&&&&&& //单例模型
&&&&&&& public static readonly SQLPoolManage sqlPoolManage = new SQLPoolManage();
&&&&&&& #region 属性
&&&&&&& SQLPool poolOfSQL;
&&&&&&& #endregion
&&&&&&& #region 构造函数
&&&&&&& /// &summary&
&&&&&&& /// 初始化
&&&&&&& /// &/summary&
&&&&&&& public SQLPoolManage()
&&&&&&&&&&& this.poolOfSQL = new SQLPool();
&&&&&&& #endregion
&&&&&&& #region 方法
&&&&&&& /// &summary&
&&&&&&& /// 将SQL语句加入SQL池中
&&&&&&& /// &/summary&
&&&&&&& /// &param name=&strSQL&&&/param&
&&&&&&& public void PushSQL(string strSQL)
&&&&&&&&&&& this.poolOfSQL.Push(strSQL);
&&&&&&& /// &summary&
&&&&&&& /// 每隔一段时间,触发ExecuteSQL
&&&&&&& /// ExecuteSQL用于执行SQL池中的SQL语句
&&&&&&& /// &/summary&
&&&&&&& /// &param name=&obj&&&/param&
&&&&&&& public void ExecuteSQL(object obj)
&&&&&&&&&&& if (this.poolOfSQL.Count & 0)
&&&&&&&&&&& {
&&&&&&&&&&&&&&& string[] array = this.poolOfSQL.Clear();
&&&&&&&&&&&&&&& //遍历array,执行SQL
&&&&&&&&&&&&&&& for (int i = 0; i & array.L i++)
&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&& if (array[i].ToString().Trim() != &&)
&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&& try
&&&&&&&&&&&&&&&&&&&&&&& {
&&&&&&&&&&&&&&&&&&&&&&&&&&& //数据库操作
&&&&&&&&&&&&&&&&&&&&&&&&&&& //......
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&&&&&& catch
&&&&&&&&&&&&&&&&&&&&&&& {&
&&&&&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&&&&&& }
&&&&&&&&&&&&&&& }
&&&&&&&&&&& }
&&&&&&& #endregion
(三)定时触发SQL执行线程
  总结有以下三种方法,具体请参见:
方法一:调用线程执行方法,在方法中实现死循环,每个循环Sleep设定时间;
方法二:使用System.Timers.Timer类;
方法三:使用System.Threading.Timer;
  代码如下:
using System.Collections.G
using System.L
using System.T
using System.T
namespace Test1
&&& class Program
&&&&&&& static void Main(string[] args)
&&&&&&&&&&& //向SQL池中抛入SQL语句
&&&&&&&&&&& SQLPoolManage.sqlPoolManage.PushSQL(&delete from tbl_test where id = 1&);
&&&&&&&&&&& //定时触发SQL执行线程
&&&&&&&&&&& System.Threading.Timer threadTimer = new System.Threading.Timer(new System.Threading.TimerCallback(SQLPoolManage.sqlPoolManage.ExecuteSQL), null, 0, 100);
&&&&&&&&&&& Console.ReadLine();
本文已收录于以下专栏:
相关文章推荐
在实际项目开发中,业务逻辑层的处理速度往往很快,特别是在开发Socket通信服务的时候,网络传输很快,但是一旦加上数据库操作,性能一落千丈,数据库操作的效率往往成为一个系统整体性能的瓶颈。面对这问题,...
在实际项目开发中,业务逻辑层的处理速度往往很快,特别是在开发Socket通信服务的时候,网络传输很快,但是一旦加上数据库操作,性能一落千丈,数据库操作的效率往往成为一个系统整体性能的瓶颈。面对这问题,...
度往往很快,特别是在开发Socket通信服务的时候,网络传输很快,但是一旦加上数据库操作,性能一落千丈,数据库操作的效率往往成为一个系统整体性能的瓶颈。面对这问题,我们怎么办呢?好,下面我就为大家介绍...
最近遇到一个数据库存储过程多线程运算的问题,按照常规的做法,是写一个程序,在程序内多线程执行业务逻辑,这样做也不是不可以,但有以下不便:
1.开发周期长,在存储过程中实现的业务逻辑,...
首先至少要引用的文件using System.C
using System.C
using System.D
using System.Data...
案例:工具方法:public static Connection getConnection(){
Class.forName("com.mysql...
他的最新文章
讲师:李江龙
讲师:司徒正美
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)窗体添加背景图片后 快速移动卡_c#吧_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0成为超级会员,使用一键签到本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:113,388贴子:
窗体添加背景图片后 快速移动卡收藏
产销量连年位于国内喷码机行业前列!
什么原因?
没人。。。
你都没描述清楚,你是说快速移动时,有不连续的感觉么?如果说的是这个,我只想说GDI和GDI+就这样,如果你用winform做,由于他的图形库是GDI+,这种情况无法避免,因为GDI+可以说没有图形渲染能力,没人用它做游戏。。。
登录百度帐号推荐应用C#批量生成大数据量无重复随机数据的另类高效实现 - blue1000 - 博客园
我是BK,不断成长,不愿辜负任何对我保有期盼的人...
posts - 35, comments - 97, trackbacks - 1, articles - 2
注:本文思路已经应用于“”中,有兴趣的朋友可以下载试用。我们知道,如果需要批量生成海量无重复的随机数据是个很麻烦的事情。如果每次生成都要和之前生成的数据进行比对的话,那效率会随着数据量的增大而越来越低,最后不堪忍受。今天介绍一种另类的思路,可以高效的做到随机数据无重复。分析:所谓随机数据,就是在某个设定的区间内随机提取一批数据出来。那么我们可以变通的思考一下:我们可不可以将此设定的数据区间A按照所需的数据量N分成N个小的数据区间B,如果这样的话,我们只需要每次从数据区间B中取一个随机值,并且不需要验证是否重复,就可以很容易的得到N个唯一的数据。而这些数据集也是随机的,只不过是稍微带有一定的均布特性。这里有个问题,按照以上的思路取出的数据虽然是随机的,但是还是按照从小到大的顺序排列,这是个遗憾。解决办法:获取到随机数据集合后,使用洗牌算法对数据进行打乱处理。实现代码:using&Susing&System.Collections.Gusing&System.Lusing&System.Tnamespace&DataGenerator.DataObject{&&&&public&class&RandomData&:&DynamicDataBase&&&&{&&&&&&&&private&Random&m_&&&&&&&&private&List&string&&m_&&&&&&&&private&long&m_lastN&&&&&&&&private&long&m_&&&&&&&&private&char&m_padS&&&&&&&&public&override&string&GetDataByIndex(int&index)&&&&&&&&{&&&&&&&&&&&&return&m_codes[index];&&&&&&&&}&&&&&&&&public&override&void&Reset(int&count)&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&//初始化m_fromNum;根据生成数量设置m_span值&&&&&&&&&&&&try&&&&&&&&&&&&{&&&&&&&&&&&&&&&&//m_fromNum&=&0;&&&&&&&&&&&&&&&&//char[]&cs&=&FromStr.ToArray();&&&&&&&&&&&&&&&&//int&&&&&&&&&&&&&&&&&//for&(int&i&=&0;&i&&&cs.L&i++)&&&&&&&&&&&&&&&&//{&&&&&&&&&&&&&&&&//&&&&idx&=&CharList.IndexOf(cs[i]);&&&&&&&&&&&&&&&&//&&&&m_fromNum&+=&Convert.ToInt32(idx&*&Math.Pow(CharList.Length,&cs.Length&-&i&-&1));&&&&&&&&&&&&&&&&//}&&&&&&&&&&&&&&&&//m_lastNum&=&m_fromNum&-&1;&&&&&&&&&&&&&&&&m_lastNum&=&-1L;&&&&&&&&&&&&&&&&//测试最后一个生成的最小数值是否越界&&&&&&&&&&&&&&&&int&idx&=&count&-&1;&&&&&&&&&&&&&&&&if&(idx.ToString().Length&&&Length)&&&&&&&&&&&&&&&&&&&&throw&new&Exception("数量超出长度界限");&&&&&&&&&&&&&&&&//该数据长度下的最大值&&&&&&&&&&&&&&&&long&maxV&=&Math.Pow(CharList.Length,&Length)&-&1&&&long.MaxValue&?&long.MaxValue&:&(long)(Math.Pow(CharList.Length,&Length)&-&1);&&&&&&&&&&&&&&&&if&(maxV&&&idx)&&&&&&&&&&&&&&&&&&&&throw&new&Exception();&&&&&&&&&&&&&&&&//m_span&=&(maxV&-&idx)&/&&&&&&&&&&&&&&&&&//数据余量初始化&&&&&&&&&&&&&&&&m_span&=&maxV&-&&&&&&&&&&&&&&&&&&//补齐字符初始化&&&&&&&&&&&&&&&&m_padStr&=&CharList.ToCharArray()[0];&&&&&&&&&&&&&&&&//初始化数据集合&&&&&&&&&&&&&&&&m_codes&=&null;&&&&&&&&&&&&}&&&&&&&&&&&&catch&&&&&&&&&&&&{&&&&&&&&&&&&&&&&throw&new&Exception("随机码起始值或生成数量越界!尝试调整生成数量、数据长度、起始字符串等设置后再试。");&&&&&&&&&&&&}&&&&&&&&}&&&&&&&&public&void&PrepareCodes(int&count)&&&&&&&&{&&&&&&&&&&&&//m_codes&=&new&List&string&(count);&&&&&&&&&&&&string[]&source&=&new&string[count];&&&&&&&&&&&&for&(int&i&=&0;&i&&&&i++)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&source[i]&=&GenerateCode(i,&count);&&&&&&&&&&&&}&&&&&&&&&&&&m_codes&=&new&List&string&(Shuffle&string&(source));&&&&&&&&&&&&source&=&null;&&&&&&&&}&&&&&&&&private&IEnumerable&T&&Shuffle&T&(IEnumerable&T&&source)&&&&&&&&{&&&&&&&&&&&&m_ro&=&new&Random();&&&&&&&&&&&&T[]&elements&=&source.ToArray();&&&&&&&&&&&&for&(int&i&=&elements.Length&-&1;&i&&&0;&i--)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&int&swapIndex&=&m_ro.Next(i&+&1);&&&&&&&&&&&&&&&&yield&return&elements[swapIndex];&&&&&&&&&&&&&&&&elements[swapIndex]&=&elements[i];&&&&&&&&&&&&}&&&&&&&&&&&&yield&return&elements[0];&&&&&&&&}&&&&&&&&private&string&GenerateCode(int&index,&int&count)&&&&&&&&{&&&&&&&&&&&&long&num2&=&DateTime.Now.Ticks&+&&&&&&&&&&&&&m_ro&=&new&Random(((int)(((ulong)num2)&&&0xffffffffL))&|&((int)(num2&&&&index)));&&&&&&&&&&&&//本次可以使用的最大余量&&&&&&&&&&&&long&s&=&m_span&/&(count&-&index);&&&&&&&&&&&&&&&&&&&&&&&&//本次使用的余量&&&&&&&&&&&&s&=&m_ro.Next(s&+&1&&&int.MaxValue&?&int.MaxValue&:&(int)(s&+&1));&&&&&&&&&&&&//余量减少&&&&&&&&&&&&m_span&-=&s;&&&&&&&&&&&&//记录最近一次使用的数值&&&&&&&&&&&&m_lastNum&+=&1&+&s;&&&&&&&&&&&&long&position&=&m_lastN&&&&&&&&&&&&StringBuilder&sb&=&new&StringBuilder();&&&&&&&&&&&&int&yushu&=&0;&&&&&&&&&&&&while&(position&&=&CharList.Length)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&yushu&=&(int)(position&%&CharList.Length);&&&&&&&&&&&&&&&&sb.Append(CharList.Substring(yushu,&1));&&&&&&&&&&&&&&&&position&=&(position&-&yushu)&/&CharList.L&&&&&&&&&&&&}&&&&&&&&&&&&sb.Append(CharList.Substring((int)position,&1));&&&&&&&&&&&&return&(new&string(sb.ToString().Reverse&char&().ToArray())).PadLeft(Length,&m_padStr);&&&&&&&&}&&&&&&&&public&void&Dispose()&&&&&&&&{&&&&&&&&&&&&if(m_ro&!=&null)&&&&&&&&&&&&&&&&m_ro&=&null;&&&&&&&&&&&&if&(m_codes&!=&null)&&&&&&&&&&&&&&&&m_codes&=&null;&&&&&&&&}&&&&&&&&public&override&string&ToString()&&&&&&&&{&&&&&&&&&&&&return&string.Format("&字符集:{0},长度:{1},起始:{2}&",&CharList,&Length,&FromStr);&&&&&&&&}&&&&}}}

我要回帖

更多关于 游戏点卡购买平台 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信