与DB的连接数超出了允许的限制。
这是我到目前为止所尝试的。
当用户成功登录时,我将一个连接对象添加到会话中:
Connection conn = DatabaseConnectionManager.getConnection();
sessionMap.put("Connection", conn);
然后,每当我需要数据库连接时,我都会从会话中获取它:
Map<String, Object> sessionMap = (Map<String, Object>) ActionContext.getContext().get("session");
Connection conn = (Connection) sessionMap.get("Connection");
在getConnection()
方法中,我打印调用方法的次数。
因此,虽然我从会话中获取Connection对象,但为什么连接数超过了50的允许限制?
JNDI代码:
Connection conn = null;
try {
Context initCtx = new InitialContext();
Context envCtx = (Context) initCtx.lookup("java:comp/env");
DataSource ds = (DataSource) envCtx.lookup("jdbc/MySqdb");
conn = ds.getConnection();
}
catch (NamingException ex) {
Logger.getLogger(DatabaseConnectionManager.class.getName()).log(Level.SEVERE, null, ex);
}
catch (SQLException sqle) {
sqle.printStackTrace();
}
System.out.println("connection: "+connection++);
return conn;
我使用过JNDI。连接数在允许的限制范围内。我不确定这是否正确,请告知。
答案 0 :(得分:2)
每个用户的一个连接根本不是一个好的解决方案。如前所述,您必须使用一些连接轮询,如果您想要简单的使用https://commons.apache.org/proper/commons-dbcp/。 如上所述:
为每个用户创建新连接可能非常耗时(通常 需要多秒的时钟时间),以便执行 数据库事务可能需要几毫秒。打开一个 在公共托管的Internet中,每个用户的连接可能是不可行的 应用程序,其中同时用户的数量可能非常大。 因此,开发人员通常希望共享一个开放的“池” 所有应用程序的当前用户之间的连接。数字 在任何给定时间实际执行请求的用户通常是 活跃用户总数的非常小的百分比 请求处理是数据库连接的唯一时间 需要。应用程序本身登录到DBMS,并处理任何 用户帐户内部问题。
您可以在http://svn.apache.org/viewvc/commons/proper/dbcp/trunk/doc/
找到样本