2014-09-16 9 views
11

Ho riscontrato questo problema ogni volta che provo a sincronizzare un oggetto JSON di medie dimensioni con il mio database in modo da poter eseguire alcuni rapporti su di esso. Dall'analisi di ciò che può causarlo, mi sono imbattuto in questi collegamenti sull'argomento.Errore generale: 1615 L'istruzione preparata deve essere riformulata

http://blog.corrlabs.com/2013/04/mysql-prepared-statement-needs-to-be-re.html http://bugs.mysql.com/bug.php?id=42041

Entrambi sembrano puntare nella direzione di table_definition_cache me. Tuttavia questo sta dicendo che il problema è dovuto a un mysqldump che si verifica sul server allo stesso tempo. Posso assicurarti che non è questo il caso. Inoltre ho ridotto la query per inserire solo un oggetto alla volta.

public function fire($job, $data) 
{ 
    foreach (unserialize($data['message']) as $org) 
    { 
     // Ignore ID 33421 this will time out. 
     // It contains all users in the system. 
     if($org->id != 33421) { 
      $organization = new Organization(); 
      $organization->orgsync_id = $org->id; 
      $organization->short_name = $org->short_name; 
      $organization->long_name = $org->long_name; 
      $organization->category = $org->category->name; 
      $organization->save(); 

      $org_groups = $this->getGroupsInOrganization($org->id); 
      if (!is_int($org_groups)) 
      { 
       foreach ($org_groups as $group) 
       { 
        foreach($group->account_ids as $account_id) 
        { 
         $student = Student::where('orgsync_id', '=', $account_id)->first(); 
         if (is_object($student)) 
         { 
          $student->organizations()->attach($organization->id, array('is_officer' => ($group->name == 'Officers'))); 
         } 
        } 
       } 
      } 
     } 
    } 

    $job->delete(); 
} 

Questo è il codice in esecuzione quando viene generato l'errore. Che normalmente si presenta sotto forma di.

SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: insert into `organization_student` (`is_officer`, `organization_id`, `student_id`) values (0, 284, 26)) 

Che viene poi seguito da questo errore ripetuto 3 volte.

SQLSTATE[HY000]: General error: 1615 Prepared statement needs to be re-prepared (SQL: insert into `organizations` (`orgsync_id`, `short_name`, `long_name`, `category`, `updated_at`, `created_at`) values (24291, SA, Society of American, Professional, 2014-09-15 16:26:01, 2014-09-15 16:26:01)) 

Se qualcuno può indicarmi la giusta direzione, sarei molto grato. Sono più curioso di ciò che sta effettivamente innescando l'errore, quindi trovando la causa di questo specifico problema. Sembra anche essere piuttosto comune nell'applicazione laravel quando si utilizza l'ORM.

+0

Ho la stessa [errore] (http://stackoverflow.com/questions/31957441/laravel-general-error-1615-prepared-statement-needs-to-be-re-prepared/ 31957572) che lega per selezionare i dati dal mio mariaDB. Ho notato che ciò equivale all'eccezione solo quando si lavora con sql view. L'unica cosa diversa è che l'errore sta mostrando solo 2 volte per me. Hai scoperto qualcosa di nuovo? Grazie mille! – Tenaciousd93

risposta

3

Questo errore si verifica quando mysqldump è in corso. Non importa quale dump DB sia in corso. Aspetta che il dumping finisca e questo errore sparirà.

Il problema è con la definizione della tabella scaricata che causa questo errore.

Sì ho provato a cambiare queste impostazioni MySQL, ma si verifica ancora qualche tempo (per lo più durante l'esecuzione dei backup MySQL pesanti/discariche di notte) ..

table_open_cache 128 => 16384

table_definition_cache 1024 => 16384

+2

Questo è quello che ho trovato quando mi guardavo intorno, ma eseguivamo solo mysqldump alle 2:00 e questo errore si sarebbe verificato in qualsiasi momento durante il giorno in cui il processo sarebbe stato eseguito. – mschuett

6

Mentre mysqldump è la causa comunemente segnalata per questo, non è l'unico.

Nel mio caso l'esecuzione di artisan: la migrazione su qualsiasi database attiverà anche questo errore per diversi database sullo stesso server.

http://bugs.mysql.com/bug.php?id=42041 Serrature/flush delle tabelle di menzione che verrebbero chiamate in un mysqldump quindi vale la pena controllare se si verificano migrazioni, blocchi o svuotamenti simultanei.

In caso contrario provare a preparare i preparativi su emulato.

'options' => [ 
      \PDO::ATTR_EMULATE_PREPARES => true 
     ] 
Problemi correlati