Java 为什么这个简单的JDBC/JOOQ代码会创建10个到我的数据库的连接?

Java 为什么这个简单的JDBC/JOOQ代码会创建10个到我的数据库的连接?,java,mysql,spring-boot,jdbc,jooq,Java,Mysql,Spring Boot,Jdbc,Jooq,我正在使用SpringToolSuite在本地环境上运行一个spring项目。我正在使用Putty创建一个tunel来访问一个应用服务器,我可以从中查询我的MySQL数据库(我必须使用SSH)。所以我运行这个简单的代码: public static void getConnection() { try { connection = DriverManager.getConnection(url, user, password); } cat

我正在使用SpringToolSuite在本地环境上运行一个spring项目。我正在使用Putty创建一个tunel来访问一个应用服务器,我可以从中查询我的MySQL数据库(我必须使用SSH)。所以我运行这个简单的代码:

public static void getConnection() {
        try {
            connection = DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        DSLContext create = DSL.using(connection, SQLDialect.MYSQL);

        Personne personne = Personne.PERSONNE.as("personne");
        Evenement evenement = Evenement.EVENEMENT.as("evenement");
        Genealogie genealogie = Genealogie.GENEALOGIE.as("genealogie");
        Lieu lieu = Lieu.LIEU.as("lieu");
        
        Result<Record3<Integer,Integer,String>> result = create
                .select(DSL.countDistinct(personne.ID).as("countRs"), 
                        evenement.IDGROUPE2.as("group2Rs"),
                        lieu.LIBELLE.as("libelleRs"))
                .from(evenement.innerJoin(personne)
                            .on(personne.ID.eq(evenement.IDPERS))
                        .innerJoin(genealogie)
                            .on(genealogie.ID.eq(personne.IDGEN))
                        .innerJoin(lieu)
                            .on(lieu.ID.eq(evenement.IDGROUPE2)))
                .where(personne._NOM.eq(" ")
                        .and((personne._PRENOM.eq(" ")
                            .or(personne._PRENOM.like(" -%"))))
                        .and(evenement.IDPERS.isNotNull())
                        .and(lieu.LIBELLE.isNotNull())
                        .and(genealogie.STATUS.ge(Byte.valueOf("1")))
                        .and(personne.CONTEMPORAIN.eq(Byte.valueOf("0"))))
                .groupBy(evenement.IDGROUPE2)
                .fetch();

        System.out.println("countRs group2Rs libellesRs");
        System.out.println("---------------------------");
        for (Record r : result) {
            System.out.println(r.get("countRs")+" "+r.get("group2Rs")+" "+r.get("libelleRs"));
        }
        
        try {
            create.close();
            connection.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    } 
publicstaticvoidgetconnection(){
试一试{
connection=DriverManager.getConnection(url、用户、密码);
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
DSLContext create=DSL.using(connection,sqldial.MYSQL);
Personne Personne=Personne.Personne.as(“Personne”);
Evenment=Evenment.Evenment.as(“Evenment”);
系谱系谱=系谱.系谱.as(“系谱”);
LIUE LIUE=LIUE.LIUE.as(“LIUE”);
结果=创建
.选择(DSL.countDistinct(personne.ID).as(“countRs”),
晚上。IDGROUPE2.as(“group2Rs”),
代之以诽谤者(以下简称“诽谤者”)
.from(晚上)innerJoin(人事)
.on(人员ID.eq(夜间IDPERS))
.innerJoin(家谱)
.on(家谱ID.eq(人事ID)
.innerJoin(代替)
.on(liue.ID.eq(evennement.IDGROUPE2)))
.其中(人员名称eq(“”)
.及((人事平等(“”)
.或(人员_PRENOM.like(“-%”)))
.和(evennement.IDPERS.isNotNull())
.和(liue.LIBELLE.isNotNull())
.和(generalogie.STATUS.ge(Byte.valueOf(“1”))
.和(人员同期eq(字节值为(“0”)))
.groupBy(evennement.IDGROUPE2)
.fetch();
System.out.println(“countRs group2Rs libellesRs”);
System.out.println(“-------------------------------”;
记录(r:结果){
System.out.println(r.get(“countRs”)+“”+r.get(“group2Rs”)+“”+r.get(“诽谤者”);
}
试一试{
create.close();
connection.close();
}捕获(SQLE异常){
//TODO自动生成的捕捉块
e、 printStackTrace();
}
} 
正如您所看到的,基本上只是打开与数据库的连接,进行查询并关闭连接/查询,没有什么特别的

但当我使用MySQL Workbench检查与数据库的客户端连接时,我可以看到我的代码打开了10个连接:

如您所见,这些连接中只有一个实际执行查询。
关于JOOQ如何执行查询,有什么我不知道的吗?或者可能是因为我正在使用Putty访问我的远程服务器,并且它以某种方式创建了许多连接?

由于您在项目中使用HikariCP,您不应该使用
DriverManager手动创建新连接:

//不要这样做
connection=DriverManager.getConnection(url、用户、密码);
DSLContext create=DSL.using(connection,sqldial.MYSQL);
相反,将HikariCP用作
数据源
,并将其传递给jOOQ:

//这样做
DSLContext create=DSL.using(dataSource,sqldial.MYSQL);

现在,您不必再进行任何资源管理,因为jOOQ/Hikari会在幕后为您执行此操作(即,不进行
close()
调用)

您的程序应该使用语句正确处理
连接。不必关闭jOOQ
DSLContext
。但除此之外,您的代码片段并不能解释打开的连接。你的程序有终止过吗?嗨,我知道了,希望不是关于JOOQ或Putty的。它实际上是我的spring boot项目的默认配置。默认情况下,HikariCP配置为创建包含10个连接的连接池。我没想到spring会自己管理一个连接池,而10个默认连接对我来说似乎太多了,所以我认为它与代码更相关。无论如何谢谢你!我通过将
spring.datasource.hikari.maximumPoolSize=5
添加到application.properties文件中,成功地更改了池的大小。最后,我仍然必须调用connection对象的close(),它似乎不会自动释放。@Mechanizen:仔细查看。我的上一个示例使用的是
javax.sql.DataSource
,而不是
java.sql.Connection
。使用jOOQ,您几乎不需要自己访问JDBC
连接