我正在尝试连接到Postgresql数据库,我收到以下错误:
错误:org.postgresql.util.PSQLException:致命:抱歉,已有太多客户
错误意味着什么,我该如何解决?
我的server.properties
文件如下:
serverPortData=9042
serverPortCommand=9078
trackConnectionURL=jdbc:postgresql://127.0.0.1:5432/vTrack?user=postgres password=postgres
dst=1
DatabaseName=vTrack
ServerName=127.0.0.1
User=postgres
Password=admin
MaxConnections=90
InitialConnections=80
PoolSize=100
MaxPoolSize=100
KeepAliveTime=100
TrackPoolSize=120
TrackMaxPoolSize=120
TrackKeepAliveTime=100
PortNumber=5432
Logging=1
答案 0 :(得分:129)
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
<强>要点:强>
您打开的数量超过了允许的数据库连接限制。你在循环中运行了这样的事情:Connection conn = myconn.Open();
,忘了运行conn.close();
。仅仅因为您的类被销毁并且垃圾收集不会释放与数据库的连接。最快的解决方法是确保您在创建连接的任何类中都有以下代码:
protected void finalize() throws Throwable
{
try { your_connection.close(); }
catch (SQLException e) {
e.printStackTrace();
}
super.finalize();
}
将该代码放在创建Connection的任何类中。然后,当您的类被垃圾收集时,您的连接将被释放。
运行此SQL以查看允许的postgresql最大连接数:
show max_connections;
默认值为100.好的硬件上的PostgreSQL一次可以支持几百个连接。如果您想拥有数千个,则应考虑使用连接池软件来减少连接开销。
详细了解一下谁/什么/何时/在哪里举行连接
SELECT * FROM pg_stat_activity;
当前使用的连接数为:
SELECT COUNT(*) from pg_stat_activity;
调试策略
您可以为可能没有释放连接的程序提供不同的用户名/密码,以找出它是哪一个,然后查看pg_stat_activity以找出哪个没有自行清理。
在无法创建连接时执行完整的异常堆栈跟踪,并按照代码备份到创建新Connection
的位置,确保创建连接的每个代码行都以connection.close();
如何设置更高的max_connections:
postgresql.conf中的max_connections设置了与数据库服务器的最大并发连接数。
SHOW config_file;
/var/lib/pgsql/data/postgresql.conf
max_connections=100
。max_connections的最大值是多少?
使用此查询:
select min_val, max_val from pg_settings where name='max_connections';
我得到了值8388607
,理论上这是你被允许的最多,但是一个失控的进程可能会占用数千个连接,而且令人惊讶的是,你的数据库在重启之前没有响应。如果你有一个合理的max_connections就像100.违规程序将被拒绝一个新的连接。
答案 1 :(得分:27)
我们不知道 server.properties 文件是什么,我们都不知道 SimocoPoolSize 是什么意思(对吗?)
我们猜测您正在使用一些自定义数据库连接池。然后,我想问题是您的池配置为打开100或120个连接,但Postgresql服务器配置为接受MaxConnections=90
。这些似乎是冲突的设置。尝试增加MaxConnections=120
。
但是,您应该首先了解您的数据库层基础架构,了解您正在使用哪个池,如果您确实需要池中的这么多打开的连接。而且,特别是,如果您正在优雅地将打开的连接返回到池
答案 2 :(得分:5)
无需增加MaxConnections&amp; InitialConnections。在完成工作后,请关闭您的连接。例如,如果要创建连接:
try {
connection = DriverManager.getConnection(
"jdbc:postgresql://127.0.0.1/"+dbname,user,pass);
} catch (SQLException e) {
e.printStackTrace();
return;
}
完成工作后关闭连接:
try {
connection.commit();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}
答案 3 :(得分:0)
违规行如下:
MaxConnections=90
InitialConnections=80
您可以增加值以允许更多连接。
答案 4 :(得分:0)
您需要关闭所有连接,例如: 如果您创建INSERT INTO语句,则需要以这种方式关闭语句和连接:
statement.close();
Connexion.close():
如果你创建一个SELECT语句,你需要以这种方式关闭语句,连接和结果集:
resultset.close();
statement.close();
Connexion.close();
我做了这个并且有效
答案 5 :(得分:0)
所有您需要做的就是在需要时在方法中调用连接,并在完成后在同一方法中关闭连接,这样就不会留下任何打开但没有使用的连接。我的示例java.class连接到我的数据库:
package test;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.swing.JOptionPane;
public class JCONNECT {
public static Connection CONN(){
try {
Class.forName("org.postgresql.Driver");
Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/db","postgres","test");
return conn;
}
catch(ClassNotFoundException | SQLException e){
JOptionPane.showMessageDialog(null,"FAILED TO CONNECT TO SERVER 04/n"+e,"CONNECTION FAILURE!",JOptionPane.WARNING_MESSAGE );
return null;
}
}
}
我使用的方法
public void OUTPUT(){
try{
Connection CONN = JCONNECT.CONN();
//======================================
//codes here*******************************
//======================================
CONN.close();
}catch(Exception E){JOptionPane.showMessageDialog(null, E);}
}