/**
  * 本测试展示了如何用LtCache给LtDb提高性能
  */
 public function testPerformance()
 {
     /**
      * 配置数据库连接信息
      */
     $dcb = new LtDbConfigBuilder();
     $dcb->addSingleHost(array("adapter" => "mysql", "username" => "test", "password" => "", "dbname" => "test"));
     /**
      * 实例化组件入口类
      */
     $db = new LtDb();
     $db->configHandle->addConfig(array("db.servers" => $dcb->getServers()));
     $db->init();
     /**
     * 用法 1: 直接操作数据库
     
     * 优点:学习成本低,快速入门
     
     * 适用场景:
          1. 临时写个脚本操作数据库,不想花时间学习LtDb的查询引擎
          2. 只写少量脚本,不是一个完整持续的项目,不需要SqlMap来管理SQL语句
     */
     $dbh = $db->getDbHandle();
     $dbh->query("DROP TABLE IF EXISTS test_user");
     $dbh->query("\n\t\t\tCREATE TABLE test_user (\n\t\t\tid INT NOT NULL AUTO_INCREMENT,\n\t\t\tname VARCHAR( 20 ) NOT NULL ,\n\t\t\tage INT NOT NULL ,\n\t\t\tPRIMARY KEY ( id ) \n\t\t)");
     /**
     * 用法 2: 使用Table Gateway查询引擎
     * 
     * 优点:自动生成SQL语句
     * 
     * 适用场景:
          1. 对数据表进行增简单的删查改操作,尤其是单条数据的操作
     *      2. 简单的SELECT,动态合成WHERE子句
     */
     $tg = $db->getTDG("test_user");
     /**
      * 运行100次,要求在1秒内运行完
      */
     $base_memory_usage = memory_get_usage();
     $times = 100;
     $startTime = microtime(true);
     for ($i = 0; $i < $times; $i++) {
         $tg->insert(array("id" => $i, "name" => "lotusphp", "age" => 1));
     }
     $dbh->query("DROP TABLE IF EXISTS test_user");
     $endTime = microtime(true);
     $totalTime = round($endTime - $startTime, 6);
     $averageTime = round($totalTime / $times, 6);
     $memory_usage = memory_get_usage() - $base_memory_usage;
     $averageMemory = formatSize($memory_usage / $times);
     $memory_usage = formatSize($memory_usage);
     if (LOTUS_UNITTEST_DEBUG) {
         echo "\n----------------db getTDG insert----------------\n";
         echo "times      \t{$times}\n";
         echo "totalTime   \t{$totalTime}s\taverageTime   \t{$averageTime}s\n";
         echo "memoryUsage \t{$memory_usage}\taverageMemory \t{$averageMemory}";
         echo "\n---------------------------------------------------------\n";
     }
     $this->assertTrue(1 > $totalTime);
 }
Example #2
0
 public function __construct()
 {
     $this->db = LtObjectUtil::singleton('LtDb');
     $this->dbh = $this->db->getDbHandle();
     $this->smc = $this->db->getSqlMapClient();
     //必需在子类赋值
     //$this->table = $db->getTDG('your-table-name');
     //必需在子类赋值
     //$this->primaryKey = 'primary-key';
 }
