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'; }
/** * 本测试展示了如何用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); }
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"))); }