2
votes

Connexion perdue pendant un long processus de sauvegarde des enregistrements dans la base de données sqlite3 codeigniter

J'ai un processus lourd qui produit beaucoup d'enregistrements (> 1000000) qui devraient être sauvegardés dans la base de données sqlite3 dans codeigniter.

Le paramètre pour se connecter à la base de données au moment de l'exécution est comme ça

class Db_model extends CI_Model
{
 public function __construct()
    {
        parent::__construct();
        set_time_limit(10000);
    }

public function insert($data, $config)
{
    $DB = null;
    $DB = $this->load->database($config, TRUE);
    $DB->initialize();
//        $DB->busyTimeout(72000000);
        $DB->trans_start();
        $DB->insert_batch('tbl_name', $data);
        $DB->trans_complete();
        $DB->close();

    }

}

mon code dans CI_Controller est

 $counter = 0;
    $this->load->model('db_model');
    for ($j = 0; $j < $MAX_Y; $j++) {
        for ($i = 0; $i < $MAX_X; $i++) {

            // some process .....
            // prepare $values

            if ($counter > 20000) {
                $this->db_model->insert($values, $config);
                $counter = 0;
                unset($values);
                $values = array();
            } else {
                $counter++;
            }

        }
    }
    if ($counter > 0) {
        $this->db_model->insert($values, $config);
    }

mon code dans db_model est

 $config['hostname'] = '';
    $config['username'] = '';
    $config['password'] = '';
    $config['database'] = './application/database/' . $database_name;
    $config['dbdriver'] = 'sqlite3';
    $config['dbprefix'] = '';
    $config['pconnect'] = false;
    $config['db_debug'] = true;
    $config['autoinit'] = false;
    $config['cache_on'] = false;
    $config['cachedir'] = '';
    $config['stricton'] = false;
    $config['char_set'] = 'utf8';
    $config['dbcollat'] = 'utf8_general_ci';
    $config['save_queries'] = true;
    $config['failover'] = array();

Pendant l'enregistrement enregistrements dans la table de la base de données sqlite3 soudainement, il arrête d'écrire le reste des enregistrements qui restent et la table n'a pas tous les enregistrements qui devraient avoir.

Je pense que quelque chose ne va pas avec le délai de connexion, et je devrais changer quelque chose lié au délai de connexion. mais je n'ai pas trouvé de bonne réponse à ce problème après quelques semaines.


2 commentaires

N'utiliseriez-vous pas insert_batch ()?


@NiallLonergan. Si j'utilise insert (), ces enregistrements qui écrivent dans la table sont inférieurs à insert_batch ()


4 Réponses :


0
votes

Faites comme ceci: $ db ['default'] ['options'] = array (PDO :: ATTR_TIMEOUT => 50000);
Dans le fichier de configuration: ( application / config / database.php )

Référez-vous à cette réponse


0 commentaires

0
votes

Cela peut être dû à votre code qui est exécuté avant l'insertion des données, ce qui provoque la rupture de la connexion au serveur pour enregistrer les ressources.

La meilleure façon de le faire est simplement de fermer la connexion et de reconnecter la base de données manuellement avant la requête d'insertion utilisant ceci:

$this->db->reconnect();

Ou

$this->db->close();
$this->db->initialize(); 

Vérifiez: Reconnecting / Keeping the Connection Alive pour référence.


0 commentaires

0
votes

Vous mettez le set_time_limit (10000); à l'intérieur du modèle. Mais vous exécutez une boucle dans le CI_Controller, et je suppose que les inserts eux-mêmes ne sont pas longs.

Le temps mort ne se produira pas dans le modèle, il se produira dans le contrôleur. Essayez donc de changer le CI_Controller comme ceci:

$counter = 0;
    $this->load->model('db_model');
    set_time_limit(10000); //set time limit to the longest run of this script
    for ($j = 0; $j < $MAX_Y; $j++) {
    for ($i = 0; $i < $MAX_X; $i++) {

        // some process .....
        // prepare $values

        if ($counter > 20000) {
            $this->db_model->insert($values, $config);
            $counter = 0;
            unset($values);
            $values = array();
        } else {
            $counter++;
        }

    }
}
if ($counter > 0) {
    $this->db_model->insert($values, $config);
}


0 commentaires

0
votes

J'en ai eu assez des timeouts PHP et j'ai commencé à écrire Programmes «redémarrables». Les bases ...

$step=(int)$_SERVER["QUERY_STRING"];

switch($step) {
    case 0:
        /* SETUP */
        redirect($_SERVER["PHP_SELF"]."?1";        
    case 1: 
        /* DO SOME WORK */
        if (work<>done) {
            redirect($_SERVER["PHP_SELF"]."?1"; 
        } else {
            exit;
        }       
}


function redirect($url,$seconds=0) {
    $html="<html><head><meta http-equiv='refresh' content='$seconds; URL=$url'></head></html>"; 
    echo $html; 
    exit(); 
}


0 commentaires