[关闭]
@gengzhengtao 2015-07-14T07:51:28.000000Z 字数 6201 阅读 1214

数据库配置

电商平台broadleafCommerce Broadleaf概念 关键部分和配置


Broadleaf Commerce初始化配置是使用HSQL数据库,HSQL是一个轻量级的数据库,而且非常有利于开发。当我们启动Web应用程序的时候Broadleaf利用Hibernate的一个功能来创建和填充数据库,这个是通过设置持久化配置的一部分属性来实现的。

让我们来看看一个典型的持久化单元配置:

  1. <persistence-unit name="blPU" transaction-type="RESOURCE_LOCAL">
  2. <properties>
  3. <property name="hibernate.hbm2ddl.auto" value="create-drop"/>
  4. <property name="hibernate.hbm2ddl.import_files" value="my_load_files.sql"/>
  5. <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
  6. <property name="hibernate.show_sql" value="false"/>
  7. <property name="hibernate.cache.use_second_level_cache" value="true"/>
  8. <property name="hibernate.cache.use_query_cache" value="true"/>
  9. </properties>
  10. </persistence-unit>

当切换到另外一个数据库时,最重要的前三个属性。

然而,Broadleaf 提供了一种机制,允许您配置您每个环境所有的 JPA 属性,而不是硬编码你的属性,如上面一样,你可以为每个环境提供不同的配置。因为通常不用的环境需要不同的属性,但是为不同的环境构建具有不同属性的war时通常比较繁琐,所以这一点比较具有吸引力。首先,记住Broadleaf有一个合并处理的进程来将多个配置文件合并为最终的配置。这个过程发生在运行时(runtime),这些合并后的文件通常包含Spring Application context资源文件和JPA persistence.xml文件。这个机制能够让你覆盖和扩展Braodleaf的核心功能。Broadleaf还提供了一个运行环境属性配置器(Runtime Environment Properties Configurer)根据环境不同来将properties文件中正确的属性注入到application context.下面是他如何工作的:

下面是来自于Broadleaf原型典型的JPA persistence.xml文件:

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <persistence xmlns="http://java.sun.com/xml/ns/persistence"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd"
  5. version="2.0">
  6. <persistence-unit name="blPU" transaction-type="RESOURCE_LOCAL">
  7. <non-jta-data-source>jdbc/web</non-jta-data-source>
  8. <exclude-unlisted-classes/>
  9. </persistence-unit>
  10. <persistence-unit name="blSecurePU" transaction-type="RESOURCE_LOCAL">
  11. <non-jta-data-source>jdbc/webSecure</non-jta-data-source>
  12. <exclude-unlisted-classes/>
  13. </persistence-unit>
  14. <persistence-unit name="blCMSStorage" transaction-type="RESOURCE_LOCAL">
  15. <non-jta-data-source>jdbc/cmsStorage</non-jta-data-source>
  16. <exclude-unlisted-classes/>
  17. </persistence-unit>
  18. </persistence>

我们会发现持久化的提供者和属性没有包含这杯,是因为这是Broadleaf中被拿来合并的一个默认的persitence.xml文件,任何配置都没有被改变,那么上面描述的那些属性呢?为了在Broadleaf配置JPA,我们使用自定义的Broadleaf extension to spring 来合并持久化单元,为了允许为持久性单元后处理器。Broadleaf已经创建了JPAPropertiesPersistenceUnitPostProcessor。有关配置请看这里

这个方法允许你上面那些调整每个环境的属性,除了这些事情,还可以使用在开发过程中使用不同的数据库方言,这样比在QA与生产过程中修改好的多。

此外,你需要为你的数据库配置Broaleaf数据源持久化配置,默认的Broadleaf Commerce使用JNDI从服务查找,请根据你的服务器文档配置你的JNDI数据源。

配置Broadleaf持久化单元

对于应用程序中每一个持久化单元(persistence unit),你需要修改hibernate.dialect属性来指向你正在使用的数据库。你可以参考Hibernate API 文档来查看可用的方言

下面是修改每个环境中数据库属性的步骤:

1. 根据你的服务器文档配置你的JNDI数据源。对于本地Jetty服务器,你可以在site/src/webapp/WEB-INF/jetty-env.xml查看它的配置。除非你的应用在Jetty上运行,否则忽略掉它。在大多数情况下,使用默认的配置,你将需要三个数据源jdbc/webjdbc/secure,jdbc/storage(你不能讲他们组合未一个,因为多事务管理器不能绑定在一个数据源上。)

2. 打开site/src/webapp/WEB-INF/applicationContext-datasources.xml并确保他是按照你的JNDI配置进行配置的。除非你的数据源使用的是一个不同的JNDI名称,否则这个配置是不需要改变的。(通常情况下,你不需要修改这个文件。)

