Coder1024

Coder1024

这家伙有点懒,还没写个性签名!

  • 财富值45
  • 威望值0
  • 总积分65

个人信息

  • 老哥,代码不错,感谢分享!不过放到linux系统上报错:Worksheet not found。

    看了代码,路径/vendor/illusion/yii2-excel/src/下的文件WorkSheet.php,Sheet首个字符是大写;
    Spreadsheet.php的第52行$this->worksheet = new Worksheet($this->_spreadsheet);Worksheet的sheet首个字符是小写。

    可修改WorkSheet.php 的文件名为 Worksheet.php;或者修改class名和调用的地方解决。

  • 回复了 的回答

    你这个问题 我今天刚刚遇到, where 先把大的条件放前面

    其实是跨库的问题,写了篇文章记录了本次的坑:https://www.jianshu.com/p/e1f5364aa9d6

  • 回复了 的回答

    不知道 sqlcommand 执行和 AR 执行的代码怎么写的。你多贴一点代码瞅瞅。

    今天本地测试了1000条数据操作,需要65秒,蛋疼。
    通过Debug语句,实际业务中,在批量操作时,由于在循环内操作两个数据库的表,有两个数据库连接,Yii会在执行DB操作时切换连接,通过Schema获取表结构,非常耗时。解决方法只能是把两个表的插入操作分开,一个个批量执行来提高效率了。
    感谢老哥,结贴!

  • 回复了 的回答

    不知道 sqlcommand 执行和 AR 执行的代码怎么写的。你多贴一点代码瞅瞅。

    初步怀疑是,在一个循环中,对两个数据库连接执行插入和删除的操作,导致yii数据表缓存丢失,每次操作需要重新通过Schema加载数据表结构再进行操作。仅仅是怀疑而已。当循环有12条数据时,我看到Debug中包括插入和删除总共有165条记录,query占了大部分。而如果都使用sqlCommand方式来操作,大概有40多条数据库操作记录,这是正确的,query语句仅查询几次,其他都是插入、删除、set事务以及事务隔离性。

  • 回复了 的回答

    事务在循环外面开启试试。

    debug去掉就看不到,但执行时间依然很久

  • 回复了 的回答

    不知道 sqlcommand 执行和 AR 执行的代码怎么写的。你多贴一点代码瞅瞅。

    model的操作基本上就是上面贴的代码,sqlCommand语句是直接Customer->getDb()->createCommand()->insert('customer',data2)->execute();这样去操作。我现在是$model还是按照原先的操作,$model2的操作就换成sqlCommand了,当循环有12条数据时,不会像之前那样需要12秒了,现在仅需1-2秒左右。

  • 回复了 的回答

    事务在循环外面开启试试。

    不好意思,贴成之前的代码了,之后修改就是把事务放循环外面了,debug的query语句还是多

  • 贴上部分代码

    
    $datas = User::find()->where(['type' => $type])->with('user_type')->all();
    
    if ($datas){
        ...
        $transaction = User::getDb()->beginTransaction();
        $transaction->setIsolationLevel(\yii\db\Transaction::SERIALIZABLE);
        try {
            $transaction2 = Customer::getDb()->beginTransaction();
            $transaction2->setIsolationLevel(\yii\db\Transaction::SERIALIZABLE);
            try {
               foreach ($datas as $key => $user) {
                    ...
                    $data = $data2 = $user->getAttributes();
                    ...
                    $model = new UserInfo();
                    $model2 = new Customer();
                    $model->load($data, "");
                    $model2->load($data2, "");
                    if($model->save() && $model2->save() && $user->delete()){
                        $transaction2->commit();
                        $transaction->commit();
                    }
                }
            } catch(\Throwable $e) {
                $transaction2->rollBack();
                throw $e;
            }
        } catch(\Throwable $e) {
            $transaction->rollBack();
            throw $e;
        }
    }
    
  • 2018-10-25 已签到
    连续签到2天,获得了10个金钱
职场新人 等级规则
65/100
资料完整度
10/100
用户活跃度
10/100

Ta的关注

0

Ta的粉丝

0

Ta的访客

2