【发布时间】:2013-04-11 02:19:25
【问题描述】:
我使用 Tomcat 和 mySQL 已经有一段时间了,但最近一直在设法最大限度地利用我的连接。我不知道为什么,因为我的代码在完成后会打开和关闭连接。例如,这是我的连接和关闭方法:
public void closeConnection(){
try {
con.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
public void connect(){
try {
initCtx = new InitialContext();
} catch (NamingException e) {
e.printStackTrace();
}
try {
envCtx = (Context) initCtx.lookup("java:comp/env");
} catch (NamingException e) {
e.printStackTrace();
}
try {
ds = (DataSource) envCtx.lookup("jdbc/TestDB");
} catch (NamingException e) {
e.printStackTrace();
}
}
这是执行泛型语句的基本方法:
public void excuteStatement(String query){
connect();
try {
con = ds.getConnection();
con.createStatement().executeUpdate(query);
} catch (Exception ex ){
} finally {
if (con != null)
closeConnection();
}
}
这种代码是否会导致连接保持打开状态?我得到了我需要的所有数据,99% 的时间一切正常。
这是我在 Tomcat context.xml 中的配置:
<Resource name="jdbc/TestDB" auth="Container" type="javax.sql.DataSource"
maxActive="100" maxIdle="30" maxWait="10000"
username="myUserName" password="myPass" driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://xxx.xxx.xxx.xxx:0000/myUserName"/>
现在我被锁定了,因为我有最大的连接数。我应该减少等待时间以避免这种情况吗?
关于我的代码,我应该说一件事,它经常会在大循环中触发许多多条语句。我认为也许这种快速打开和关闭可能是问题所在。由于我的 Tomcat servlet 始终在运行,它是否应该只打开一次连接并通过检查使其保持打开状态以确保其仍然处于活动状态,而不是始终打开连接并关闭它?
感谢您对此提出的任何建议。
【问题讨论】:
-
写下您的问题 - 当您的连接达到最大时您的应用会挂起吗?如果是这样,您的代码中的同步锁和表锁的组合可能会出现问题
-
您看到的实际问题是什么?看起来您正在使用连接池,因此您的连接不会真正被关闭,只需放回池中即可。这或许可以解释为什么您的连接保持打开状态!
-
我应该如何使用连接池?问题是数据库最大化连接。该应用程序没有挂起它只是无法获取任何数据。
-
你的意思是它不能获得任何新的连接吗?现有的连接(以及使用它们的线程)在做什么?查询“卡住”了吗?您应该能够从 mysql 和/或使用 java profiler 中找到它
标签: java mysql database apache tomcat