ジャナ・ビジネス・コンサルティング有限会社トップページへ
/*
 * 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 JanaBiz.DbXml;
using JanaBiz.Db;
//using Bridge;
using System.IO;
using System.Threading;
using System.Collections;

public class MutilThread
{
    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)
        {
            System.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();
    }
            
}