加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

实现异步多线程查询

发布时间:2020-12-15 08:00:27 所属栏目:Java 来源:网络整理
导读:本事例以oracle为测试?TASK、Thread、Parallel.ForEach三种方法实现 Task是依赖于CPU的,如果你的CPU是多核的,Task效率相对要高些 如果是单核的,Task没有什么优势 using DataBaseTest.DataBase; using System; using System.Collections.Generic; using Sy

本事例以oracle为测试?TASK、Thread、Parallel.ForEach三种方法实现

Task是依赖于CPU的,如果你的CPU是多核的,Task效率相对要高些
如果是单核的,Task没有什么优势

using DataBaseTest.DataBase;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

using System.Runtime.Caching;
using System.Diagnostics;
using System.Data.Entity.Infrastructure;
using System.Threading;
using System.IO;
using Oracle.ManagedDataAccess.Client;
using System.Data;
using System.Reflection;

namespace DataBaseTest
{
    class Program
    {
       static private List<BOARD_VEHICLE_DAY_INFOEntity> list = new List<BOARD_VEHICLE_DAY_INFOEntity>();
        static void Main(string[] args)
        {
            Stopwatch watch = Stopwatch.StartNew();
            watch.Start();
            var sq1 = @"SELECT T.PASSKEY,T.PLATENO,T.PLATECOLOR,T.SPOTTINGTOTAL,T.PASSING_COUNT,T.PASSINGXTSPOT_MAX_COUNT,NULL AS SPOTTINGPASSINFO,T.TIMESTAGE1,T.TIMESTAGE2,T.TIMESTAGE3,T.TIMESTAGE4,T.TIMESTAGE5,T.TIMESTAGE6,T.TIMESTAGE7,T.TIMESTAGE8,T.TIMESTAGE9,T.TIMESTAGE10,T.TIMESTAGE11,T.TIMESTAGE12,T.TIMESTAGE13,T.TIMESTAGE14,T.TIMESTAGE15,T.TIMESTAGE16,T.TIMESTAGE17,T.TIMESTAGE18,T.TIMESTAGE19,T.TIMESTAGE20,T.TIMESTAGE21,T.TIMESTAGE22,T.TIMESTAGE23,T.TIMESTAGE24,T.TIME FROM BOARD_VEHICLE_DAY_INFO T WHERE T.TIME >= TO_DATE(‘2019/7/2 0:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘) AND T.TIME <= to_date(‘2019/7/2 0:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘)";
            var sq2 = @"SELECT T.PASSKEY,T.TIME FROM BOARD_VEHICLE_DAY_INFO T WHERE T.TIME >= TO_DATE(‘2019/7/3 0:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘) AND T.TIME <= to_date(‘2019/7/3 0:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘)";
            var sq3 = @"SELECT T.PASSKEY,T.TIME FROM BOARD_VEHICLE_DAY_INFO T WHERE T.TIME >= TO_DATE(‘2019/7/4 0:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘) AND T.TIME <= to_date(‘2019/7/4 0:00:00‘,‘YYYY-MM-DD HH24:MI:SS‘)";
            DateTime TBstart = Convert.ToDateTime("2019-07-01 00:00:00").Date;
            List<string> sqllist = new List<string>();
            sqllist.Add(sq1);
            sqllist.Add(sq2);
            sqllist.Add(sq3);
            #region TASK实现
#if false
            Task wt1 = Task.Run(() =>
            {
                //myOracleConnect.getConn();
                //var sq1 = @"SELECT T.PASSKEY,‘YYYY-MM-DD HH24:MI:SS‘)";
                //List<BOARD_VEHICLE_DAY_INFOEntity> list1 = myOracleConnect.ExecuteList<BOARD_VEHICLE_DAY_INFOEntity>(sq1,CommandType.Text,null);
                //list.InsertRange(0,list1);
                test(sq1);
            });

            Task wt2 = Task.Run(() =>
            {
                test(sq2);
                //myOracleConnect.getConn();
                //var sq2 = @"SELECT T.PASSKEY,‘YYYY-MM-DD HH24:MI:SS‘)";
                //List<BOARD_VEHICLE_DAY_INFOEntity> list2 = myOracleConnect.ExecuteList<BOARD_VEHICLE_DAY_INFOEntity>(sq2,list2);
            });
            Task wt3 = Task.Run(() =>
            {
                test(sq3);
                //myOracleConnect.getConn();
                //var sq3 = @"SELECT T.PASSKEY,‘YYYY-MM-DD HH24:MI:SS‘)";
                //List<BOARD_VEHICLE_DAY_INFOEntity> list3 = myOracleConnect.ExecuteList<BOARD_VEHICLE_DAY_INFOEntity>(sq3,list3);
            });
            var wtasks = new Task[] { wt1,wt2,wt3 };
            Task.WaitAll(wtasks);
#endif
            #endregion

            #region Thread实现
#if false
            new Thread(() =>
            {
                test(sq1);
            })
            { IsBackground = true }.Start();
            new Thread(() =>
            {
                test(sq2);
            })
            { IsBackground = true }.Start();
            new Thread(() =>
            {
                test(sq3);
            })
            { IsBackground = true }.Start();

            Thread.Sleep(10000);
#endif
            #endregion

            #region Parallel.ForEach
#if false
            var rnd = new Random();
            Parallel.ForEach(sqllist,item =>
            {
                test(item);
                int delay;
                Monitor.Enter(rnd);
                delay = rnd.Next(1,1001);
                Monitor.Exit(rnd);
                Thread.Sleep(delay);
            });
#endif
            #endregion



            watch.Stop();
            Console.WriteLine(string.Format("耗时:{0},数据总数{1}",formatDuring(watch.ElapsedMilliseconds),list.Count));
            Console.ReadKey();
        }
        public static void test(string sql)
        {
            MyOracleConnect myOracleConnect = new MyOracleConnect();
            myOracleConnect.getConn();
            List<BOARD_VEHICLE_DAY_INFOEntity> list1 = myOracleConnect.ExecuteList<BOARD_VEHICLE_DAY_INFOEntity>(sql,null);
            list.InsertRange(0,list1);
        }
        public static String formatDuring(long mss)
        {
            long days = mss / (1000 * 60 * 60 * 24);
            long hours = (mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60);
            long minutes = (mss % (1000 * 60 * 60)) / (1000 * 60);
            long seconds = (mss % (1000 * 60)) / 1000;
            return days + "" + hours + "小时" + minutes + "分钟" + seconds + "";
        }
      
    }
}

