Browse Source

连接池改动,整体微调

yct 7 years ago
parent
commit
e525d65fa7

+ 11 - 9
App.txt

@@ -31,7 +31,7 @@
     <add key="ClientSettingsProvider.ServiceUri" value="" />
     <!--PLC基本配置-->
     <!--<add key="PLC_ip_address" value="192.168.0.10" />-->
-    <add key="PLC_ip_address" value="127.0.0.1" />
+    <add key="PLC_ip_address" value="192.168.0.1" />
     <add key="PLC_port" value="30000" />
     <add key="PLC_station" value="1" />
     <add key="PLC_start_address" value="0" />
@@ -59,18 +59,20 @@
     <add key="wheelbase_status_address" value="87" />
     <!--激光设备配置-->
     <add key="laser_start_address" value="10" />
-    <add key="laser1_status_address" value="89" />
-    <!--决定激光编号-->
+    <add key="laser1_status_address" value="89" /><!--决定激光编号-->
     <add key="laser_rescan_count" value="3" />
     <add key="laser_countdown" value="100" />
+    <!--缓冲位配置-->
+    <add key ="bufferAddress" value ="7"/>
+    <add key ="completeStatusAddress" value ="9"/>
     <!--队列线程参数-->
     <add key="fetch_store_ratio" value="3" />
     <add key="licenseTime" value="10" />
     <add key="userTime" value="10" />
     <add key="bookTime" value="120" />
     <!--上位机(Web线程)IP地址及配置serverScoket的端口-->
-    <add key="WebConfig" value="192.168.111.254:9000" />
-    <!--<add key ="WebConfig" value="192.168.0.197:9000"/>-->
+    <add key="WebConfig" value="192.168.0.164:9000" />
+    <!--<add key ="WebConfig" value="127.0.0.1:9000"/>-->
 
     <!--车库入口-->
     <add key="parkingEntX" value="0" />
@@ -82,11 +84,11 @@
 
     <!--号牌机ip位置映射表-->
     <!--位置编号;基点横坐标;车位宽度;宽度补偿-->
-    <add key="192.168.0.20" value="1" />
-    <add key="192.168.0.21" value="2" />
+    <add key="192.168.0.50" value="2" />
+    <add key="192.168.0.51" value="1" />
     <add key="filterRatio" value="0.7" />
-    <!--车库基本信息-->
-    <add key ="garageID" value ="1"/>
+    <!--车库权重-->
+    <add key="garageID" value="7"/>
     <add key ="bufferCount" value ="2"/>
     <add key="xWeight" value="1"/>
     <add key="yWeight" value="1"/>

+ 2 - 0
parkMonitor/Database2/AbstractCommand.cs

@@ -125,6 +125,8 @@ namespace parkMonitor.Database2
                 if(conn != null)
                 {
                     conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
+
                 }
             }
             return result;

+ 43 - 10
parkMonitor/Database2/ConnectionPoolManager.cs

@@ -54,6 +54,7 @@ namespace parkMonitor.Database2
                 if (conn.mySqlConnFlag)
                 {
                     bq.Enqueue(conn);
+                    Console.WriteLine("连接成功入队");
                 }
             }
             return bq;
@@ -65,21 +66,37 @@ namespace parkMonitor.Database2
         public static Connection GetConnection(BlockingQueue bq)
         {
             Connection connection = (Connection)bq.Dequeue();
-            if (!CheckConnection(connection, bq)) 
+            if (!CheckConnection(connection, bq))
             {
                 connection.mySqlConnFlag = false;
+                while (!connection.mySqlConnFlag)
+                {
+
+                    connection.Dispose();
+                    AddConnToPooling(1, remoteConf);
+                    connection = (Connection)bq.Dequeue();
+                }
             }
-            while (!connection.mySqlConnFlag)
-            {
-                connection = (Connection)bq.Dequeue();
-            }
+            Console.WriteLine("连接成功出队");
             return connection;
         }
