ジャナ・ビジネス・コンサルティング有限会社トップページへ
/*
 * Berkeley DB XML .NET API
 * 
 * Copyright (C) 2007 Jana Business Consulting Ltd. All rights reserved.
 * 
 * For more information, see http://www.janabiz.com.
 * 
 */

using System;
using System.Collections;
using System.IO;
using System.Threading;
using JanaBiz.Db;
using JanaBiz.DbXml;

public class MutilThread
{
    private int outCount = 0;
    private static Hashtable extMap = new Hashtable();

    public static void Main()
    {
        MutilThread test = new MutilThread();
        test.doReadAndWrite();
    }

    private string getDbxmlName()
    {
        return "DbEnvconcurrentTest.dbxml";
    }

    private string getDocName()
    {
        return "myDocument";
    }

    /// <summary>
    /// Clrears all db files.
    /// </summary>
    /// <param name="home">The home.</param>
    public static void ClrearAllDbFiles(string home)
    {
        extMap.Add(".DLL", true);
        extMap.Add(".EXE", true);
        extMap.Add(".PDB", true);
        extMap.Add(".XML", true);
        extMap.Add(".SH", true);

        string[] files = Directory.GetFiles(home);

        foreach (string file in files) {
            string ext = Path.GetExtension(file).ToUpper();

            if (!extMap.Contains(ext)) {
                File.Delete(file);
            }
        }
    }

    /**
	public void doWrite()
	{
		string dirHome = Directory.GetCurrentDirectory();
		ClrearAllDbFiles(dirHome);
		for(int i=0; i<4; i++)
		{
			ThreadStart threadstart = new ThreadStart(putDoc);
			Thread t1 = new Thread(threadstart);
			t1.Name = "XmlDB-Thread" + (i + 1);
			t1.Start();
			Thread.Sleep(103);
		}			
	}
	**/

    public void doReadAndWrite()
    {
        string dirHome = Directory.GetCurrentDirectory();
        ClrearAllDbFiles(dirHome);

        string dbxmlName = getDbxmlName();
        string docName = getDocName();

        CreatXmlContainer(dbxmlName);

        putADoc(dbxmlName, docName);

        ThreadStart thread1 = new ThreadStart(getDocuments);
        Thread t1 = new Thread(thread1);
        t1.Name = "Thread-getDoc-1";

        ThreadStart thread2 = new ThreadStart(getDocuments_2);
        Thread t2 = new Thread(thread2);
        t2.Name = "Thread-getDoc-2";

        ThreadStart thread3 = new ThreadStart(updateDocuments);
        Thread t3 = new Thread(thread3);
        t3.Name = "Thread-updateDoc-3";

        ThreadStart thread4 = new ThreadStart(updateDocuments_2);
        Thread t4 = new Thread(thread4);
        t4.Name = "Thread-updateDoc-4";

        t1.Start();
        //t2.Start();

        t3.Start();
        t4.Start();
    }


    /// <summary>
    /// put different document  
    /// </summary>
    private void CreatXmlContainer(string dbXmlName)
    {
        DbEnvironment dbEnv = null;
        XmlManager xmlManager1 = null;
        XmlContainer con1 = null;
        try {
            dbEnv = CreateDbEnvironment();

            //XmlManager.SetLogLevel(LogLevel.All, true);
            //XmlManager.SetLogCategory(LogCategory.All, true);

            xmlManager1 = new XmlManager(dbEnv);
            XmlContainerConfig config3 = new XmlContainerConfig();
            config3.AllowCreate = true;
            con1 = xmlManager1.OpenContainer(dbXmlName, config3);
            XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
            for (int i = 0; i < 100; i++) {
                string docName = Thread.CurrentThread.Name + "doc" + i;
                string docContent = "<a>index" + i + "</a>";
                Console.WriteLine(" init put doc:" + docName + ":[" + docContent + "]");

                con1.PutDocument(docName, docContent, up1);
                Thread.Sleep(13);
            }
            up1.Dispose();
            con1.Dispose();
            xmlManager1.Dispose();
        } catch (Exception ex) {
            Console.WriteLine(ex);
        } finally {
            if (con1 != null) {
                con1.Close();
            }
            if (xmlManager1 != null) {
                xmlManager1.Close();
            }
        }
    }

