sql >> Database teknologi >  >> RDS >> Mysql

MySQLi klassemønster for tilslutning, luk, lad åben?

Jeg vil anse det for ikke at være god praksis. Det er især af én grund:det problem, du beskriver, hvorfor du tror, ​​du har brug for det:Kun én forbindelse pr. anmodning.

Du behøver ikke kode noget. mysqli har en fin funktion indbygget, standardforbindelsen. Den vælger databaseforbindelsesparametrene fra ini-indstillingerne (konfiguration), hver gang du opretter en ny instans:

$db = new mysqli;

Da alle databaseforbindelser lukkes, når scriptet er færdigt, er der slet ikke meget at bekymre sig om. Det eneste du skal gøre er at instansiere forbindelsen én gang og videregive variablen til al kode, der har brug for den mysqli objekt.

En anden dårlig praksis er, at du introducerer en Singleton her noget som:

class MysqliSingleton extends mysqli
{
    private static $instance;
    /**
     * @return MysqliSingleton
     */
    public function getInstance()
    {
        if (NULL === self::$instance)
            self::$instance = new self();
        return self::$instance;
    }
    private function __construct()
    {
    }
    public function __clone()
    {
         throw new RuntimeException('Clone is not allowed.');
    }
    public function __wakeup()
    {
        throw new RuntimeException('Unserializing is not allowed.');
    }
}

Det ville fungere sådan her:

$mysqli = MysqliSingleton::getInstance();

og ville altid returnere den ene mysqli-instans, som måske er det, du leder efter. Dog Singletoner betragtes som skadelige, da de kan medføre en masse problemer, se det relaterede spørgsmål Hvem har brug for singletons? .

Det er nemmere, at du selv opretter en variabel, som du sender rundt, der indeholder databaseforekomsten. Du kan desuden indkapsle en form for lazy-loading, hvis din applikation ikke altid har brug for en mysqli-forbindelse, f.eks. med en meget simpel kontekstklasse:

interface ContextMysqli
{
    /**
     * @return mysqli
     */
    public function getMysqli();
}

class Context implements ContextMysqli
{
    private $mysqli;
    public function getMysqli()
    {
        $this->mysqli || $this->mysqli = new mysqli();
        return $this->mysqli;
    }
}

Når dine scripts starter, skal du bare instansiere din kontekst og sende den til alle dele af din kode, hvor du har brug for den:

$context = new Context();
...
$result = do_some_db_work($context);
...
function do_some_db_work(ContextMysqli $context)
{
    $mysqli = $context->getMysqli();
    ...
}

Dette forslag kan måske også være lidt kortsigtet, men det er bedre end en singleton, mens det ikke introducerer meget ståhej. Fordelen er, at du har indkapslet logikken, når du skal oprette mysqli objekt uden behov for en singleton. Din kode er nu uafhængig af global eller statisk kontekst.



  1. hvordan man forespørger Oracle-database baseret på brugerinput ved hjælp af asp.net c#

  2. Oracle:flere tabelopdateringer => ORA-01779:kan ikke ændre en kolonne, der er knyttet til en ikke-nøglebevaret tabel

  3. MySQL understøtter ikke limit-klausulen i et undervalg, hvordan kan jeg gøre det?

  4. Hvordan pg_sleep_until() virker i PostgreSQL