web-dev-qa-db-ja.com

MYSQLiエラー:ユーザーはすでに 'max_user_connections'を超えるアクティブな接続を持っています

実行しているサイトで以下のエラーが発生します。それが私のローカルホスト上でうまく機能するので、なぜそれがそうなのか分かりません。それはホストと関係がありますか? Unixサーバーを使用しています。

Warning: mysqli::mysqli() [mysqli.mysqli]: (42000/1203): User dbo343879423 already has more than 'max_user_connections' active connections in /homepages/9/d322397966/htdocs/dump/models/class_database.php on line 11
Connect failed: User dbo343879423 already has more than 'max_user_connections' active connections 
Warning: mysqli::close() [mysqli.close]: Couldn't fetch mysqli in /homepages/9/d322397966/htdocs/dump/models/class_database.php on line 160

エラーには、「ユーザーdbo343879423にはすでに/homepages/9/d322397966/htdocs/dump/models/class_database.phpの「max_user_connections」よりも多くのアクティブな接続が11行目にある」というので、これはスクリプトの11行目です-できます」何かおかしい!

$this -> connection = new mysqli($hostname,$username,$password,$database);

以下はclass_database.phpのクラス全体ですが、スクリプトの他の部分で間違っているので変更する必要がありますか?

<?php
#connects the database and handling the result
class __database {

    protected $connection = null;
    protected $error = null;

    #make a connection
    public function __construct($hostname,$username,$password,$database)
    {
        $this -> connection = new mysqli($hostname,$username,$password,$database);

        if (mysqli_connect_errno()) 
        {
            printf("Connect failed: %s\n", mysqli_connect_error());
            exit();
        }
    }