    /// <summary>
    /// put a document 
    /// </summary>
    private void putADoc(string dbXmlName, string docName)
    {
        DbEnvironment dbEnv = null;
        XmlManager xmlManager1 = null;
        XmlContainer con1 = null;
        try {
            dbEnv = CreateDbEnvironment();

            XmlManager.SetLogLevel(LogLevel.All, true);
            XmlManager.SetLogCategory(LogCategory.All, true);

            xmlManager1 = new XmlManager(dbEnv);
            XmlContainerConfig config3 = new XmlContainerConfig();
            config3.AllowCreate = true;
            con1 = xmlManager1.OpenContainer(dbXmlName, config3);
            XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();

            Console.WriteLine(docName);
            con1.PutDocument(docName, "<a>sdfffffff</a>", up1);
            up1.Dispose();
            con1.Dispose();
            xmlManager1.Dispose();
        } catch (Exception ex) {
            Console.WriteLine(ex);
        } finally {
            if (con1 != null) {
                con1.Close();
            }
            if (xmlManager1 != null) {
                xmlManager1.Close();
            }
        }
    }

    /// <summary>
    /// get a document
    /// </summary>
    private void getADoc()
    {
        string dbXmlName = getDbxmlName();
        string docName = getDocName();

        DbEnvironment dbEnv = CreateDbEnvironment();

        XmlManager.SetLogLevel(LogLevel.All, true);
        XmlManager.SetLogCategory(LogCategory.All, true);

        XmlManager xmlManager1 = new XmlManager(dbEnv);
        XmlContainerConfig config3 = new XmlContainerConfig();
        config3.AllowCreate = true;
        XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName, config3);
        XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();

        XmlDocumentConfig dconfig = new XmlDocumentConfig();

        XmlDocument doc = con1.GetDocument(docName, dconfig);
        Console.WriteLine("****get doc ■■" + doc.StringContent);