-        public static Connection GetConnection(BlockingQueue bq,int millisecondsTimeout)
+        public static Connection GetConnection(BlockingQueue bq, int millisecondsTimeout)
         {
             object conn = null;
+            Connection connection = null;            
             bq.Dequeue(out conn, millisecondsTimeout);
-            return (Connection) conn;
+            connection = (Connection)conn;
+            Console.WriteLine("连接出队检测");
+            Console.WriteLine("输入参数连接池个数:" + bq.Count());
+            if (!CheckConnection(connection, bq))
+            {
+                CheckConnPooling(2, 10, remoteConf, bq);
+                bq.Dequeue(out conn, millisecondsTimeout);
+                connection = (Connection)conn;
+            }
+            Console.WriteLine("连接成功出队");
+            Console.WriteLine("输入参数连接池个数:" + bq.Count());
+            return connection;
         }
         /// <summary>
         /// 移除连接
@@ -122,7 +139,7 @@ namespace parkMonitor.Database2
             if (total == 0)
             {
                 Console.WriteLine("请工作人员检查数据库是否开启,网络是否通畅!等待50秒");
-                Thread.Sleep(5000);
+                //Thread.Sleep(5000);
                 //在此可以切换数据库
             }
             else
@@ -145,6 +162,19 @@ namespace parkMonitor.Database2
         /// <param name="bq"></param>
         public static void ReleaseConnection(Connection conn, BlockingQueue bq)
         {
+            Connection temp = null;
+            //for (int i = 0; i < bq.Count(); i++)
+            //{
+            //    temp = (Connection)bq.Dequeue();
+            //    if (temp != null && temp.mySqlConnection != null && temp.mySqlConnection.ServerThread <= conn.mySqlConnection.ServerThread-100)
+            //    {
+            //        return;
+            //    }
+            //    else
+            //    {
+            //        bq.Enqueue(temp);
+            //    }
+            //}
             bq.Enqueue(conn);
         }
         public static bool CheckConnection(Connection conn, BlockingQueue bq)
@@ -159,13 +189,16 @@ namespace parkMonitor.Database2
                 {
                     int r = Convert.ToInt32(result);
                     isUseful = true;
-                    //Console.WriteLine("连接测试正常");
+                    Console.WriteLine("连接测试正常");
                 }
                 ReleaseConnection(conn, bq);
+                Console.WriteLine("连接检测成功,重新入队");
             }
             catch (Exception ex)
             {
                 conn.Dispose();
+                AddConnToPooling(1,remoteConf);
+                Console.WriteLine("连接检测失败,重新添加一个连接入队");
                 isUseful = false;
                 Console.WriteLine(ex.Message);
             }
@@ -176,7 +209,7 @@ namespace parkMonitor.Database2
         /// </summary>
         public static void CloseAll(BlockingQueue bq)
         {
-            if (bq!=null)
+            if (bq != null)
             {
                 while (bq.Count() > 0)
                 {

+ 140 - 128
parkMonitor/Database2/DBOperation.cs

@@ -26,14 +26,7 @@ namespace parkMonitor.Database2
             MySqlDataReader reader = null;
             int garageFreeSpace = 0;
             string sql = "select * from garage where garageID = '" + garageID + "'";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
@@ -56,10 +49,13 @@ namespace parkMonitor.Database2
                             Console.WriteLine("车位剩余数查无结果");
                         }
                     }
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message + "查询剩余车位异常");
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
                 }
                 finally
                 {
@@ -67,8 +63,7 @@ namespace parkMonitor.Database2
                     {
                         reader.Close();
                         reader.Dispose();
-                    }
-                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    }                    
                 }
             }
             return garageFreeSpace; ;
@@ -84,14 +79,7 @@ namespace parkMonitor.Database2
             Dictionary<int, Parking_Space> lps = new Dictionary<int, Parking_Space>();
             MySqlDataReader reader = null;
             string sql = "select * from parkingspace where garageID = '" + garageID + "' ";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
@@ -117,11 +105,14 @@ namespace parkMonitor.Database2
                             lps.Add(ps.parkingSpaceID, (Parking_Space)ps.Clone());
                         }
                     }
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
                     return lps;
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message + "查询车位表异常");
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
                 }
                 finally
                 {
@@ -129,8 +120,7 @@ namespace parkMonitor.Database2
                     {
                         reader.Close();
                         reader.Dispose();
-                    }
-                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    }                   
                 }
             }
             return null;
