【问题标题】:Setting up Tomcat JDBC connection pool with the Spring JDBCTemplate使用 Spring JDBCTemplate 设置 Tomcat JDBC 连接池
【发布时间】:2025-12-05 07:20:02
【问题描述】:

我正在尝试在我的 Java Web 应用程序中设置一个 Tomcat 连接池(到 MySQL),同时使用 Spring JDBCTemplate。

这是创建连接池的Java类:

@Configuration
public class DataAccessConfiguration {

    @Bean(destroyMethod = "close")
    public javax.sql.DataSource datasource() {
        org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
        ds.setDriverClassName("org.h2.Driver");
        ds.setUrl("jdbc:h2:java-config");
        ds.setUsername("sa");
        ds.setPassword("");
        ds.setInitialSize(5);
        ds.setMaxActive(10);
        ds.setMaxIdle(5);
        ds.setMinIdle(2);
        return ds;
    }

    @Bean public JdbcOperations tpl() {
        return new JdbcTemplate(datasource());
    }

}

这就是我获得ApplicationContext 的方式(例如在 main 方法中):

   public static void main(String[] args) {
      ApplicationContext context = 
             new ClassPathXmlApplicationContext("Beans.xml");

我应该如何在Beans.xml 文件中定义DataAccessConfiguration 类以便Spring 知道使用它?

**

更新:

**

这是实际的配置方法:

public javax.sql.DataSource datasource() {
        org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
        PoolProperties p = new PoolProperties();
        p.setUrl("jdbc:mysql://localhost:3306/mysql");
        p.setDriverClassName("com.mysql.jdbc.Driver");
        p.setUsername("root");
        p.setPassword("");
        p.setJmxEnabled(true);
        p.setTestWhileIdle(false);
        p.setTestOnBorrow(true);
        p.setValidationQuery("SELECT 1");
        p.setTestOnReturn(false);
        p.setValidationInterval(30000);
        p.setTimeBetweenEvictionRunsMillis(30000);
        p.setMaxActive(100);
        p.setInitialSize(10);
        p.setMaxWait(10000);
        p.setRemoveAbandonedTimeout(60);
        p.setMinEvictableIdleTimeMillis(30000);
        p.setMinIdle(10);
        p.setLogAbandoned(true);
        p.setRemoveAbandoned(true);
        p.setJdbcInterceptors(
                "org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;"+
                "org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer");
        ds.setPoolProperties(p);
        return ds;
    }

你能帮忙改写Beans.xml吗?

【问题讨论】:

  • 默认名称为dataSource
  • @LuiggiMendoza 我也应该提供课程吗?如果是这样,应该是哪个班级?数据访问配置?
  • 如果有组件扫描,你的Beans.xml 中有什么确保@Configuration 类被拾取,否则只需将它作为 bean 添加到你的 xml 文件中。
  • 在 main 方法中使用 new AnnotationConfigApplicationContext(DataAccessConfiguration.class) 而不是 ClassPathXmlApplicationContext("Beans.xml")。
  • 或者如果你真的,真的想要/需要保留新的 ClassPathXmlApplicationContext("Beans.xml") 然后把 放到你的 Beans.xml 中。但是,如果您没有其他基于 XML 的 bean,这将毫无用处。

标签: java mysql spring tomcat jdbctemplate


【解决方案1】:

对于属性中传递的值,setter 方法存在。因此基于 XML 的 bean 定义如下:

<bean  name="dataSource" class="org.apache.tomcat.jdbc.pool.DataSource">
  <property name="url" value="jdbc:mysql://localhost:3306/mysql"/>
  <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
  ....
</bean>

<bean name="tpl" class="org.springframework.jdbc.core.JdbcTemplate">
  <property name="dataSource" ref="dataSource"/>
</bean>

【讨论】:

  • 我不明白你的最后一句话——我不能使用第一个 bean 中的所有属性吗?
  • 你可以按照我写的方式设置bean的所有属性。在最后一句话中,我试图表明,与基于 PoolProperties 的 Java 代码相比,基于 XML 的定义导致 Java 执行路径略有不同。但是现在我也看到我最后一句话不正确,删掉了。
  • 为什么执行不同?是否有可以在 bean 定义中使用的所有属性的列表?非常感谢您的帮助
  • XML 定义导致 Java 代码等效于 org.apache.tomcat.jdbc.pool.DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource(); ds.setUrl(...); ds.setDriverClassName(...);您的原始代码在两者之间使用了 PoolProperties。但差异根本不重要。也可以使用 PoolProperties 设置 XML,但不是我链接的方式。
  • bean定义的属性是Java Beans Properties。您在给定 bean 类的 JavaDoc 中找到的任何内容 - 例如 DataSource 或 JdbcTemplate - 具有 setXxxx 和 getXxx 方法(以简化方式表示) - 可能是 标记中可用的属性。
【解决方案2】:
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource"
    destroy-method="close">
    <property name="jdbcUrl" value="#{config['db.url']}" />
    <property name="driverClass" value="#{config['db.driver']}" />
    <property name="user" value="#{config['db.username']}" />
    <property name="password" value="#{config['db.password']}" />
    <property name="acquireIncrement" value="1" />
    <property name="idleConnectionTestPeriod" value="300" />
    <property name="minPoolSize" value="1" />
    <property name="maxPoolSize" value="20" />
</bean>

<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
    <property name="dataSource" ref="dataSource" />
</bean>

【讨论】: