在 spring Web 应用程序中创建数据源的正确方法是什么?

What is the proper way to create a datasource in a spring web application?

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

  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 创建数据源有什么好处和问题?

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

<!-- 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/

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

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

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

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

其中没有什么比好的做法更好的了。好的是适合用例的。两者各有利弊。

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

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

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

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

最佳做法是不要在您编写的任何代码中公开数据库配置。始终最好在服务器控制台内部进行配置并将其公开为 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>

这里的重点是不要公开数据库配置。