【问题标题】:If i create a Spring datasource, do i still need to define the datasource inside Tomcat context.xml?如果我创建一个 Spring 数据源,我还需要在 Tomcat context.xml 中定义数据源吗?
【发布时间】:2011-08-21 22:36:15
【问题描述】:

目前我们有一个应用程序,它使用 Tomcat context.xml 文件中的数据源进行配置。因此,我们能够通过检索 JNDI 名称并获得连接来成功获得连接。我想知道我们是否可以通过使用 Spring 数据源来替换它,并且我们是否仍然需要 context.xml 文件中的信息?

示例'context.xml':

<?xml version="1.0" encoding="UTF-8"?>
<Context>
    <Resource
        name="jdbc/myDataSource"
        auth="Container"
        type="javax.sql.DataSource"
        username="john"
        password="doe"
        driverClassName="<removed>"
        url="<removed>"
        maxActive="30"
        maxIdle="10"
        maxWait="1000"
        removeAbandonedTimeout="60"
        removeAbandoned="true"
        logAbandoned="true"/>
</Context>

所以在我们的代码中,我们搜索这样的 JNDI 上下文:

Context envCtx = (Context) initCtx.lookup(..);
DataSource ds = (DataSource) envCtx.lookup(..);
Connection connection = ds.getConnection();

我想知道我们是否可以更好地定义 Spring 数据源而不是使用这种方法,以及我们如何做到这一点?

【问题讨论】:

    标签: spring tomcat jdbc datasource


    【解决方案1】:

    我假设您的 dataSource 现在配置如下:

    <jee:jndi-lookup id="dataSource" jndi-name="jdbc/MyDataSource"/>
    

    如果你用这样的东西替换它:

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
        <property name="driverClassName" value="com.mysql.jdbc.Driver"/>
        <property name="url" value="jdbc:mysql://${jdbc.hostname}/${jdbc.schema}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
    </bean>
    

    DataSource Tomcat 中的配置不再需要

    在第一种情况下,连接池由 Tomcat 使用自己的实现来管理和公开。后一种配置(由于可移植性和减少对容器的依赖,我强烈推荐)不依赖于 Tomcat。相反,Spring 实例化了自己的连接池(请注意,池实现来自 DBCP 或 C3P0 等外部库),并且绝对没有引用 Tomcat JNDI 参考。

    【讨论】:

    • 那么如果我们像这样定义一个bean我们可以跳过context.xml文件吗?我添加了一些关于它现在如何使用的示例代码。
    • 现在我看到了您的编辑。您可以保留context.xml 文件,但利用Spring 并通过JNDI 查找dataSource,就像在我的第一个示例中一样使用第二个示例并完全跳过context.xml 和JNDI。
    【解决方案2】:

    Tomasz Nurkiewicz 可能已经回答了这个问题,但我想指出一些关于 commons-dbcp 与 tomcat jdbc 连接池的问题:后者比可移植和更通用的 commons-dbcp 有几个优势,其中之一重要的是:tomcat 连接池可能会更快并防止饥饿。以下是在做出决定之前可能有用的更多信息:http://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html

    【讨论】:

      【解决方案3】:

      将数据源定义放在 Spring 配置文件中通常意味着在开发、测试和生产环境之间移动时需要重新编译代码。将定义放在 context.xml 中意味着相同的二进制文件可以在任何环境中工作。

      【讨论】:

        猜你喜欢
        • 2011-09-09
        • 1970-01-01
        • 2015-07-25
        • 2014-09-25
        • 2018-02-01
        • 2011-12-18
        • 2011-12-30
        • 2015-01-04
        • 1970-01-01
        相关资源
        最近更新 更多