?

数据连接?数据库引用Oracle.ManagedDataAccess.dll

using Oracle.ManagedDataAccess.Client;
using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace DataBaseTest
{
    class MyOracleConnect
    {
        private OracleConnection conn = null;

        public void getConn()
        {
            string connString = "Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=ip)(PORT=1521))" +
                                "(CONNECT_DATA=(SERVICE_NAME=ORCL)));Persist Security Info=True;User ID=用户名;Password=密码;";
            conn = new OracleConnection(connString);
            if (conn != null)
            {
                try
                {
                    conn.Open();
                    Console.WriteLine("数据库连接成功");
                }
                catch (System.Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }

        }
        public void CloseConn()
        {
            if (conn != null && conn.State == ConnectionState.Open)
            {
                conn.Close();
                conn = null;
            }
        }
        public  DataTable getSelect(string commandText,params OracleParameter[] param)
        {
            DataTable result = new DataTable();
            try
            {
                using (OracleCommand cmd = new OracleCommand(commandText,conn))
                {
                    if (param != null)
                        cmd.Parameters.AddRange(param);
                    try
                    {
                        OracleDataAdapter adapter = new OracleDataAdapter(cmd);
                        adapter.Fill(result);
                    }
                    catch (Exception ex)
                    {
                        result = null;
                    }
                }
            }
            finally
            {
                CloseConn();
            }
            return result;
        }
        /// <summary>  
        /// 执行返回多条记录的泛型集合对象  
        /// </summary>  
        /// <typeparam name="T">泛型类型</typeparam>  
        /// <param name="commandText">Oracle语句或存储过程名</param>  
        /// <param name="commandType">Oracle命令类型</param>  
        /// <param name="param">Oracle命令参数数组</param>  
        /// <returns>泛型集合对象</returns>  
        public List<T> ExecuteList<T>(string commandText,CommandType commandType,params OracleParameter[] param) where T : new()
        {
            List<T> list = new List<T>();
            DataTable dt = new DataTable();
            try
            {
                using (OracleCommand cmd = new OracleCommand(commandText,conn))
                {
                    if (param != null)
                        cmd.Parameters.AddRange(param);
                    try
                    {
                        OracleDataAdapter adapter = new OracleDataAdapter(cmd);
                        adapter.Fill(dt);
                        list = ConvertToModel<T>(dt);
                    }
                    catch (Exception ex)
                    {

                    }
                }
            }
            finally
            {
                CloseConn();
            }
            return list;
        }
        /// <summary>
        /// 将DataTable数据源转换成实体类
        /// </summary>
        public  List<T> ConvertToModel<T>(DataTable dt) where T : new()
        {
            List<T> ts = new List<T>();// 定义集合
            foreach (DataRow dr in dt.Rows)
            {
                T t = new T();
                PropertyInfo[] propertys = t.GetType().GetProperties();// 获得此模型的公共属性
                foreach (PropertyInfo pi in propertys)
                {
                    if (dt.Columns.Contains(pi.Name))
                    {
                        if (!pi.CanWrite) continue;
                        var value = dr[pi.Name];
                        try
                        {
                            if (value != DBNull.Value && value != null && value.ToString() != "")
                            {
                                if (pi.PropertyType.FullName.ToUpper().Contains("DECIMAL"))
                                {
                                    pi.SetValue(t,decimal.Parse(value.ToString()),null);
                                }
                                else if (pi.PropertyType.FullName.ToUpper().Contains("DOUBLE"))
                                {
                                    pi.SetValue(t,double.Parse(value.ToString()),null);
                                }
                                else if (pi.PropertyType.FullName.ToUpper().Contains("INT32"))
                                {
                                    pi.SetValue(t,int.Parse(value.ToString()),null);
                                }
                                else if (pi.PropertyType.FullName.ToUpper().Contains("INT16"))
                                {
                                    pi.SetValue(t,short.Parse(value.ToString()),null);
                                }
                                else
                                    pi.SetValue(t,value,null);

                            }
                        }
                        catch (Exception ex)
                        {
                            //throw ex;
                        }

                    }
                }
                ts.Add(t);
            }
            return ts;
        }      
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读