java - 为什么在这种情况下数据库连接没有关闭

标签 java dbconnection

我观察到在 MYSQL 提示符上运行命令时数据库连接没有关闭

 show status like 'Conn%';

连接数持续增加

这就是我建立数据库连接的方式

package com.conn;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

import org.apache.log4j.Logger;


public class DBConnection {
     final static Logger logger = Logger.getLogger(DBConnection.class);
 private static DataSource dataSource;
    static {
            try {
                  dataSource = (DataSource) new InitialContext().lookup("java:/comp/env/jdbc/MYDATABASE");
            } catch (NamingException e) {
                try {
                    throw new Exception("'jndifordbconc' not found in JNDI",e);
                } catch (Exception e1) {
                  logger.error(e1);
                }
            }
        }





 public static Connection getDBConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
               logger.error(e);
            return null;
        }

    }




    public static void close(Connection con)
    {
        if (con != null)
        {
            try
            {
                con.close();
            }
            catch (SQLException e)
            {
                   logger.error(e);
            }
        }
    }

    public static void close(Statement stmt, ResultSet rs) 
    {
        if (rs != null)
        {
            try
            {
                rs.close();
            }
            catch (SQLException e)
            {
                   logger.error(e);
            }
        }
        if (stmt != null)
        {
            try
            {
                stmt.close();
            }
            catch (SQLException e)
            {
                  logger.error(e);
            }
        }
    }
}

<Resource name="jdbc/MYDATABASE"
      auth="Container"
      type="javax.sql.DataSource"
      driverClassName="com.mysql.jdbc.Driver"
       url="jdbc:mysql://localhost:3306/Test?allowMultiQueries=true"
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory"
     username="root"
      password="Meridian@123"
     initialSize="5"
      maxActive="25"
      maxIdle="10"
     minIdle="10"
    defaultTransactionIsolation="READ_COMMITTED"
     suspectTimeout="60"
     timeBetweenEvictionRunsMillis="3400"
     minEvictableIdleTimeMillis="5500"
    validationQuery="SELECT 1"
    validationInterval="3400"
    testOnBorrow="true"
    removeAbandoned="true"
    removeAbandonedTimeout="55"
    jmxEnabled = "true"
    closeMethod="close"
      />

这就是我建立连接和关闭连接的方式

dbConnection = DBConnection.getDBConnection();

public class AutofillArea {
    final static Logger logger = Logger.getLogger(AutofillArea.class);
    @GET
    @Consumes("application/text")
    @Produces("application/json")
    public String getData(
            @QueryParam("city") String city ,
            @QueryParam("area") String  area 

            )
    {
        city = Utility.getProperString(city);
        area = Utility.getProperString(area);

        String response =" ";
        Connection dbConnection = null;
        PreparedStatement statePreparedStmt = null;
        ResultSet stateResultSet = null;
        JSONArray jsonarray = new JSONArray();
        try
        {
            String sql = "select distinct area from mytable where city = ?;";
            dbConnection = DBConnection.getDBConnection();
            statePreparedStmt = dbConnection.prepareStatement(sql);
            statePreparedStmt.setString(1 ,city);
            stateResultSet = statePreparedStmt.executeQuery();
            while(stateResultSet.next())
            {
                jsonarray.put(stateResultSet.getString("area"));
            }
            response = "jsonCallbackarea("+jsonarray.toString()+")";
        }
        catch(Exception e)
        {
            logger.error(e);
        }

        finally
        {
            try
            {
                DBConnection.close(statePreparedStmt,stateResultSet);   
            }
            catch(Exception e)
            {
                logger.error(e);
            }

            try
            {
                DBConnection.close(dbConnection);   
            }
            catch(Exception e)
            {
                logger.error(e);
            }

        }
        return response;
    }
}

您能告诉我如何解决这个问题吗?

最佳答案

您正在使用连接池。您的池最多可以创建 25 个连接。当你关闭一个连接时,它并不是真正关闭,而是释放到池中。

关于java - 为什么在这种情况下数据库连接没有关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36219694/

相关文章:

java - 如何组织一个 Swing GUI 应用程序?

java - 检测点击的卡片

java - 向 DatagramSocket 添加超时-receive()

java - 打包应用程序时获取包 org.springframework.transaction.annotation 不存在错误

sql - 正确查询以获取 PostgreSQL 数据库中的当前连接数

java - 创建 Activity RAR 时出错 + 在 JAVA 中找不到 ResourceAdapterImpl 类

java - 如何在用 Java 编写的 AWS Lambda 中处理 SNS 消息?

mysql - sysbench 连接错误 - MySQL 8

c# - DataReader (DbCommand) 如何处理 DB 通信?

c# - 有没有办法只在 dapper 中读取未提交的行?