【问题标题】:What is the proper way to create a datasource in a spring web application?在 Spring Web 应用程序中创建数据源的正确方法是什么?
【发布时间】:2017-04-07 17:11:06
【问题描述】:

我有两种创建数据源的方法:

  1. 在 spring 上下文中

    <bean id="dataSource"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    
    <property name="driverClassName" value="com.mysql.jdbc.Driver" />
    <property name="url" value="jdbc:mysql://localhost:3306/mkyongjava" />
    <property name="username" value="root" />
    <property name="password" value="password" />
    

  2. Tomcat JNDI

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="java:comp/env/jdbc/UsersDB"/>

使用spring或者tomcat jndi创建数据源有什么好处和问题?

【问题讨论】:

    标签: java spring tomcat jndi spring-jdbc


    【解决方案1】:

    其中没有什么比得上好的做法。好的是对用例有益的。它们各有利弊。

    当您尝试在服务器环境中部署应用程序时,其中多个应用程序共享一个公共数据源或数据源组件由服务器管理部门管理时,那么最好的使用方式可能是通过 JNDI 上下文。服务器已准备好数据源,以便应用程序可以直接获取该对象、绑定到自身并使用数据源。

    如果您有应用程序在嵌入式服务器容器或云容器中运行的用例,其中服务器也嵌入在构建包中,在应用程序中创建数据源并使用它们将是一个很好的解决方案。同样在非 Web 应用程序环境中创建数据源会很好。

    总而言之,数据源不受应用程序管理的用例最好使用 JNDI 上下文。

    试着弄清楚你的应用程序的部署模型是什么,并找出什么对你有好处。还可以尝试使用数据源池实现来提高性能,例如 DBCP、C3P0 或 Hikarcp。

    【讨论】:

    • 我正在使用heroku。所以我的案例是在嵌入式服务器中运行的应用程序。
    • 可以使用来自 DBCP 的 BasicDataSource,它已经内置了连接池。根据我在 Heroku 上的经验,它也提供了更好的性能。
    • 我猜我的应用程序打开了比我想要的更多的连接。因为每次 Spring JDBC Template 执行查询时,DriverManagerDataSource 都会打开一个新连接并关闭它。使用 DBCP 的 BasicDataSource 它将重用连接而不是打开新连接?
    • 是的,这完全正确。 DBCP 管理底层的连接池,每次当您请求连接时,它都会从该池返回。它不会打开任何新连接或关闭任何连接。
    • 非常感谢!我会试试这个解决方案。
    【解决方案2】:

    第一种方法,使用类 DriverManagerDataSource,对于 j2ee 容器之外的测试或独立环境很有用。

    第二种方式,使用jndi数据源,推荐在j2ee容器中使用。

    下面的参考资料清楚地说明了这些方法。

    http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/jdbc/datasource/DriverManagerDataSource.html

    【讨论】:

      【解决方案3】:

      我正在使用它,如下所示。对我有用,因为项目是在架构设计时配置的。并且它正在生产中。

      <!-- Local Apache Commons DBCP DataSource that refers to a combined database -->
          <!-- (see dataAccessContext-jta.xml for an alternative) -->
          <!-- The placeholders are resolved from jdbc.properties through -->
          <!-- the PropertyPlaceholderConfigurer in applicationContext.xml -->
          <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
              <property name="validationQuery" value="${jdbc.validationquery}"/>
              <property name="testOnBorrow" value="${jdbc.testonborrow}"/>
              <property name="driverClassName" value="${jdbc.driverClassName}"/>
              <property name="url" value="${jdbc.url}"/>
              <property name="username" value="${jdbc.username}"/>
              <property name="password" value="${jdbc.password}"/>
          </bean>
      
      
          <!-- Transaction manager for a single JDBC DataSource -->
          <!-- (see dataAccessContext-jta.xml for an alternative) -->
          <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
              <property name="dataSource" ref="dataSource"/>
          </bean>
      

      你也可以参考这个。 Genious 对 java 开发者的最佳贡献。

      https://www.mkyong.com/spring-boot/spring-boot-jdbc-oracle-database-commons-dbcp2-example/

      【讨论】:

      • 你为什么使用 transactionManager ?
      • 您没有回答问题。他在问这两者之间有什么区别以及最好的方法是什么。他不是要求复制粘贴示例....
      • 我知道两者各有利弊。我认为这需要经验来判断哪种做法好与不好。
      • 我不是说哪个最好的合适人选。但我个人会依赖spring的实现。已被大多数用户证明和使用。
      • 我使用事务管理器来管理角色回溯并满足应用程序中的 ACID 属性。
      【解决方案4】:

      最佳做法是不要在您编写的任何代码中公开数据库配置。始终最好在服务器控制台内进行配置并将其公开为 jndi。在spring配置文件中,获取数据库实例为:

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

      并将数据库事务管理器配置为:

      <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
          <property name="dataSource" ref="dataSource"/>
      </bean>
      

      这里的重点是不要暴露数据库配置。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        • 1970-01-01
        • 2021-04-18
        • 2010-09-06
        • 2019-08-06
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多