        up1.Dispose();
        con1.Dispose();
        xmlManager1.Dispose();
    }

    private DbEnvironment CreateDbEnvironment()
    {
        DbEnvironmentConfig dbConfig = new DbEnvironmentConfig();
        dbConfig.AllowCreate = true;
        //dbConfig.ErrorPrefix = "PREFIX ";
        //dbConfig.ErrorWriter = System.Console.Out;

        // you can not specify other parameters
        dbConfig.InitializeCBD = true;
        dbConfig.InitializeCache = true;
        dbConfig.CdbLockAllDatabases = true;

        DbEnvironment dbEnv = new DbEnvironment(Directory.GetCurrentDirectory(), dbConfig);

        return dbEnv;
    }

    /// <summary>
    /// put document to max times
    /// </summary>
    private void updateDocuments()
    {
        string dbXmlName = getDbxmlName();
        string docName = getDocName();

        DbEnvironment dbEnv = CreateDbEnvironment();

        //XmlManager.SetLogLevel(LogLevel.All, true);
        //XmlManager.SetLogCategory(LogCategory.All, true);

        XmlManager xmlManager1 = new XmlManager(dbEnv);
        XmlContainerConfig config3 = new XmlContainerConfig();
        config3.AllowCreate = true;

        XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName, config3);
        XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
        XmlDocumentConfig dconfig = new XmlDocumentConfig();

        for (int i = 0; i < 50; i++) {
            XmlDocument doc = con1.GetDocument(docName, dconfig);

            String origionStr = doc.StringContent;
            doc.StringContent = "<a>update[1] i=" + (i + 1) + "</a>";
            con1.UpdateDocument(doc, up1);
            String line = (outCount++) + "口 updateDocuments()\t" + (i + 1) + "■" + Thread.CurrentThread.Name + "\t■\t";
            line = line + " OrigionStr:[" + origionStr + "] DOC content:" + doc.StringContent + "。終わり。";
            line = line + "\n";
            Console.WriteLine(line);

            doc.Dispose();
            Thread.Sleep(5);
        }
        up1.Dispose();
        con1.Dispose();
        xmlManager1.Dispose();
    }

    /// <summary>
    /// get document to max times
    /// </summary>
    private void getDocuments()
    {
        string dbXmlName = getDbxmlName();
        string docName = getDocName();

        DbEnvironment dbEnv = CreateDbEnvironment();

        //XmlManager.SetLogLevel(LogLevel.All, true);
        //XmlManager.SetLogCategory(LogCategory.All, true);

        XmlManager xmlManager1 = new XmlManager(dbEnv);
        XmlContainerConfig config3 = new XmlContainerConfig();
        config3.AllowCreate = true;

        XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName, config3);
        XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();

        XmlDocumentConfig dconfig = new XmlDocumentConfig();
        for (int i = 0; i < 100; i++) {
            XmlDocument doc = con1.GetDocument(docName, dconfig);
            String line = (outCount++) + ">> getDocuments()\t" + (i + 1) + "■" + Thread.CurrentThread.Name + "\t■\t";
            line = line + " DOC content:" + doc.StringContent + "。終わり。";
            line = line + "\n";
            Console.WriteLine(line);
            Thread.Sleep(1);
        }
        up1.Dispose();
        con1.Dispose();
        xmlManager1.Dispose();
    }


    /// <summary>
    /// put document to max times
    /// </summary>
    private void updateDocuments_2()
    {
        string dbXmlName = getDbxmlName();
        string docName = getDocName();

        DbEnvironment dbEnv = CreateDbEnvironment();

        //XmlManager.SetLogLevel(LogLevel.All, true);
        //XmlManager.SetLogCategory(LogCategory.All, true);

        XmlManager xmlManager1 = new XmlManager(dbEnv);
        XmlContainerConfig config3 = new XmlContainerConfig();
        config3.AllowCreate = true;

        XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName, config3);
        XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();
        XmlDocumentConfig dconfig = new XmlDocumentConfig();


        for (int i = 0; i < 50; i++) {
            XmlDocument doc = con1.GetDocument(docName, dconfig);

            String origionStr = doc.StringContent;
            doc.StringContent = "<a>update[2] i=" + (i + 1) + "</a>";
            con1.UpdateDocument(doc, up1);
            String line = (outCount++) + "口 updateDocuments()\t" + (i + 1) + "■" + Thread.CurrentThread.Name + "\t■\t";
            line = line + " OrigionStr:[" + origionStr + "] DOC content:" + doc.StringContent + "。終わり。";
            line = line + "\n";
            Console.WriteLine(line);
            doc.Dispose();

            Thread.Sleep(4);
        }
        up1.Dispose();
        con1.Dispose();
        xmlManager1.Dispose();
    }


    /// <summary>
    /// get document to max times
    /// </summary>
    private void getDocuments_2()
    {
        string dbXmlName = getDbxmlName();
        string docName = getDocName();

        DbEnvironment dbEnv = CreateDbEnvironment();

        //XmlManager.SetLogLevel(LogLevel.All, true);
        //XmlManager.SetLogCategory(LogCategory.All, true);

        XmlManager xmlManager1 = new XmlManager(dbEnv);
        XmlContainerConfig config3 = new XmlContainerConfig();
        config3.AllowCreate = true;

        XmlContainer con1 = xmlManager1.OpenContainer(dbXmlName, config3);
        XmlUpdateContext up1 = xmlManager1.CreateUpdateContext();

        XmlDocumentConfig dconfig = new XmlDocumentConfig();
        for (int i = 0; i < 100; i++) {
            XmlDocument doc = con1.GetDocument(docName, dconfig);
            String line = (outCount++) + ">> getDocuments()\t" + (i + 1) + "■" + Thread.CurrentThread.Name + "\t■\t";
            line = line + "\n" + " DOC content:" + doc.StringContent + "。終わり。";
            line = line + "\n";
            Console.WriteLine(line);
            Thread.Sleep(2);
        }
        up1.Dispose();
        con1.Dispose();
        xmlManager1.Dispose();
    }
}