@@ -146,14 +136,7 @@ namespace parkMonitor.Database2
             Vehicle v = new Vehicle();
             MySqlDataReader reader = null;
             string sql = "select * from vehicle where numberPlate = '" + numberPlate + "'";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
@@ -177,14 +160,17 @@ namespace parkMonitor.Database2
                             v.parkingSpaceID = parkingSpaceID;
                             v.garageID = garageID;
                             v.frontwheelbase = frontwheelbase;
-                            v.rearwheelbase = rearwheelbase;
-                            return v;
+                            v.rearwheelbase = rearwheelbase;                           
                         }
                     }
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    return v;
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message + "查询车辆表异常");
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
                 }
                 finally
                 {
@@ -192,8 +178,7 @@ namespace parkMonitor.Database2
                     {
                         reader.Close();
                         reader.Dispose();
-                    }
-                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    }                   
                 }
             }
             return null;
@@ -209,14 +194,7 @@ namespace parkMonitor.Database2
             Parking_Space ps = new Parking_Space();
             MySqlDataReader reader = null;
             string sql = "select * from parkingspace where parkingSpaceID = '" + parkingSpaceID + " '";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
@@ -235,14 +213,17 @@ namespace parkMonitor.Database2
                             ps.parkingSpaceID = parkingSpaceID;
                             ps.parkingSpaceX = reader.GetInt32("parkingSpaceX");
                             ps.parkingSpaceY = reader.GetInt32("parkingSpaceY");
-                            ps.parkingSpaceZ = reader.GetInt32("parkingSpaceZ");
-                            return ps;
+                            ps.parkingSpaceZ = reader.GetInt32("parkingSpaceZ");                            
                         }
                     }
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    return ps;
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message + "查询车位表获取x,y,z异常");
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
                 }
                 finally
                 {
@@ -250,8 +231,7 @@ namespace parkMonitor.Database2
                     {
                         reader.Close();
                         reader.Dispose();
-                    }
-                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    }                    
                 }
             }
             return null;
@@ -266,14 +246,7 @@ namespace parkMonitor.Database2
         {
             bool isTelRegister = false;
             string sql = "select * from user where userTelephone = '" + tel + "'";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
@@ -293,14 +266,13 @@ namespace parkMonitor.Database2
                     {
                         isTelRegister = false;
                     }
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message + "检测电话号码注册异常");
-                }
-                finally
-                {
-                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
                 }
             }
             return isTelRegister;
@@ -316,14 +288,7 @@ namespace parkMonitor.Database2
             int parkingRecordsID = 0;
             MySqlDataReader reader = null;
             string sql = "select parkingRecordsID from parkingrecords where numberPlate = '" + numberPlate + "' and parkingRecordsState = 3";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
@@ -346,10 +311,13 @@ namespace parkMonitor.Database2
                             Console.WriteLine("停车记录id查无结果");
                         }
                     }
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message + "查询停车记录id异常");
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
                 }
                 finally
                 {
@@ -357,8 +325,7 @@ namespace parkMonitor.Database2
                     {
                         reader.Close();
                         reader.Dispose();
-                    }
-                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    }                   
                 }
             }
             return parkingRecordsID;
@@ -375,14 +342,7 @@ namespace parkMonitor.Database2
         {
             bool isNumberPlate = true;
             string sql = "select * from parkingrecords where numberPlate = '" + numberPlate + "' and parkingRecordsState = 3 and garageID = '" + garageID + "'";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
@@ -402,14 +362,13 @@ namespace parkMonitor.Database2
                     {
                         isNumberPlate = false;
                     }
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message + "检测车库中车辆异常");
-                }
-                finally
-                {
-                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
                 }
             }
             return isNumberPlate;
@@ -424,14 +383,7 @@ namespace parkMonitor.Database2
         {
             bool isNumberPlateFromVehicle = true;
             string sql = "select * from vehicle where numberPlate = '" + numberPlate + "' and vehiclepParkState = 1";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
@@ -451,14 +403,13 @@ namespace parkMonitor.Database2
                     {
                         isNumberPlateFromVehicle = false;
                     }
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message + "检测车辆表车辆号牌异常");
-                }
-                finally
-                {
-                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
                 }
             }
             return isNumberPlateFromVehicle;
