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

时间:2017-04-07 17:11:06

标签: java spring tomcat jndi spring-jdbc

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

  1. 内部春天背景

    <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

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

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

4 个答案:

答案 0 :(得分:3)

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

建议在j2ee容器中使用第二种使用jndi数据源的方法。

以下参考文献清楚地说明了这些方法。

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

答案 1 :(得分:3)

其中没有什么比这更好的做法了。好的是有利于用例的那个。他们都有利有弊。

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

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

总结一下,应用程序非管理数据源的用例更适合用于JNDI上下文。

尝试弄清楚应用程序的部署模型是什么,并找出对您有用的内容。还尝试使用datasourcepool实现来提高性能,如DBCP,C3P0或Hikarcp。

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

这里的关键注意事项是不要公开数据库配置。