    #fetches all result rows as an associative array, a numeric array, or both
    public function fetch_all($query) 
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> fetch_all(MYSQLI_ASSOC);
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #fetches a result row as an associative array, a numeric array, or both
    public function fetch_assoc_while($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            while($row = $result -> fetch_assoc())
            {
                $return_this[] = $row;
            }

            if (isset($return_this))
            {
                return $return_this;
            }
            else
            {
                return false;
            }
        }
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #fetch a result row as an associative array
    public function fetch_assoc($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> fetch_assoc();
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #get a result row as an enumerated array
    public function fetch_row($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> fetch_row();
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #get the number of rows in a result
    public function num_rows($query)
    {
        $result = $this -> connection -> query($query);
        if($result) 
        {
            return $result -> num_rows;
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }
    }

    #performs a query on the database
    public function query($query)
    {
        $result = $this -> connection -> query($query); 
        if($result) 
        {
            return $result;
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }

    }

    #escapes special characters in a string for use in a SQL statement, taking into account the current charset of the connection
    public function real_escape_string($string)
    {
        $result = $this -> connection -> real_escape_string($string);   
        if($result) 
        {
            return $result;
        } 
        else
        {
            $this -> error = $this -> connection -> error;
            return false;
        }

    }

    #display error
    public function get_error() 
    {
        return $this -> error;
    }

    #closes the database connection when object is destroyed.
    public function __destruct()
    {
        $this -> connection -> close();
    }
}
?>

または、ホストを完全に変更する必要があります!??

以下は、データベース接続クラスの実装です。この部分を削除すると、エラーは表示されなくなりますが、サイトの他の部分でも同じように実行され、問題は発生しません。

<!-- side-video-library -->
<div id="side-video-library" class="round-corner">

    <h4><a href="<?php echo HTTP_ROOT;?>videos"><span>ENER VIDEO LIBRARY</span></a></h4>

    <?php
    $sql = "
    SELECT *
    FROM root_pages

    WHERE root_pages.parent_id = '8'
    AND root_pages.pg_highlight = '1'
    AND root_pages.pg_hide != '1'
    ORDER BY Rand() DESC
    LIMIT 1
    ";

    #instantiate the object of __database class
    $object_item = new __database(DB_Host,DB_USER,DB_PASS,DB_NAME);
    $item = $object_item -> fetch_assoc($sql);

    #instantiate the object of __database class
    $object_item_num = new __database(DB_Host,DB_USER,DB_PASS,DB_NAME);
    $total_item = $object_item_num -> num_rows($sql);
    //echo $total_item;
    ?>

    <?php
    if ($total_item > 0)
    {
        $sql = "
        SELECT *
        FROM root_tagged

        LEFT JOIN root_tags ON ( root_tags.tag_id = root_tagged.tag_id )

        WHERE root_tagged.pg_id = '".$item['pg_id']."'
        ";

        #instantiate the object of __database class
        $object_tagname = new __database(DB_Host,DB_USER,DB_PASS,DB_NAME);
        $item_tagname = $object_tagname -> fetch_assoc($sql);

        #instantiate the object of __database class
        $object_tagname_num = new __database(DB_Host,DB_USER,DB_PASS,DB_NAME);
        $total_tagname = $object_tagname_num -> num_rows($sql);
    ?>
    <p class="item-video">
        <object style="width: 183px; height: 151px;" width="183" height="151" data="http://www.youtube.com/v/<?php echo get_video_id($item['pg_content_1']) ;?>" type="application/x-shockwave-flash">
            <param name="wmode" value="transparent" />
            <param name="src" value="http://www.youtube.com/v/<?php echo get_video_id($item['pg_content_1']) ;?>" />
        </object>
    </p>

    <h3><a href="<?php echo HTTP_ROOT.str_replace(' ', '-', 'videos').'/'.$item_tagname['tag_name'].'/'.str_replace(' ', '-', strtolower($item['pg_url']));?>"><?php if(strlen($item['pg_title']) > 20) echo substr($item['pg_title'], 0,20).'...'; else echo $item['pg_title'];?></a></h3>

    <p class="item-excerpt-video"><?php if(strlen($item['pg_content_2']) > 100) echo substr($item['pg_content_2'], 0,100).'...'; else echo $item['pg_content_2'];?></p>
    <a href="<?php echo HTTP_ROOT;?>videos" class="button-arrow"><span>More</span></a>
    <?php
    }
    ?>
</div>
<!-- side-video-library -->

クラスを正しく実装していませんか?

ありがとう。

13
laukok

おそらく問題は、許可されている接続が一握りしかなく、クラスが新しい接続を取得しようとしたときにこのエラーが発生することです。

これはプログラミングの問題ではなく、利用可能なリソースの量です。また、このクラスを使用する他のスクリプトにはエラーが発生する可能性があります。

サーバー上のmysql構成ファイルでさらに接続を構成する必要があります。このアクセス権がない場合は、サポートに依頼するか、接続を許可するホスティング会社に変更してください!

他のオプションは、このクラスにシングルトンパターンを実装することです。そのため、同じ接続プールを再利用し、制限を超えません。

10

MySQLサーバーのユーザーのMAX USER_CONNECTIONS設定を確認します。 PHPMyAdminでサーバーページに移動し([サーバー]をクリックします:<>)、サブメニューで[特権]をクリックします。ユーザーdbo343879423を編集すると、MAX USER_CONNECTIONSが右側に表示されます。デフォルトでは0(無制限)に設定されていると思いますが、サーバーの設定者によっては制限される場合があります。

データベースクラスがどのように使用されているかはわかりませんが、クラスを複数回インスタンス化する場合は、データベースクラスにプライベート静的変数Databaseを作成し、データベース接続がnullの場合にインスタンス化するパブリック静的メソッドgetDatabase()を作成することを検討してくださいそしてインスタンスを返します。

5
Turcogj

このmax_user_connectionsメッセージが表示された場合は、まずデータベーステーブルを最適化してください。

データベーステーブルとクエリを最適化する方法:

  1. MySQLのテーブルフィールドにインデックスを付ける
  2. 選択クエリで「*」を削除し、必要なフィールドを書き込みます
  3. Mysql_connectionを閉じた

Godaddy共有ホスティングでこれを行うには、MAX_USER_CONNECTION値を変更できません。それを見つけるには、サーバー<>をクリックし、メニューバーの変数をクリックします。鉱山は200に設定されています。

1
styl3r

不適切なプレースホルダーが原因でこのメッセージを受け取った場合に遭遇した状況を含めたかったのは、次の点です。

      $sql_str = 'SELECT prod_id FROM ' . $this->table_name["product"] . ' WHERE prod_sku =:p_sku';
    $arr[':prod_sku'] = $s_sku;

さらに、多数のクエリを実行していました。エラーが多数のクエリと複合してこの問題が発生したと思います。クエリを修正したところ、離れているときに接続の問題が発生しました。

1
Tycon

コマンドラインを使用してmysqlへの接続ログインの数を確認し、このコマンドを実行する

SHOW VARIABLES LIKE 'max_user_connections

ステップ#1:/etc/my.cnfの設定を確認する

max_user_connections = <set number that you want>

max_user_connections =

mysqlコマンドラインからも設定できます

SET GLOBAL max_user_connections = 0;

apacheサーバーを再起動します

0
Ajay Gadhavana