@@ -472,23 +423,25 @@ namespace parkMonitor.Database2
         public void UpdateVehicleParkState(BlockingQueue bq, string numberPlate, int vehiclepParkState)
         {
             string sql = "update vehicle set vehiclepParkState = '" + vehiclepParkState + "'where numberPlate = '" + numberPlate + "'";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
             }
             else
             {
-                DBAccess access = new DBAccess(sql, conn, CommandTypes.NOQUERYCOMMAND);
-                object result = access.GetResult();
-                ConnectionPoolManager.ReleaseConnection(conn, bq);
+                try
+                {
+                    DBAccess access = new DBAccess(sql, conn, CommandTypes.NOQUERYCOMMAND);
+                    object result = access.GetResult();
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine(ex.Message+"更新车辆状态失败");
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
+                }
             }
         }
         /// <summary>
@@ -500,23 +453,25 @@ namespace parkMonitor.Database2
         public void UpdateParkingSpaceState(BlockingQueue bq, int parkingSpaceID, int parkingSpaceState)
         {
             string sql = "update parkingspace set parkingSpaceState = '" + parkingSpaceState + "'where parkingSpaceID = '" + parkingSpaceID + "'";
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
             }
             else
             {
-                DBAccess access = new DBAccess(sql, conn, CommandTypes.NOQUERYCOMMAND);
-                object result = access.GetResult();
-                ConnectionPoolManager.ReleaseConnection(conn, bq);
+                try
+                {
+                    DBAccess access = new DBAccess(sql, conn, CommandTypes.NOQUERYCOMMAND);
+                    object result = access.GetResult();
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine(ex.Message+"更新车位状态失败");
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
+                }
             }
         }
         /// <summary>
@@ -528,14 +483,7 @@ namespace parkMonitor.Database2
         public static int InsertParkingRecords(BlockingQueue bq, List<string> strs)
         {
             int parkingRecordsID = 0;
-            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-            int i = 0;
-            while (conn == null && i < 2)
-            {
-                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
-                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
-                i++;
-            }
+            Connection conn = CreateConnAndGetValidConn(bq);
             if (conn == null)
             {
                 Console.WriteLine("请检查网络!等待网络修复超时");
@@ -543,18 +491,17 @@ namespace parkMonitor.Database2
             else
             {
                 DBAccess access = new DBAccess(null, conn, CommandTypes.TRANSACTIONCOMMAND);
-                TransactionResult transactionResult = access.DealTransaction(strs);               
+                TransactionResult transactionResult = access.DealTransaction(strs);
                 try
                 {
                     parkingRecordsID = transactionResult.result;
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
                 }
                 catch (Exception ex)
                 {
                     Console.WriteLine(ex.Message + "停车记录ID获取失败");
-                }
-                finally
-                {
-                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
                 }
             }
             return parkingRecordsID;
@@ -571,6 +518,7 @@ namespace parkMonitor.Database2
             int i = 0;
             while (conn == null && i < 2)
             {
+                Console.WriteLine("为从连接池获取连接--------->UpdateTransaction" + i);
                 ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
                 conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
                 i++;
@@ -581,9 +529,19 @@ namespace parkMonitor.Database2
             }
             else
             {
-                DBAccess access = new DBAccess(null, conn, CommandTypes.TRANSACTIONCOMMAND);
-                TransactionResult transactionResult = access.DealTransaction(strs);
-                flag = transactionResult.flag;
+                try
+                {
+                    DBAccess access = new DBAccess(null, conn, CommandTypes.TRANSACTIONCOMMAND);
+                    TransactionResult transactionResult = access.DealTransaction(strs);
+                    flag = transactionResult.flag;
+                    ConnectionPoolManager.ReleaseConnection(conn, bq);
+                }
+                catch (Exception ex)
+                {
+                    Console.WriteLine(ex.Message+"更新事务失败");
+                    conn.Dispose();
+                    ConnectionPoolManager.AddConnToPooling(1, ConnectionPoolManager.remoteConf);
+                }
             }
             return flag;
         }
@@ -696,5 +654,59 @@ namespace parkMonitor.Database2
         //    }
         //    return result;
         //}
+
+        private static Connection CreateConnAndGetValidConn(BlockingQueue bq)
+        {
+            Connection conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
+            int i = 0;
+            while (conn == null && i < 2)
+            {
+                Console.WriteLine("为从连接池获取连接--------->InsertParkingRecords" + i);
+                ConnectionPoolManager.CheckConnPooling(2, 10, ConnectionPoolManager.remoteConf, bq);
+                conn = ConnectionPoolManager.GetConnection(bq, TIMEOUT);
+                i++;
+            }
+            return conn;
+        }
+
+        public static void KillTimeOutConnection(string ip, int TimeOut, BlockingQueue bq)
+        {
+            object result = null;
+            string ipmohu = "'%" + ip + "%'";
+            string sql = null;
+            List<string> killidlist = new List<string>();
+            if (ip == null)
+            {
+                sql = "select concat('KILL ',id,';') from information_schema.processlist where Time > " + @TimeOut;
+            }
+            else
+            {
+                sql = "select concat('KILL ',id,';') from information_schema.processlist where host like" + @ipmohu + " and Time >= " + @TimeOut;
+            }
+            DBAccess dba = new DBAccess();
+            dba.sql = sql;
+            dba.conn = CreateConnAndGetValidConn(bq);
+            dba.commType = CommandTypes.QUERYCOMMAND;
+            if (dba.conn != null)
+            {
+                result = dba.GetResult();
+
+            }
+            MySqlDataReader rdr = (MySqlDataReader)result;
+            while (rdr.Read())
+            {
+                killidlist.Add((string)rdr[0]);
+            }
+            rdr.Close();
+            foreach (string str in killidlist)
+            {
+                //Console.WriteLine(str);
+                dba.sql = str;
+                dba.commType = CommandTypes.NOQUERYCOMMAND;
+                dba.GetResult();
+            }
+            dba.conn.Dispose();
+        }
+
     }
 }

