【问题标题】:mysql show processlist shows 11 connections that never go awaymysql show processlist 显示 11 个永不消失的连接
【发布时间】:2016-03-09 10:42:44
【问题描述】:

我有一个使用javax.sql.DataSource 的网络服务,如下所示:

public class AccessMysql {

 private static DataSource dataSource=null;

    public  AccessMysql(){
      if (dataSource == null){
        dataSource = DataSourceBuilder
                .create()
                .username("[username]")
                .password("[password]")
                .url("jdbc:mysql://[server]/testdb")
                .driverClassName("com.mysql.jdbc.Driver")
                .build();
      }
    }
...
}

这个类第一次运行下面的mysql命令:

show processlist

显示 11 个连接。

该服务可以多次访问数据库,而我的连接数(如通过“show processlist”所示)始终保持在 11。

这 11 个连接会自行消失吗?有什么办法可以从 Java 中关闭它们?

【问题讨论】:

  • 你认为连接池是如何工作的?
  • @Gergely Bacso - 感谢您的编辑。我已禁用用户/密码。我不敢相信我做到了。在喝完第三杯咖啡之前,不要再在 stackoverflow 上发帖了。

标签: java mysql spring jdbc


【解决方案1】:

如果你检查DataSourceBuilder的代码,你会看到如果它没有得到你的具体指令,它将创建一个池化数据源(类型根据可用的类而有所不同)类路径):

private static final String[] DATA_SOURCE_TYPE_NAMES = new String[] {
        "org.apache.tomcat.jdbc.pool.DataSource",
        "com.zaxxer.hikari.HikariDataSource",
        "org.apache.commons.dbcp.BasicDataSource" };

这些池化数据源将保持打开 X(在您的情况下可能是 10)个连接数,以便在需要时节省打开新连接的时间。这就是connection-pooling的概念。

【讨论】:

  • 明白了。因此该服务已准备好 10 个打开的连接以备不时之需。有没有办法设置超时,如果它们在 X 分钟内不活动,它们就会被拆除?
  • 是的,当然。但是,在这种情况下,您需要手动配置,而不是将其留给 Spring 自动配置。选择您喜欢的池化解决方案并进行相应配置。看看这个:stackoverflow.com/questions/25573034/…
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 2011-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多