Ejemplo n.º 1
0
 /**
  * 分布式数据库操作测试
  * 本例演示了垂直切分(多个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")));
 }