+ 1 - 1
parkMonitor/Database2/DatabaseConnPoolFactory.cs

@@ -17,7 +17,7 @@ namespace parkMonitor.Database2
             {
                 conn = new MySql.Data.MySqlClient.MySqlConnection(connectionString);
                 conn.Open();
-                //Console.WriteLine("连接成功");
+                Console.WriteLine("连接成功");
                 connection.mySqlConnection = conn;
                 connection.mySqlConnFlag = true;
                 connection.state = conn.State;

+ 2 - 2
parkMonitor/entity/EntityForCore.cs

@@ -102,8 +102,8 @@ namespace parkMonitor.entity
             }
             if (DBmode == 0 || DBmode == 2)
             {
-                ConnectionPoolManager.CloseAll(localBQ);
-                localBQ = ConnectionPoolManager.InitConnPooling(10, ConnectionPoolManager.localConf);
+                //ConnectionPoolManager.CloseAll(localBQ);
+                //localBQ = ConnectionPoolManager.InitConnPooling(10, ConnectionPoolManager.localConf);
             }
             //车位管理初始化
             Log.WriteLog(LogType.NOT_DATABASE, LogFile.LOG, "初始化车位");

+ 36 - 12
parkMonitor/server/CoreThread/AbstractCmd.cs

@@ -233,16 +233,16 @@ namespace parkMonitor.server.CoreThread
                         return;
                     }
                 }
