所以我正在开发一个网络服务,它应该处理大量的负载。我使用了 snaq DBpooling。但问题是我总是收到错误
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Data source rejected
establishment of connection, message from server: "Too many connections"
我检查了其他线程,主要问题是 conn.close() 调用不当。但在这里,我按照到处建议的那样在finally方法中调用它。这是我的代码。你能建议一下有什么问题吗?
public class ExampleServlet extends HttpServlet {
public static final String MESSAGE = "message";
private String message;
private ConnectionPool pool;
@Override
public void init(final ServletConfig config) throws ServletException {
super.init(config);
message = config.getInitParameter(MESSAGE);
try {
Class c = Class.forName("com.mysql.jdbc.Driver");
Driver driver = (Driver) c.newInstance();
DriverManager.registerDriver(driver);
String url = "jdbc:mysql://localhost/db15619";
pool = new ConnectionPool("local", 20, 25, 30, 180, url, "root", "db15319root");
} catch (/*InstantiationException | ClassNotFoundException | SQLException */ Exception ex) {
System.out.println("Error:" + ex.toString());
}
}
@Override
protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
PrintWriter writer = resp.getWriter();
//System.out.println(req.getQueryString());
String[] string_key = req.getQueryString().split("=|\\&");
//exchange.getResponseHeaders().put(Headers.CONTENT_TYPE, "text/plain");
string_key[3] = string_key[3].replace('+', ' ');
String query_str = "select tweetid,score,tweettext from tweets where userid = '" + string_key[1] + "' and dttm = '" + string_key[3] + "';";
Connection conn = null;
long timeout = 10000;
try {
conn = pool.getConnection();
} catch (SQLException ex) {
System.out.println("Error While Creating Connection :=> " + ex.toString());
}
if (conn != null) {
try {
Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery(query_str);
String str = "CloudNinjas," + "0369-8371-3735" + "," + "9830-4777-6269" + "," + "3472-5239-0207" + "\n";
while (rs.next()) {
for (int i = 1; i <= 3; i++) {
str = str + rs.getString(i);
if (i != 3) {
str = str + ":";
} else {
str = str + "\n";
}
}
}
byte[] bytes = str.getBytes(Charset.forName("UTF-8"));
System.out.println(str);
System.out.println(bytes);
writer.write(str);
} catch (SQLException ex) {
System.out.println("Error While Creating Connection :=> " + ex.toString());
} finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException ex) {
}
}
}
}
writer.close();
}
@Override
protected void doPost(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
最佳答案
同时访问池的客户端太多,或者某些客户端没有归还其连接。我认为是后者。
您可以尝试通过使用一个小池(例如 5 个)顺序进行单个调用来测试,并查看问题是否出现在第 6 个调用上。这表明客户没有正确清理。
创建 JDK7 尝试资源功能是因为很多人都有同样的问题(例如: How should I use try-with-resources with JDBC? )。
我还发现您没有关闭 Statement
或 Resultset
(请参阅 Must JDBC Resultsets and Statements be closed separately although the Connection is closed afterwards? ),这可能与其他问题相关或导致其他问题。
关于java - 使用数据库池时出现太多连接错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26769908/