和數據庫MYSQL如何在PHP中啓用數據庫自動重新連接?
回答
你可以寫,這將通過連接和情況下來ping該數據庫的功能,再重新連接,然後進行任何你想要的查詢,或者也採取mysqli PHP庫看看,它可能對你有用。
PS。爲了維護數據庫連接,實現Singleton design pattern也是很有用的,一旦創建它將連接到數據庫,然後你可以實現getConnection方法,每次都會進行上面描述的檢查。
PPS。你可以使用一個異常,嘗試你的查詢,每當它失敗時捕獲一個異常,重新連接並重試。
您可以使用mysql_ping()函數來測試連接的狀態,並在返回false
時重新連接。如果您在該文檔頁面上提到的5.0.13之前使用MySQL,mysql_ping()甚至會重新連接; 「自MySQL 5.0.13以來,自動重新連接功能被禁用。」
你應該檢查查詢是否失敗。通過檢查錯誤代碼,您可以判斷是否由於沒有連接而重新連接失敗。只要確保你跟蹤重新連接嘗試,所以你不會陷入循環。
爲什麼您需要首先「重新連接」?你如何/爲什麼斷開連接?在PHP中,您可以在腳本的開頭連接,並在腳本結尾處自動關閉連接。
根本不需要在腳本中調用mysql_close
(如果您明確關閉了連接,那麼「自動重新連接」會很愚蠢)。您可以嘗試mysql_pconnect這就是您要找的。連接將永久保持打開狀態,其他連接的腳本可以使用連接。
有時,當您的MySQL連接打開時間過長時,如果沒有查詢的時間超過my.cnf中的wait_timeout值,則連接到數據庫的連接將被丟棄。你會得到「MySQL服務器已經消失」的超時錯誤。
這是我如何實現在我的代碼自動重新連接:
class databaseClass {
var $conn;
var $db;
public function __construct() {
$this->connect();
}
public function connect() {
$this->conn = mysql_connect(DB_HOST, DB_USER, DB_PASS);
$this->db = mysql_select_db(DB_NAME, $this->conn);
}
public function disconnect() {
mysql_close($this->conn);
}
public function reconnect() {
$this->disconnect();
$this->connect();
}
public function queryCompanyExist($company) {
//auto reconnect if MySQL server has gone away
if (!mysql_ping($this->conn)) $this->reconnect();
$query = "SELECT name FROM company WHERE name='$company'";
$result = mysql_query($query);
if (!$result) print mysql_error() . "\r\n";
return mysql_fetch_assoc($result);
}
}
這裏指的更多資料有關
從C MySQL的API:
my_bool重新連接= 0; mysql_options(& mysql,MYSQL_OPT_RECONNECT,& reconnect); 見http://dev.mysql.com/doc/refman/5.6/en/auto-reconnect.html
從在php.ini PHP的mysqli設置全局: mysqli.reconnect =在 見http://www.php.net/manual/en/mysqli.configuration.php#ini.mysqli.reconnect
對於PHP PDO MySQL驅動程序應該是可以通過PDO ::的setAttribute但我無法找到表明它已經實施的文件。該代碼似乎試圖尊重MYSQL_OPT_RECONNECT,這是現在需要的MySQL,但在初始實現(https://bugs.php.net/bug.php?id=58863)中未能這樣做。58863中修補程序的意圖是允許: 新的PDO('mysql:host = xxx','xx','xx',array(PDO :: MYSQL_OPT_RECONNECT => true));
爲什麼重新連接發生的原因有多種,但通常是因爲池組連接包含已超時由於缺乏使用的成熟的連接。默認情況下,mysql連接在8小時後超時。請參閱:http://dev.mysql.com/doc/refman/5.6/en/gone-away.html
對於重連見的副作用:http://dev.mysql.com/doc/refman/5.6/en/auto-reconnect.html
- 1. 重新連接數據庫,如果連接重新啓動
- 2. 當數據庫重新啓動/斷開連接時,JBoss自動重新連接數據庫
- 3. 自動重新連接postgresq數據庫
- 4. 如何禁用自動重新連接到oracle數據庫?
- 5. 如何在數據庫服務器重新啓動後自動重新建立連接(在JBoss 6.4.0中)
- 6. 自動重新連接數據庫連接
- 7. 嘗試數據庫後重新連接池JDBC數據源重新啓動
- 8. 從Wildfly數據源重新啓動後重新連接到oracle數據庫
- 9. 在Django中重新連接數據庫
- 10. Tomcat在數據庫重新啓動時不重新連接PostgreSQL JDBC池
- 11. 如何在Jedis客戶端啓用自動重新連接redis連接
- 12. MongoDB - 重新啓動VPS後與數據庫的連接丟失
- 13. 如何啓用MySQL客戶端自動重新連接MySQLdb?
- 14. JDBC連接池:數據庫重新啓動後連接不再循環
- 15. 如何在PHP中啓動PGSQL連接?
- 16. 如何在Android SQLite數據庫中從1重新啓動自動遞增ID
- 17. 如何在重新啓動LDAP服務器時重新連接?
- 18. 重新連接的JDBC DataSource的Sybase ASE 12.5數據庫重新啓動
- 19. 當網站重新啓動時自動恢復/重新連接SignalR連接
- 20. 如果連接在spring jpa中關閉,如何重新連接數據庫?
- 21. 在web2py請求週期中關閉並重新啓動數據庫連接
- 22. 數據庫重啓後Jboss不能重新連接到Mysql
- 23. 如何訪問在另一個PHP類中啓動的數據庫連接?
- 24. 如何重新啓動Django中的新數據庫?
- 25. Jboss的數據源恢復後,數據庫連接池還是重新啓動
- 26. 如何在連接中斷後自動重新連接Oracle連接池?
- 27. 當數據庫連接丟失時,如何在PHP中重新連接並重試MySQL查詢?
- 28. 數據庫連接重用
- 29. 如何在REST服務啓動時連接MySql數據庫?
- 30. 如何重新啓動/重置.Net中的SQL連接池?
你能成爲一個更具體一點?你用什麼來連接數據庫,mysql擴展,mysqli或抽象層?你得到什麼樣的錯誤信息等? – ruquay 2009-06-11 17:25:09
我正在使用mysql擴展。 – omg 2009-06-11 17:29:20
@ruquay,其實這個問題很具體。如果您使用mysqli或較早的mysqli,則無關緊要。顯示你不明白[auto-reconnect](http://dev.mysql.com/doc/refman/5.0/en/auto-reconnect.html)是什麼意思。這個問題與http://stackoverflow.com/revisions/1003841/1 – Pacerier 2014-12-17 09:16:39