-                else
-                {
-                    //复原已释放的车位
-                    if (!ParkingSpaceManager.ins.SetParkingSpace(parkingSpaceID, 1))
-                    {
-                        EntityForCore.ins.globalStatus = false;
-                        Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "车位分配出现异常,需要重启");
-                        return;
-                    }
-                }
+                //else
+                //{
+                //    //复原已释放的车位
+                //    if (!ParkingSpaceManager.ins.SetParkingSpace(parkingSpaceID, 1))
+                //    {
+                //        EntityForCore.ins.globalStatus = false;
+                //        Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "车位分配出现异常,需要重启");
+                //        return;
+                //    }
+                //}
             }
             else
             {
@@ -819,6 +819,12 @@ namespace parkMonitor.server.CoreThread
                             List<string> strs = new List<string>();
                             strs.Add(insertRecordSql);
                             parkingRecordsID = DBOperation.InsertParkingRecords(EntityForCore.remoteBQ, strs);
+                            int i = 0;
+                            while (parkingRecordsID == 0 && i < 2)
+                            {
+                                parkingRecordsID = DBOperation.InsertParkingRecords(EntityForCore.remoteBQ, strs);
+                                i++;
+                            }
                             if (parkingRecordsID == 0)
                             {
                                 //数据库操作失败写日志
@@ -845,6 +851,12 @@ namespace parkMonitor.server.CoreThread
                             strs.Add(updateFreeSpaceSql);
                             strs.Add(updateVehicleSql);
                             bool result = DBOperation.UpdateTransaction(EntityForCore.remoteBQ, strs);
+                            int i = 0;
+                            while (!result && i < 2)
+                            {
+                                result = DBOperation.UpdateTransaction(EntityForCore.remoteBQ, strs);
+                                i++;
+                            }
                             if (!result)
                             {
                                 //数据库操作失败写日志
@@ -881,7 +893,7 @@ namespace parkMonitor.server.CoreThread
                         }
                         catch (Exception ex)
                         {
-                            Console.WriteLine(ex.Message + "插入停车记录表失败");                          
+                            Console.WriteLine(ex.Message + "插入停车记录表失败");
                         }
                         string updateParkingSpaceStateSql = "";
                         string updateFreeSpaceSql = "";
@@ -907,7 +919,7 @@ namespace parkMonitor.server.CoreThread
                         }
                         catch (Exception ex)
                         {
-                            Console.WriteLine(ex.Message + "停车事务处理失败");                          
+                            Console.WriteLine(ex.Message + "停车事务处理失败");
                         }
                     }
                 }
