Package com.orientechnologies.orient.test.database.auto

Source Code of com.orientechnologies.orient.test.database.auto.MultipleDBTest

/**
* Copyright 2010-2012 Luca Garulli (l.garulli--at--orientechnologies.com)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
*     http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package com.orientechnologies.orient.test.database.auto;

import java.io.IOException;
import java.util.Collections;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.concurrent.*;

import org.testng.Assert;
import org.testng.annotations.*;

import com.orientechnologies.orient.client.db.ODatabaseHelper;
import com.orientechnologies.orient.client.remote.OStorageRemote;
import com.orientechnologies.orient.core.db.ODatabase;
import com.orientechnologies.orient.core.db.ODatabaseInternal;
import com.orientechnologies.orient.core.db.ODatabaseRecordThreadLocal;
import com.orientechnologies.orient.core.db.document.ODatabaseDocumentTx;
import com.orientechnologies.orient.core.id.OClusterPositionFactory;
import com.orientechnologies.orient.core.id.ORID;
import com.orientechnologies.orient.core.record.impl.ODocument;
import com.orientechnologies.orient.core.sql.query.OSQLSynchQuery;
import com.orientechnologies.orient.object.db.OObjectDatabaseTx;

/**
* @author Michael Hiess
*/
public class MultipleDBTest extends DocumentDBBaseTest {

  @Parameters(value = "url")
  public MultipleDBTest(@Optional String url) {
    super(url, "-");
  }

  @BeforeClass
  @Override
  public void beforeClass() throws Exception {
  }

  @BeforeMethod
  @Override
  public void beforeMethod() throws Exception {
  }

  @Test
  public void testObjectMultipleDBsThreaded() throws Exception {
    final int operations_write = 1000;
    final int operations_read = 1;
    final int dbs = 10;

    final Set<String> times = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());

    Set<Future> threads = new HashSet<Future>();
    ExecutorService executorService = Executors.newFixedThreadPool(4);

    for (int i = 0; i < dbs; i++) {

      final String dbUrl = url + i;

      Callable<Void> t = new Callable<Void>() {

        @Override
        public Void call() throws InterruptedException, IOException {
          OObjectDatabaseTx tx = new OObjectDatabaseTx(dbUrl);

          ODatabaseHelper.deleteDatabase(tx, getStorageType());
          ODatabaseHelper.createDatabase(tx, dbUrl, getStorageType());

          try {
            System.out.println("(" + getDbId(tx) + ") " + "Created");

            if (tx.isClosed()) {
              tx.open("admin", "admin");
            }
            tx.getEntityManager().registerEntityClass(DummyObject.class);

            long start = System.currentTimeMillis();
            for (int j = 0; j < operations_write; j++) {
              DummyObject dummy = new DummyObject("name" + j);

              Assert.assertEquals(ODatabaseRecordThreadLocal.INSTANCE.get().getURL(), dbUrl);

              dummy = tx.save(dummy);

              // CAN'T WORK FOR LHPEPS CLUSTERS BECAUSE CLUSTER POSITION CANNOT BE KNOWN
              Assert.assertEquals(((ORID) dummy.getId()).getClusterPosition(), OClusterPositionFactory.INSTANCE.valueOf(j),
                  "RID was " + dummy.getId());

              if ((j + 1) % 20000 == 0) {
                System.out.println("(" + getDbId(tx) + ") " + "Operations (WRITE) executed: " + (j + 1));
              }
            }
            long end = System.currentTimeMillis();

            String time = "(" + getDbId(tx) + ") " + "Executed operations (WRITE) in: " + (end - start) + " ms";
            System.out.println(time);
            times.add(time);

            start = System.currentTimeMillis();
            for (int j = 0; j < operations_read; j++) {
              List<DummyObject> l = tx.query(new OSQLSynchQuery<DummyObject>(" select * from DummyObject "));
              Assert.assertEquals(l.size(), operations_write);

              if ((j + 1) % 20000 == 0) {
                System.out.println("(" + getDbId(tx) + ") " + "Operations (READ) executed: " + j + 1);
              }
            }
            end = System.currentTimeMillis();

            time = "(" + getDbId(tx) + ") " + "Executed operations (READ) in: " + (end - start) + " ms";
            System.out.println(time);
            times.add(time);

            tx.close();

          } finally {
            System.out.println("(" + getDbId(tx) + ") " + "Dropping");
            System.out.flush();
            ODatabaseHelper.deleteDatabase(tx, getStorageType());
            System.out.println("(" + getDbId(tx) + ") " + "Dropped");
            System.out.flush();
          }
          return null;
        }
      };

      threads.add(executorService.submit(t));
    }

