Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在SpringWeb应用程序中创建数据源的正确方法是什么?_Java_Spring_Tomcat_Jndi_Spring Jdbc - Fatal编程技术网

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

Java 在SpringWeb应用程序中创建数据源的正确方法是什么?,java,spring,tomcat,jndi,spring-jdbc,Java,Spring,Tomcat,Jndi,Spring Jdbc,我有两种创建数据源的方法: 在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:

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

  • 在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" />
    
    
    

  • Tomcat JNDI

  • 
    


    使用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开发人员的最佳贡献


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

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

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


    这其中没有比良好实践更好的了。好的一个是对用例好的一个。他们都有优点和缺点

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

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

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


    试着弄清楚你的应用程序的部署模型是什么,弄清楚什么对你有好处。还可以尝试使用datasourcepool实现来提高性能,如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>
    
    
    

    这里的关键提示是不要公开数据库配置。

    为什么要使用transactionManager?您没有回答这个问题。他在问这两者之间有什么区别,最好的方法是什么。他不是在要求复制粘贴的例子……我知道两者都有各自的优点和缺点。我认为这需要经验来判断哪种做法是好的还是不好的。我不是说哪种做法最好的合适人选。但我个人将依靠spring的实现。因为它已被大多数用户验证和使用。我使用事务管理器来管理roleback并在我的应用程序中满足ACID属性。我正在使用heroku。所以我的例子是运行在嵌入式服务器中的应用程序。可以使用DBCP中的BasicDataSource,它已经内置了连接池。根据我在Heroku上的经验,它也提供了更好的性能。我想我的应用程序正在打开比我想要的更多的连接。因为使用DriverManager数据源,每次Spring JDBC模板执行查询时,它都会打开并关闭一个新连接。使用来自DBCP的BasicDataSource,它将重用连接,而不是打开新的连接?是的,这是完全正确的。DBCP管理一个底层连接池,每当您请求连接时,它都会从该池返回。它不会打开任何新连接或关闭任何连接。非常感谢!我将尝试这个解决方案。
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"/>
    </bean>