3. 如果你增加了额外的JNDI属性,或者没有使用webDS(jdbc /web)的默认JNDI名称,那么你就需要修改site/src/webapp/WEB-INF/web.xml 文件,(注意:通常情况下不需要修改这个文件)

  1. <resource-ref>
  2. <!-- Change this JNDI name and/or add additional resource-refs for
  3. new JNDI names. Typically you should not need to change this. -->
  4. <res-ref-name>jdbc/web</res-ref-name>
  5. <res-type>javax.sql.DataSource</res-type>
  6. <res-auth>Container</res-auth>
  7. </resource-ref>

4. 为了使开发环境中正确设置JPA,需要针对与每个环境修改配置文件。这些文件位于每个项目中(即:core,site,admin)中的src/main/resources/runtime-properties.下面是core/src/main/resources/runtime-properties/common-shared.properties:

  1. # Settings for the default persistence unit
  2. blPU.hibernate.hbm2ddl.auto=validate
  3. blPU.hibernate.dialect=org.hibernate.dialect.HSQLDialect
  4. blPU.hibernate.show_sql=false
  5. blPU.hibernate.cache.use_second_level_cache=true
  6. blPU.hibernate.cache.use_query_cache=true
  7. blPU.hibernate.hbm2ddl.import_files=null
  8. # Settings for the CMS storage persistence unit
  9. blCMSStorage.hibernate.hbm2ddl.auto=validate
  10. blCMSStorage.hibernate.dialect=org.hibernate.dialect.HSQLDialect
  11. blCMSStorage.hibernate.show_sql=false
  12. blCMSStorage.hibernate.cache.use_second_level_cache=true
  13. blCMSStorage.hibernate.cache.use_query_cache=true
  14. blCMSStorage.hibernate.hbm2ddl.import_files=null
  15. # Settings for the secure persistence unit
  16. blSecurePU.hibernate.hbm2ddl.auto=validate
  17. blSecurePU.hibernate.dialect=org.hibernate.dialect.HSQLDialect
  18. blSecurePU.hibernate.show_sql=false
  19. blSecurePU.hibernate.cache.use_second_level_cache=false
  20. blSecurePU.hibernate.cache.use_query_cache=false
  21. blSecurePU.hibernate.hbm2ddl.import_files=null

5. 在每个 web 应用程序中的环境属性进行适当的更改(例如,site/src/main/resources/runtime-properties/*.properties

使用持久化单元前置名称的属性(例如blPUblSecurePU)的值将会在运行时替换或新增为正确的值。每个应用程序的特定属性将优先于共享的属性,同时又优于Broadleaf的默认属性。为了让QA有一个单独的不同的配置。将下面的内容添加到 site/main/resources/runtime-properties/integrationqa.properties:

  1. lPU.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
  2. blCMSStorage.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
  3. blSecurePU.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

这样在“integrationqa”环境中三个持久化单元的数据库方言都会改为Oracle 10g

另一个有趣的用法,这可能是你想要在不同环境中运行不同的数据库脚本,由于语法或数据类型的不同。来看一下 site/main/resources/runtime-properties/development.properties这个文件:

  1. blPU.hibernate.hbm2ddl.import_files=/sql/load_admin_security.sql,\
  2. /sql/load_admin_users.sql,\
  3. /sql/load_code_tables.sql,\
  4. /sql/load_table_sequences.sql,\
  5. /sql/load_catalog_data.sql,\
  6. /sql/load_content_structure.sql,\
  7. /sql/load_content_data.sql

如果这个文件没有重写方言的话,那么它将使用HSQLDB方言。当时用分号将SQL脚本列表进行了分隔,这些脚本应该在表创建完后执行。也许QA会使用ORacle并且仍然需要加载一些基础数据。由于Oracle与HSQLDB在语法上略有不同,所以QA的配置可能是下面的样子:

  1. blPU.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
  2. blPU.hibernate.hbm2ddl.import_files=/sql/load_admin_security.sql,\
  3. /sql/oracle/load_admin_users.sql,\
  4. /sql/oracle/load_code_tables.sql,\
  5. /sql/oracle/load_table_sequences.sql,\
  6. /sql/oracle/load_catalog_data.sql,\
  7. /sql/oracle/load_content_structure.sql,\
  8. /sql/oracle/load_content_data.sql
  9. blCMSStorage.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
  10. blSecurePU.hibernate.dialect=org.hibernate.dialect.Oracle10gDialect

如你所见,你可以配置和重写每个环境的JPA属性。当然,你还可以预先配置你的数据源的JNDI名称,各种JPA运行时的属性,比如dialect,SQL logging,DDL,二级缓存以及导入脚本。这样应用程序就可以非常方便的改变环境配置。

更多关于运行时属性配置的详细信息,请参与Runtime Environment Configuration

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注