Example #3
0
 public function __construct()
 {
     $this->db = new LtDb();
     $this->db->group = "Backend";
     $this->db->node = "Search";
     $this->db->init();
     // 启用Cache
     $Cache = new LtCache();
     $Cache->configHandle->get("cache.servers");
     $Cache->group = 'Backend';
     $Cache->node = 'Search';
     $Cache->init();
     $this->cache = $Cache->getTDG("Basedao");
     $this->cacheTime = $this->cacheTime ? $this->cacheTime : 3600;
     $this->dbh = $this->db->getDbHandle();
     $this->smc = $this->db->getSqlMapClient();
 }
 /**
  * 分布式数据库操作测试
  * 本例演示了垂直切分(多个Group)和水平切分(一个Group下多个节点)
  * 由于实际测试环境的限制,本例中不同的Group和Node只用dbname来区分,共享一个mysql server
  *    Group 1:系统数据组,存储系统数据,因为数据较少,只包含一个节点
  *        Node 1:dbname=sys_data
  *    Group 2: 用户数据组,存储用户生产的数据,因为数据量可能会大,包含两个节点
  *        Node 1:dbname=member_1
  *        Node 2:dbname=member_2
  */
 public function testDistDb()
 {
     $dcb = new LtDbConfigBuilder();
     /**
      * 配置系统数据组
      * 一个节点, 一主零从
      */
     $dcb->addHost("sys_group", "sys_node_1", "master", array("username" => "test", "password" => "", "dbname" => "sys_data", "adapter" => "mysql"));
     /**
      * 配置用户数据组
      * 两个节点
      * 每个节点一主零从
      * 都在同一台机器上,不同节点数据库名不同
      */
     $dcb->addHost("user_group", "user_node_1", "master", array("username" => "test", "password" => "", "dbname" => "member_1", "adapter" => "mysql"));
     $dcb->addHost("user_group", "user_node_2", "master", array("dbname" => "member_2"));
     /**
      * ========== LtDb的第一个实例,仅用于操作sys_group ==========
      */
     $db1 = new LtDb();
     $db1->configHandle->addConfig(array("db.servers" => $dcb->getServers()));
     $db1->group = "sys_group";
     $db1->init();
     //用DbHandle直接操作数据库
     $dbh1 = $db1->getDbHandle();
     $this->assertEquals(true, $dbh1->query("DROP TABLE IF EXISTS sys_category"));
     $this->assertEquals(true, $dbh1->query("CREATE TABLE sys_category (\n\t\t\tid INT NOT NULL auto_increment,\n\t\t\tname VARCHAR( 20 ) NOT NULL ,\n\t\t\tPRIMARY KEY ( id ) \n\t\t)"));
     //使用Table Gateway查询引擎
     /**
     @todo 当sys_data库不存在时插入到了test库, 这是个bug?
     */
     $tg1 = $db1->getTDG("sys_category");
     $this->assertEquals(1, $id = $tg1->insert(array("id" => 1, "name" => "PHP")));
     $this->assertEquals(array("id" => 1, "name" => "PHP"), $tg1->fetch($id));
     //使用SqlMapClient
     $smc1 = $db1->getSqlMapClient();
     // 实际使用时是从配置文件里获取 sql
     $db1->configHandle->addConfig(array("db.sqlmap." . $dbh1->group . '.sys.getSysCateTotal' => array("sql" => "SELECT count(`id`) as 'category_total' FROM `sys_category`", "force_use_master" => false)));
     $this->assertEquals(array(0 => array("category_total" => 1)), $smc1->execute("sys.getSysCateTotal"));
     /**
      * ========== LtDb的第二个实例,仅用于操作user_group ==========
      */
     $db2 = new LtDb();
     $db2->configHandle->addConfig(array("db.servers" => $dcb->getServers()));
     $db2->group = "user_group";
     $db2->node = "user_node_1";
     $db2->init();
     //用DbHandle直接操作数据库
     $dbh2 = $db2->getDbHandle();
     $this->assertEquals(true, $dbh2->query("DROP TABLE IF EXISTS user_account"));
     $this->assertEquals(true, $dbh2->query("CREATE TABLE user_account (\n\t\t\tid INT NOT NULL auto_increment,\n\t\t\tusername VARCHAR( 20 ) NOT NULL ,\n\t\t\tPRIMARY KEY ( id ) \n\t\t)"));
     //使用Table Gateway查询引擎
     $tg2 = $db2->getTDG("user_account");
     $this->assertEquals(1, $id = $tg2->insert(array("id" => 1, "username" => "lotusphp")));
     $this->assertEquals(array("id" => 1, "username" => "lotusphp"), $tg2->fetch($id));
     /**
      * 重新设置要操作的节点
      * 重新设置节点后,DbHanlde和Table Gateway都会去操作新的节点
      */
     $db2->changeNode("user_node_2");
     //用DbHandle直接操作数据库
     $dbh2 = $db2->getDbHandle();
     $this->assertEquals(true, $dbh2->query("DROP TABLE IF EXISTS user_account"));
     $this->assertEquals(true, $dbh2->query("CREATE TABLE user_account (\n\t\t\tid INT NOT NULL auto_increment,\n\t\t\tusername VARCHAR( 20 ) NOT NULL ,\n\t\t\tPRIMARY KEY ( id ) \n\t\t)"));
     //使用Table Gateway查询引擎
     $tg2 = $db2->getTDG("user_account");
     $this->assertEquals(2, $id = $tg2->insert(array("id" => 2, "username" => "talkativedoggy")));
     $this->assertEquals(array("id" => 2, "username" => "talkativedoggy"), $tg2->fetch($id));
     //使用Table Gateway查询引擎 Group By 测试
     $tg2 = $db2->getTDG("user_account");
     $this->assertEquals(3, $id = $tg2->insert(array("id" => 3, "username" => "laoliu")));
     $this->assertEquals(4, $id = $tg2->insert(array("id" => 4, "username" => "laoliu")));
     $this->assertEquals(2, $tg2->count(array("groupby" => "username")));
 }