    for (Future future : threads)
      future.get();

    System.out.println("Test testObjectMultipleDBsThreaded ended");
  }

  @Test
  public void testDocumentMultipleDBsThreaded() throws Exception {

    final int operations_write = 1000;
    final int operations_read = 1;
    final int dbs = 10;

    final Set<String> times = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());

    Set<Future> results = new HashSet<Future>();
    ExecutorService executorService = Executors.newFixedThreadPool(4);

    for (int i = 0; i < dbs; i++) {

      final String dbUrl = url + i;

      Callable<Void> t = new Callable<Void>() {

        @Override
        public Void call() throws InterruptedException, IOException {
          ODatabaseDocumentTx tx = new ODatabaseDocumentTx(dbUrl);

          ODatabaseHelper.deleteDatabase(tx, getStorageType());
          System.out.println("Thread " + this + " is creating database " + dbUrl);
          System.out.flush();
          ODatabaseHelper.createDatabase(tx, dbUrl, getStorageType());

          try {
            System.out.println("(" + getDbId(tx) + ") " + "Created");
            System.out.flush();

            if (tx.isClosed()) {
              tx.open("admin", "admin");
            }

            long start = System.currentTimeMillis();
            for (int j = 0; j < operations_write; j++) {

              ODocument dummy = new ODocument("DummyObject");
              dummy.field("name", "name" + j);

              Assert.assertEquals(ODatabaseRecordThreadLocal.INSTANCE.get().getURL(), dbUrl);

              dummy = tx.save(dummy);

              // CAN'T WORK FOR LHPEPS CLUSTERS BECAUSE CLUSTER POSITION CANNOT BE KNOWN
              Assert.assertEquals(dummy.getIdentity().getClusterPosition(), OClusterPositionFactory.INSTANCE.valueOf(j), "RID was "
                  + dummy.getIdentity());

              if ((j + 1) % 20000 == 0) {
                System.out.println("(" + getDbId(tx) + ") " + "Operations (WRITE) executed: " + (j + 1));
                System.out.flush();
              }
            }
            long end = System.currentTimeMillis();

            String time = "(" + getDbId(tx) + ") " + "Executed operations (WRITE) in: " + (end - start) + " ms";
            System.out.println(time);
            System.out.flush();

            times.add(time);

            start = System.currentTimeMillis();
            for (int j = 0; j < operations_read; j++) {
              List<DummyObject> l = tx.query(new OSQLSynchQuery<DummyObject>(" select * from DummyObject "));
              Assert.assertEquals(l.size(), operations_write);

              if ((j + 1) % 20000 == 0) {
                System.out.println("(" + getDbId(tx) + ") " + "Operations (READ) executed: " + j + 1);
                System.out.flush();
              }
            }
            end = System.currentTimeMillis();

            time = "(" + getDbId(tx) + ") " + "Executed operations (READ) in: " + (end - start) + " ms";
            System.out.println(time);
            System.out.flush();

            times.add(time);

          } finally {
            tx.close();

            System.out.println("Thread " + this + "  is dropping database " + dbUrl);
            System.out.flush();
            ODatabaseHelper.deleteDatabase(tx, getStorageType());
          }
          return null;
        }
      };

      results.add(executorService.submit(t));
    }

    for (Future future : results)
      future.get();

    System.out.println("Test testDocumentMultipleDBsThreaded ended");
    System.out.flush();
  }

  private String getDbId(ODatabaseInternal tx) {
    if (tx.getStorage() instanceof OStorageRemote)
      return tx.getURL() + " - sessionId: " + ((OStorageRemote) tx.getStorage()).getSessionId();
    else
      return tx.getURL();
  }

}
TOP

Related Classes of com.orientechnologies.orient.test.database.auto.MultipleDBTest

TOP
Copyright © 2018 www.massapi.com. All rights reserved.
All source code are property of their respective owners. Java is a trademark of Sun Microsystems, Inc and owned by ORACLE Inc. Contact coftware#gmail.com.