我为我的一个客户开发了一个应用程序.他已经有一个所以我需要将他的实际数据库(SQL Server)转换成新的(
MySQL).
SQL Server的某些表具有超过10.000.000条记录.当我开始开始开发这个转换器时,我已经开始使用几个记录的表,所以我找到所有的记录并保存到我的新的MySQL数据库.我会给你一些代码,以便更好地理解(这只是一个例子)
namespace Converter\Model;
class PostConverter extends AbstractConverter
{
public function convert()
{
// this is the default connection, it is a mysql database (new application)
$em = $this->getEntityManager();
// this return an alternative connection to the sqlserver database (actual application)
$emAlternative = $this->getEntityManagerAlternative();
// instance of Converter\Repository\Post
$repository = $emAlternative->getRepository('Converter\Entity\Post');
$posts = $repository->findAll();
foreach ($posts as $post)
$post = new Post();
$post->setTitle($object->getTitle());
$em->persist($post);
}
$em->flush();
}
}
现在我们假设Post表有超过10.000.000条记录.我不能只是找到所有的并且迭代它.我会离开内存所以我做了这样的事情.
存储库类:
namespace Converter\Repository;
class Posts extends \Doctrine\ORM\EntityRepository
{
public function findPosts($limit, $offset)
{
$qb = $this->createQueryBuilder('Post');
$qb->setMaxResults($limit);
$qb->setFirstResult($offset);
return $qb->getQuery->getResult();
}
}
在这里,我发现只有几个帖子在时间,在while循环.但它有点慢.我找不到更好的解决方案来提高性能
namespace Converter\Model;
class PostConverter extends AbstractConverter
{
public function convert()
{
$em = $this->getEntityManager();
$emAlternative = $this->getEntityManagerAlternative();
$repository = $emAlternative->getRepository('Converter\Entity\Post');
$limit = 1000;
while ($object = $repository->findPosts($limit, $offset) {
$post = new Post();
$post->setTitle($object->getTitle());
$em->persist($post);
$offset += $limit;
}
$em->flush();
}
}
我以前从来没有这样做过.也许我会走错路.我真的很感激,如果有人能告诉我正确的一个,所以我可以继续下去.
谢谢你们
编辑
我不能只是把一个人转给另一个人.我在这里发布的只是一个例子,在转换中,我必须在插入新数据库之前处理几乎所有的数据.他的实际应用是在2005年开发的.数据库甚至没有规范化