解決mysql 1040錯誤Too many connections的方法


從官方文檔知道linux上面編譯安裝的mysql默認的連接為100個,這樣對於網站的需求來說是遠遠不夠的。 
mysql官方告訴我們需要修改max_connections的值,那么我們怎么去修改呢?有兩種方法 

1、修改配置文件文件 

修改/etc/my.cnf這個文件,在[mysqld]中新增max_connections=N,如果你沒有這個文件請從編譯源碼中的support-files文件夾中復制你所需要的*.cnf文件為到/etc/my.cnf。我使用的是my-medium.cnf,中型服務器配置。例如我的[mysqld]的內容如下 

復制代碼代碼如下:

[mysqld] 
port = 3306 
socket = /tmp/mysql.sock 
skip-locking 
key_buffer = 160M 
max_allowed_packet = 1M 
table_cache = 64 
sort_buffer_size = 512K 
net_buffer_length = 8K 
read_buffer_size = 256K 
read_rnd_buffer_size = 512K 
myisam_sort_buffer_size = 8M 
max_connections=1000 


由於對mysql還不是很熟悉,所以很多參數沒有修改。哈哈。。 

2、非使用mysqld腳本自動啟動的用戶。 

修改$MYSQL_HOME/bin/mysqld_safe文件 
例如:/usr/local/mysql/bin/mysqld_safe這個文件 
grep -n 'max_connection' $MYSQL_HOME/bin/mysqld_safe 
修改對應行號的max_connections參數值 
以上方法為參考網上的做法寫的。 

方法二: 

在PHP手冊里面找關於mysql_connect和mysql_pconnect的資料,下面是在php手冊中對這兩個函數的描述: 
mysql_connect 函數原型: 
resource mysql_connect ( [string server [, string username [, string password [, bool new_link [, int client_flags]]]]]) 
返回: 
如果成功則返回一個MySQL 連接標識,失敗則返回FALSE。 
描述: 
mysql_connect() 建立一個到MySQL 服務器的連接。當沒有提供可選參數時使用以下默認值:server = 'localhost:3306',username = 
服務器進程所有者的用戶名,password = 空密碼。 
如果用同樣的參數第二次調用mysql_connect(),將不會建立新連接,而將返回已經打開的連接標識。參數new_link 改變此行為並使 
mysql_connect() 總是打開新的連接,甚至當mysql_connect() 曾在前面被用同樣的參數調用過。參數client_flags 可以是以下常量的組合 
:MYSQL_CLIENT_COMPRESS,MYSQL_CLIENT_IGNORE_SPACE 或者MYSQL_CLIENT_INTERACTIVE。 
注: new_link 參數自PHP 4.2.0 起可用。 
client_flags 參數自PHP 4.3.0 起可用。 
一旦腳本結束,到服務器的連接就會被關閉。除非之前已經調用了mysql_close() 來關閉它。 
mysql_pconnect : 
函數原型: 
resource mysql_pconnect ( [string server [, string username [, string password [, int client_flags]]]]) 
返回: 
如果成功則返回一個正的MySQL 持久連接標識符,出錯則返回FALSE。 
描述: 
mysql_pconnect() 建立一個到MySQL 服務器的連接。如果沒有提供可選參數,則使用如下默認值:server = 'localhost:3306', 
username = 服務器進程所有者的用戶名,password = 空密碼。client_flags 參數可以是以下常量的組合:MYSQL_CLIENT_COMPRESS, 
MYSQL_CLIENT_IGNORE_SPACE 或者MYSQL_CLIENT_INTERACTIVE。 
server 參數也可以包括端口號,例如"hostname:port",或者是本機套接字的的路徑,例如":/path/to/socket"。 
注: 對":port" 的支持是3.0B4 版添加的。 
對":/path/to/socket" 的支持是3.0.10 版添加的。 兩者之間的區別 : 
mysql_pconnect() 和mysql_connect() 非常相似,但有兩個主要區別。 
首先,當連接的時候本函數將先嘗試尋找一個在同一個主機上用同樣的用戶名和密碼已經打開的(持久)連接,如果找到,則返回此連接標識而不打開新連接。 
其次,當腳本執行完畢后到SQL 服務器的連接不會被關閉,此連接將保持打開以備以后使用(mysql_close() 不會關閉由mysql_pconnect() 建立的連接)。 
可選參數client_flags 自PHP 4.3.0 版起可用。此種連接稱為"持久的"。 

小結一下,要保證你的系統不會出現Too many connections 錯誤,需要注意兩點: 
1.保證你的apache的最大進程數不超過mysql的最大連接數; 
2.不要在程序里面用過多mysql_pconnect連接到同一個數據庫服務器(一個就夠了).這需要好的編碼習慣和規范.特別是不斷的給系統增加 
新的功能,如果不注重系統架構和編碼規范,當系統的復雜度到了一定的程度,整個系統就變得無法維護了.出現問題的時候解決起來就很麻煩了. 
解決方法是修改/etc/mysql/my.cnf,添加以下一行: 
set-variable = max_connections=500 
或在啟動命令中加上參數max_connections=500 
就是修改最大連接數,然后重啟mysql.默認的連接數是100,太少了,所以容易出現如題錯誤 

以上摘自 宋利興的專欄 以下為補充:

1.可能是mysql的max connections設置的問題
2.可能是多次insert,update操作沒有關閉session,需要在spring里配置transaction支持。

解決:
1.修改tomcat里的session 的time-out時間減少為20,(不是必改項)
2.對處理量大的對數據庫insert或update的操作提供transaction支持.

=======================================
下面的是解決辦法:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"

原因:

因為你的mysql安裝目錄下的my.ini中設定的並發連接數太少或者系統繁忙導致連接數被占滿


解決方式:

打開MYSQL安裝目錄打開MY.INI找到max_connections(在大約第93行)默認是100 一般設置到500~1000比較合適,重啟mysql,這樣1040錯誤就解決啦。
max_connections=1000

一定要重新啟動MYSQL才能生效

CMD->

net stop mysql

net start mysql

關於改變innodb_log_file_size后無法啟動mysql的問題

innodb_buffer_pool_size=768M
innodb_log_file_size=256M
innodb_log_buffer_size=8M
innodb_additional_mem_pool_size=4M
innodb_flush_log_at_trx_commit=0
innodb_thread_concurrency=20
以上是對innodb引擎的初步優化, 發現是更新innodb_log_file_size=256M時候出現了問題,只要加上這個就無法啟動,

后來才知道原來要STOP服務先,然后再刪除原來的文件………
打開/MySQL Server 5.5/data

刪除ib_logfile0, ib_logfile1........ib_logfilen
再開啟選項,成功啟動。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM