2017-04-07 65 views
2

我有两种方法来创建数据源:在Spring Web应用程序中创建数据源的正确方法是什么?

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

回答

3

有没有像之间的这种好的做法。好的一个是对用例很好的一个。他们都有优点和缺点。

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

当u有使用情况的应用程序所在服务器也沿着构建包与应用程序中创建数据源,并利用它们将是一个很好的解决方案嵌入到嵌入式服务器容器或容器云中运行。另外在非web应用程序环境中创建数据源会很好。

总之,在数据源的非应用程序更好的管理使用情况去一个JNDI上下文。

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

+0

我正在使用heroku。所以我的情况是在嵌入式服务器内运行的应 – brazuka

+1

可以使用DBCP中的BasicDataSource,该DBCP已经内置了连接池。凭借我在Heroku上的经验,它还提供了更好的性能。 –

+0

我想我的应用程序正在打开比我想要的更多的连接。因为每次Spring JDBC模板执行查询时都使用DriverManagerDataSource,它会打开一个新连接并关闭它。使用DBCP的BasicDataSource,它将重新使用连接而不是打开新连接? – brazuka

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/

+0

为什么使用transactionManager? – brazuka

+0

你没有回答这个问题。他问这两者之间有什么区别,什么是最好的方法。他不是要求复制粘贴示例.... –

+0

我知道两者都有其优点和缺点。我认为,有经验来判断哪种做法好或不好。 –

0

最好的做法是不暴露任何你所编写的代码的数据库配置。最好在服务器控制台内进行配置并将其作为jndi公开。春天里的配置文件,获得数据库实例:

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

和配置数据库的事务管理器为:

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

这里的关键值得注意的是不公开的数据库配置。

相关问题