使用我们的J2EE应用程序遇到以下错误:
java.sql.SQLException:分配连接时出错。原因:正在使用的连接等于max-pool-size和expired max-wait-time。无法分配更多连接。
我如何知道应用程序当前使用了多少连接,以及为高流量应用程序设置的最佳连接池设置应该是什么?我可以更改它吗?如何确定应该将其设置为什么(是内存问题,带宽等)?
答案 0 :(得分:5)
如何知道连接多少 应用程序目前正在使用
您没有提供足够的信息来回答这个问题。大多数应用服务器都会对此类内容进行某种JMX报告。或者,根据数据库,您可以找到当前打开的连接数。
什么应该是最佳连接 大量流量的池设置 应用程序了
高于你的水平?
上述当然假设您没有错误处理连接。我的意思是,如果你在代码中直接使用它们,你应该总是使用这个成语:
Connection conn = null;
try {
conn = ... ; // get connection
// do stuff
} finally {
if (conn != null) try { conn.close(); } catch (Exception e) { }
}
如果您没有释放连接回池并且正在等待垃圾收集器清理并释放它们,那么您将使用更多实际需要的连接。
答案 1 :(得分:2)
您确定要关闭所需的一切吗?看看here。
确保关闭进入finally块。您将在链接中看到此代码:
finally
{
closeAll(resultSet, statement, connection);
}
我帮助其他人找到了类似的问题(他们的内存问题反过来了......但是如果这个过程已经持续了很长时间就会有这个结果)他们没有关闭结果集或连接。
答案 2 :(得分:2)
首先要检查的是你是否有资源泄漏。尝试使用jconsole或jvisualvm进行监视,以了解您的应用程序的行为以及是否有任何东西出现在眼睛中。
然后实际的jdbc池连接本质上是Java EE容器特定的,因此您需要提供更多信息。
答案 3 :(得分:0)
我认为你可能需要检查自己一些问题,这里有一些要考虑的问题:
一个。您是否正确使用了连接,是否关闭它们并在使用后将它们返回池中?
B中。您使用长期运行的交易,例如与用户“对话”?如果用户终止他对应用程序的使用,他们可以挂起吗?
℃。您是否设计了适合您应用的数据访问?例如。你是否经常在重复读取的区域使用缓存技术?
d。你的连接池足够大吗? 5年前,我有一个应用程序,同时连接250个Oracle数据库,远远超出了你通常认为的开箱即用的数据库。在50上运行应用程序不起作用。
要提供更详细的答案,您需要提供有关该应用的更多信息。
祝你好运!