サービスからデータを取得してデータベースに挿入する必要があります。サービスに関する情報は次のとおりです。サービスからIDを取得し、そのIDに従ってデータを取得する必要があります。この操作は1日に1回行われます。毎日約10.000のIDのデータを挿入する必要があります。IDリストの取得に必要な時間は約20秒で、そのIDのデータの取得は0.5秒から9秒までさまざまです。
私はオプションをしなければなりません:
最初のオプションは次のとおりです。
- Webサービスからすべてのデータを取得し、すべてをリストに保存します<>
- そのリストに対していくつかの操作を行います<>
接続を開くすべてを一度にデータベースに挿入してから、接続を閉じる
コード例:
//Get datafrom service and store it List<> or some collection TestService client = new TestService(); MyClass changedData; List<MyClass> serviceResult = new List<MyClass>(); string[] changedDataIDs = client.GetChangedIDs(); foreach (string id in changedDataIDs) { changedData = client.GetData(id); serviceResult.Add(changedData); } //Make some operttions on that data List<Person> persons = serviceResult.Perons......; //Insert everything into database at once string conString = ".."; OracleConnection con = new OracleConnection(conString); OracleCommand cmd = new OracleCommand("MY_STORED_PROCEDURE", con); //Add parameters cmd.Parameters.Add(new OracleParameter(....)); ......... try { con.Open(); foreach (var item in collection) { //Give values to parameters cmd.Parameters[0] = item.value; cmd.ExecuteNonQuery(); } } finally { con.Close(); }
2番目のオプションは次のとおりです。
- サービスから個別にデータを取得する
- そのデータに対して必要な操作を行う
接続を開き、データベースにデータを挿入して接続を閉じ、手順を繰り返します
コード例:
//Get changed IDs from service TestService client = new TestService(); string[] changedDataIDs = client.GetChangedIDs(); MyClass changedData; Person changedPersonDetails; OracleCommand cmd = new OracleCommand("MY_STORED_PROCEDURE"); //Add parameters cmd.Parameters.Add(new OracleParameter(....)); ......... foreach (string id in changedDataIDs) { //Get data individually from service changedData = client.GetData(id); //Make needed operations on that data changedPersonDetails = changedData.Person.........; //Give values to parameters cmd.Parameters[0] = changedPersonDetails.Contact...; //Open connection insert data to databse close connection //ExecuteCommand is a method ExecuteCommand(cmd); } public int ExecuteCommand(OracleCommand cmd) { int affectedRowCount = 0; OracleConnection con = new OracleConnection(""); cmd.Connection = con; try { con.Open(); affectedRowCount = cmd.ExecuteNonQuery(); } finally { con.Close(); } return affectedRowCount; }
最初のオプションの悪い面はRAMの消費であり、2番目のオプションの悪い面は何度も接続を開いたり閉じたりすることだと思います。List <>に多くのデータを保存すると、メモリ例外が発生するのでしょうか、それともC#で処理されるのでしょうか?どのオプションを使用する必要がありますか?