在 spring Web 应用程序中创建数据源的正确方法是什么?
What is the proper way to create a datasource in a spring web application?
我有两种创建数据源的方法:
内部 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
<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容器中使用。
下面的参考资料清楚地说明了这些方法。
其中没有什么比好的做法更好的了。好的是适合用例的。两者各有利弊。
当您尝试在服务器环境中部署应用程序时,多个应用程序共享一个公共数据源或数据源组件由服务器管理管理,那么最好的使用方式可能是通过 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>
这里的重点是不要公开数据库配置。
我有两种创建数据源的方法:
内部 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
<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容器中使用。
下面的参考资料清楚地说明了这些方法。
其中没有什么比好的做法更好的了。好的是适合用例的。两者各有利弊。
当您尝试在服务器环境中部署应用程序时,多个应用程序共享一个公共数据源或数据源组件由服务器管理管理,那么最好的使用方式可能是通过 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>
这里的重点是不要公开数据库配置。