当前位置: 首页 > 知识库问答 >
问题:

tomcat jdbc池在连接重用方面有一些不同的行为

訾高飞
2023-03-14

我已经在web应用程序中配置了Tomcat JDBC池,并在8.0.38版本中添加了maven依赖项,这也是我的Tomcat版本。现在,我从该池中获取连接,并检查autoCommit属性的值,该值为“true”,然后将该连接的autoCommit设置为“false”。然后提交事务,然后关闭连接。现在,我从pool获得了另一个连接,并检查了autoCommit属性的值,它是“false”。但我以为这是真的。我还使用Apache通用DBCP2池库,但没有这种行为。每当我从公共DBCP2池获得连接时,它都会返回autoCommit设置为“true”的连接。我已经测试并看到了tomcat jdbc池的这种行为。

Connection con1 = basicDataSourceWrite.getConnection();
con1.setAutoCommit(false);
System.out.println(con1.getAutoCommit()+ " con1  " );
con1.commit();
con1.close();

Connection con2 = basicDataSourceWrite.getConnection();
System.out.println(con2.getAutoCommit()+ " con2  " );
<bean id="basicDataSourceWrite" class="org.apache.tomcat.jdbc.pool.DataSource" destroy-method="close">
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="${mysqlEndpointWrite}" />
    <property name="username" value="${mysqlUserWrite}" />
    <property name="password" value="${mysqlPasswordWrite}" />
    <property name="defaultAutoCommit" value="true" />
    <property name="initialSize" value="4" />
    <property name="maxActive" value="5" />
</bean>

在这里,将defaultAutoCommit设置为“true”对我来说甚至不起作用。它总是返回带有autoCoomit false的连接。

所以我想知道DBCP2是如何管理这一点的,以及如何在tomcat JDBC池中实现这一点?

共有1个答案

盖诚
2023-03-14

这是Tomcat JDBC的一个已知bug(或者更确切地说是一个特性,因为它还没有被修复)。

设置DefaultAutoCommit的值是不够的,您还需要启用拦截器来实际执行这些设置。这将使DefaultAutoCommit值影响连接。

<property name="jdbcInterceptors" value="ConnectionState" />
 类似资料:
  • 我对HikariCP很陌生,我遇到了一个问题。我有一个使用hikaridaTasource从数据库获取连接的方法: 但是,当我检查pgAdmin(这是一个PostgreSQL db btw)时,我看到它没有使用空闲连接,而是创建了一堆新连接。我怎么才能修好这个? 您可以看到,在第一个图像中有19个连接,其中18个是空闲的。但是,在查询之后,会有一堆新的连接,其中大多数是空闲的。我配置Hikari错

  • 下面的代码使用的是ApacheHTTP客户端4.5版本的池连接管理器。如果我发出50个请求,我会在netstat中看到50个不同的tcp端口被使用,但在任何时候都最多使用5个连接。我在wire shark中也看到了filter

  • 我们如何使用tomcat jdbc为同一个数据库配置两个不同的模式。我们是否需要为不同的模式创建两个不同配置的tomcat jdbc池连接,或者是否可以配置一个jdbc连接池,然后使用该连接池连接到两个不同的模式。

  • 使用来自DBCP的BasicDataSource,如果我们执行getConnection()并且在最后一个块中我们关闭连接,它是真的将连接返回到池还是关闭连接。我正在检查的代码片段是这样的 我正在检查BasicDataSource的源代码,并访问了这个包装类以获取连接。 委托对象的类型为java。sql。联系包装器代码调用委托的close方法,该方法将关闭集合,而不是将连接返回到池。这是DBCP的

  • 我使用sbt start运行系统,并使用apache Benchmark进行测试: 问题是播放仅使用池中的7或8个连接,而其他mysql连接空闲,同时有请求,为什么?