@@ -1014,6 +1026,12 @@ namespace parkMonitor.server.CoreThread
             else
             {
                 vehiclelist = oper.GetVehicle(EntityForCore.remoteBQ, queueCmd.LicenseNum);
+                int i = 0;
+                while (vehiclelist == null && i < 2)
+                {
+                    vehiclelist = oper.GetVehicle(EntityForCore.remoteBQ, queueCmd.LicenseNum);
+                    i++;
+                }
             }
             if (vehiclelist == null)
             {
@@ -1140,6 +1158,12 @@ namespace parkMonitor.server.CoreThread
                             strs.Add(updateVehicleStateSql);
                             strs.Add(updateParkingRecordsSql);
                             bool result = DBOperation.UpdateTransaction(EntityForCore.remoteBQ, strs);
+                            int i = 0;
+                            while (!result && i < 2)
+                            {
+                                result = DBOperation.UpdateTransaction(EntityForCore.remoteBQ, strs);
+                                i++;
+                            }
                             if (!result)
                             {
                                 //写日志记录sql,以待之后处理

+ 2 - 2
parkMonitor/server/CoreThread/CoreThreadTest2.cs

@@ -14,7 +14,6 @@ using parkMonitor.tools;
 using parkMonitor.Database2;
 using MySql.Data.MySqlClient;
 using parkMonitor.server.CoreThread;
-using System.Threading;
 
 namespace parkMonitor.server.CoreThread
 {
@@ -109,7 +108,7 @@ namespace parkMonitor.server.CoreThread
         /// </summary>
         public void BeginWorking()
         {
-            Timer checkRemoteTimer = new System.Threading.Timer(CheckRemotePool, null, 10000, 300000);
+            Timer checkRemoteTimer = new System.Threading.Timer(CheckRemotePool, null, 3600000, 3600000);
             //Timer checkLocalTimer = new System.Threading.Timer(CheckLocalPool, null, 10000, 300000);
             //Timer logTimer = new System.Threading.Timer(displayLog, null, 1000, 30000);
             Object lockObj = new object();
@@ -288,6 +287,7 @@ namespace parkMonitor.server.CoreThread
         private void CheckRemotePool(object o)
         {
             ConnectionPoolManager.CheckConnPooling(3, 10, ConnectionPoolManager.remoteConf, EntityForCore.remoteBQ);
+            DBOperation.KillTimeOutConnection(ConnectionPoolManager.remoteConf, 3600, EntityForCore.remoteBQ);
         }
         private void CheckLocalPool(object o)
         {

+ 24 - 5
parkMonitor/server/CoreThread/SpaceManager.cs

@@ -50,15 +50,33 @@ namespace parkMonitor.server.CoreThread
                         zWeight = Convert.ToDouble(ConfigurationManager.AppSettings["zWeight"]);
                     }
                     catch { UILogServer.ins.error("无法获得车位权重,请检查配置"); Log.WriteLog(LogType.NOT_DATABASE, LogFile.ERROR, "无法获得车位权重"); return false; }
+                    int i = 0;
                     if (garageID != 0)
                     {
-                        parkingSpaceStatusMap = oper.GetAllParkingSpace(EntityForCore.remoteBQ, garageID);
+                        while (((parkingSpaceStatusMap == null || parkingSpaceStatusMap.Count==0) && i++ < 2))
+                        {
+                            parkingSpaceStatusMap = oper.GetAllParkingSpace(EntityForCore.remoteBQ, garageID);
+                        }
+                        if (i >= 2)
+                        {
+                            parkingSpaceStatusMap = null;
+                            return false;
+                        }
                     }
-                    else
+                    else 
                     {
                         parkingSpaceStatusMap = null;
                         return false;
                     }
+                    //if (garageID != 0)
+                    //{
+                    //    parkingSpaceStatusMap = oper.GetAllParkingSpace(EntityForCore.remoteBQ, garageID);
+                    //}
+                    //else
+                    //{
+                    //    parkingSpaceStatusMap = null;
+                    //    return false;
+                    //}
                     //车位校验,与PLC车位数据核对
                     Log.WriteLog(LogType.NOT_DATABASE, LogFile.INFO, "车位表缓存成功");
                     return true;
@@ -212,7 +230,7 @@ namespace parkMonitor.server.CoreThread
                 Dictionary<int, Parking_Space>.Enumerator enumer = parkingSpaceStatusMap.GetEnumerator();
                 while (enumer.MoveNext())
                 {
-                    if (enumer.Current.Value!=null && enumer.Current.Value.parkingSpaceState == 0) { count += 1; }
+                    if (enumer.Current.Value != null && enumer.Current.Value.parkingSpaceState == 0) { count += 1; }
                 }
             }
             return count;
@@ -228,7 +246,7 @@ namespace parkMonitor.server.CoreThread
             Parking_Space temp = null;
             while (enumer.MoveNext())
             {
-                if (enumer.Current.Value!=null && enumer.Current.Value.parkingSpaceState == 2 && enumer.Current.Value.licence == license)
+                if (enumer.Current.Value != null && enumer.Current.Value.parkingSpaceState == 2 && enumer.Current.Value.licence == license)
                 {
                     temp = (Parking_Space)(enumer.Current.Value.Clone());
                 }
@@ -254,7 +272,8 @@ namespace parkMonitor.server.CoreThread
             parkingEntY = entY;
             parkingEntZ = entZ;
         }
-        public CEntrance() : this(0, 0, 0)
+        public CEntrance()
+            : this(0, 0, 0)
         {
 
         }

+ 9 - 2
parkMonitor/server/NumMachine/NumMachine.cs

@@ -778,12 +778,19 @@ namespace parkMonitor.server
         public static NumMachineLinker ins;
         public AbstractMessage GetMessage()
         {
-            return ins.GetMessage();
+            if (ins != null)
+            {
+                return ins.GetMessage();
+            }
+            return null;
         }
 
         public void SetMessage(AbstractMessage message)
         {
-            ins.SetMessage(message);
+            if (ins != null)
+            {
+                ins.SetMessage(message);
+            }
         }
 
         public void Start()

+ 13 - 13
parkMonitor/server/PLCLinker/PLCLinker.cs

@@ -758,19 +758,19 @@ namespace parkMonitor.server
                 }
             });
 
-            //模拟plc与激光自动操作
-            Task.Factory.StartNew(() =>
-            {
-                laserAnim();
-            });
-            Task.Factory.StartNew(() =>
-            {
-                wheelbaseAnim();
-            });
-            Task.Factory.StartNew(() =>
-            {
-                autoCycling();
-            });
+            ////模拟plc与激光自动操作
+            //Task.Factory.StartNew(() =>
+            //{
+            //    laserAnim();
+            //});
+            //Task.Factory.StartNew(() =>
+            //{
+            //    wheelbaseAnim();
+            //});
+            //Task.Factory.StartNew(() =>
+            //{
+            //    autoCycling();
+            //});
         }
 
         /// <summary>