Data source rejected establishment of connection, message from server: "Too many connections"
詳細錯誤信息:
Caused by: com.MySQL.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connections"
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:57)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
at com.mysql.jdbc.Util.getInstance(Util.java:386)..............................
問題分析:
查看MySQL的當前最大連接數,登錄MySQL:mysql -uroot -p,回車;輸入密碼,回車;
輸入命令:select VARIABLE_VALUE from information_schema.GLOBAL_VARIABLES where VARIABLE_NAME=‘MAX_CONNECTIONS‘; 回車
顯示當前最大連接數為:151,之前通過文章“CentOS下mysql最大連接數設置 1040 too many connection”中的方法設置為3600了,現在怎麽又變成151了?原來這個方法只是臨時的修改了最大連接數,重新啟動MySQL服務後就還原了。
解決問題:
要徹底解決問題還是要修改my.cnf配置文件,這裏使用VI來修改,輸入命令:vi /usr/my.cnf 回車;打開文件後按“i”鍵進入編輯狀態;
在“[mysqld]”下面添加“max_connections=3600”,按Esc鍵進入命令模式,輸入“:wq”回車(保存並退出)。
執行:service mysql restart 重新啟動MySQL服務;啟動服務的時間可能有點長,耐心等待……
註意:很多文章中提到在“[mysqld]”下面添加“set-variable=max_connections=1000”,根本不行,加了之後服務就啟動不了了。
我這的環境是:CentOS 6.5 MySQL 5.6
錯誤原因:
太多的連接數,登錄用戶過多,配置的mysql連接數過小,或者某些連接沒有關閉,導致連接數過大。
問題的解決:
修改mysql的my.ini配置文件,網上的說法:mysql安裝目錄下的my.ini中設定的並發連接數太少或者系統繁忙導致連接數被占滿。
而項目實際上部署在linux系統上,需要找到my.cnf的配置文件,一般在etc/my.cnf,找到這個文件,添加如下行:
set-variable=max_connections=1000
set-variable=max_user_connections=500
set-variable=wait_timeout=200
之後重啟mysql,生效。
net stop mysql
net start mysql
max_connections: 為設置最大的連接數
max_user_connections:設置每用戶最大的 連接數500
wait_timeout:表示200秒後將關閉空閑連接,但對正在工作的連接不受影響。
//重新啟動MySQL後使用下面的命令查看修改是否成功
# mysqladmin -uroot -p variables
Password:
//可以看到以下項說明修改成功
| max_connections | 1000
| max_user_connections | 500
| wait_timeout | 200
解決方法二:
還有一個可能就是代碼裏打開了太多的連接,但是忘記了在finally塊裏面關閉,從而導致在處理大數據的時候,拋出異常。下面這樣的代碼就不會有異常了。
try{
conn=Good.getConnection();
stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE
, ResultSet.CONCUR_UPDATABLE);
String sql1="insert into cat_garbage values(‘"+rs.getInt("id")+"‘,‘"+rs.getInt("cid")+"‘,‘"+rs.getString("name")+"‘,‘"+rs.getString("keyword")+"‘)";
stmt.executeUpdate(sql1);
}
catch(SQLException|ClassNotFoundException|IOException e)
{
e.printStackTrace();
}
finally
{
if(stmt!= null)
stmt.close();
if(conn!= null)
conn.close();
}
要隨時記住關閉rs,stmt,conn等資源,學會使用finally,在finally中,這些語句一定會執行
How to increase MySQL connections(max_connections)?
Q: Every socket of MySQL Database will have defaults connections as 100 but I am looking for any way to increase the number of possible connections > 100 to a socket connection of MySQL Database.??
A:
If you need to increase MySQL Connections without MySQL restart do like below
mysql> show variables like ‘max_connections‘;
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 100 |
+-----------------+-------+
1 row in set (0.00 sec)
mysql> SET GLOBAL max_connections = 150;
Query OK, 0 rows affected (0.00 sec)
mysql> show variables like ‘max_connections‘;
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 150 |
+-----------------+-------+
1 row in set (0.00 sec)
These settings will change at MySQL Restart.
For permanent changes add below line in my.cnf and restart MySQL
max_connections = 150
Data source rejected establishment of connection, message from server: "Too many connections"