如果您在SAP Commerce中运行SAP产品配置或SAP解决方案销售配置,您很可能通过配置Hikari来优化您的产品或解决方案配置器的性能,如SAP Note2863047中所述。在进入为SAP解决方案销售配置运行时引擎配置Hikari的技术细节之前,让我详细说明何时以及如何从这个新库中受益。
动机
SAP Solution Sales Configuration Runtime Engine被设计为从内存数据中操作。你可能已经注意到它的许多缓存,在hAC缓存监控视图中以_AP 开始。该引擎连接到数据库来加载缓存中尚未出现的数据,一旦数据被加载和缓存,就不会再使用数据库。由于数据库操作应该是一次性的,一个数据库连接就足够了,配置一个数据库连接池是多余的。然而,并不总是能够将理论付诸实践并缓存所有需要的数据。例如,如果你启用了定价功能,并且有数以亿计的定价条件记录,可能无法在不耗尽内存的情况下将所有的记录加载到缓存中。因此,引擎将在每次需要的时候从数据库中获取非缓存的条件记录,这可能是每次配置更新和定价需要刷新的时候。此外,SAP商务中的缓存项目可以有一个最大的生存时间,对于SAP产品配置和SAP解决方案销售配置,默认设置为5分钟。过期的缓存数据必须定期重新加载。在这种情况下,数据加载不再是一次性的操作,而是经常性的,并且可能随着负载的增加而增加。单一的数据库连接设计可能会遇到限制,当需要并发访问数据库时,可能会导致产品或解决方案配置器的处理时间增加。解决方案是配置SAP解决方案销售配置运行时引擎以使用数据库连接池。
为什么使用Hikari而不是其他库来配置数据库连接池?首先,从3.x版本开始,Hikari被嵌入到SAP Solution Sales Configuration Runtime Engine的JAR中。不需要在SAP商务平台上安装一个额外的库,这大大简化了操作。其次,互联网上的多个基准显示,当可靠性和性能是最值得重视的方面时,Hikari是目前最好的选择之一。请注意,您可以使用Hikari以外的其他数据库连接池来操作SAP Solution Sales Configuration Runtime Engine,并使用您更熟悉和适应的连接池。
配置
使用Hikari数据库连接池配置SAP Solution Sales Configuration Runtime Engine需要三步操作。
- 使用Hikari将Tomcat中的数据库连接池配置为一个全局JNDI数据源
- 在每个Web应用程序中把全局JNDI数据源暴露为本地JNDI数据源
- 配置SAP Solution Sales Configuration Runtime Engine以使用JNDI数据源
首先,你应该编辑hybris/config/tomcat/conf/server.xml ,并在<GlobalNamingResources> 元素下添加以下XML元素,将Hikari数据库连接池设置为全局JNDI数据源。
<Resource name="${crm.ssc_jndi_datasource}"
auth="Container"
type="javax.sql.DataSource"
factory="com.zaxxer.hikari.HikariJNDIFactory"
driverClassName="${cpq.db.driver}"
jdbcUrl="${cpq.db.url}"
username="${cpq.db.username}"
password="${cpq.db.password}"
minimumIdle="${cpq.db.minIdle}" maximumPoolSize="${cpq.db.maxPoolSize}"
registerMbeans="true" poolName="${crm.ssc_jndi_datasource}"/>
注意,Hikari提供了更多的选项来配置连接池。
然后,你应该编辑hybris/config/tomcat/conf/context.xml 并在<Context> 元素下添加以下 XML 元素。
<ResourceLink name="${crm.ssc_jndi_datasource}"
global="${crm.ssc_jndi_datasource}"
type="javax.sql.DataSource"/>
最后,你应该添加和调整以下属性到你的local.properties ,以控制你的场景的连接池的配置。
# Configure SAP Solution Sales Configuration Runtime Engine to use JNDI datasource
crm.ssc_jndi_usage=true
crm.ssc_jndi_datasource=jdbc/CPQ
# Settings used normally by the SAP Solution Sales Configuration Runtime Engine to setup single database connection and still needed to avoid error in Data Loader (see limitations section)
crm.database_hostname=localhost
crm.system_type=MySQL
crm.database_port=3306
crm.database_user=****
crm.database_password=****
crm.database=cpqdb
crm.client=000
# Configure Hikari database connection pool reusing the single database connection settings from the SAP Solution Sales Configuration Runtime Engine
cpq.db.username=${crm.database_user}
cpq.db.password=${crm.database_password}
cpq.db.url=jdbc:mysql://${crm.database_host}:${crm.database_port}/${crm.database}
cpq.db.driver=com.mysql.cj.jdbc.Driver
cpq.db.minIdle=5
cpq.db.maxPoolSize=5
一旦你重新启动你的系统,所有的改变将被应用。
测试
现在,Hikari连接池已经设置好了,SAP Solution Sales Configuration Runtime Engine也配置好了,下一步就是要确保它能如约工作。首先,你应该在SAP商务服务器的启动日志中找到与下面类似的信息,表明Hikari启动并成功初始化了连接池。
[HikariDataSource] jdbc/CPQ - Starting...
[...]
[HikariDataSource] jdbc/CPQ - Start completed.
其次,你可以通过JMX监控连接池的使用统计。例如,您可以使用JConsole连接您的SAP Commerce JMX端口(通常是9003)并检查活动连接的数量。注意,SAP Solution Sales Configuration Runtime Engine经常使用几毫秒的数据库连接。因此,要看到一个活动的连接并不容易,因为它需要在这个短暂的时间间隔内刷新Hikari的JMX MBean。

如果你使用应用程序监控,我强烈建议将Hikari的JMX MBeans连接到你的监控解决方案,以跟踪连接池的使用情况,特别是在负载测试期间,以验证你的池配置。像Dynatrace这样的解决方案允许添加自定义的JMX MBeans,并在图表中显示其指标。
局限性
从3.x版本开始,Hikari被嵌入到SAP Solution Sales Configuration Runtime Engine JAR中。如果你运行2.x版本,我强烈建议你升级,因为3.x版本提供了很多好处。如果你不能升级,你总是可以手动添加Hikari库到SAP商务平台,并遵循相同的配置步骤。
虽然Data Loader使用与SAP Solution Sales Configuration Runtime Engine相同的数据库连接设置,并在配置时利用连接池,但它希望保持单一连接属性。该错误已被报告给产品团队,并在SAP Note3199261中发布了一个修复。如果你的SAP Solution Sales Configuration Runtime Engine的版本比SAP Note中提到的固定版本要早,请确保你在你的local.properties 中准确添加了我提到的属性。
总结
配置SAP产品配置或SAP解决方案销售配置,以防止由于数据库连接饥饿导致的响应时间下降,现在非常容易。这是一个潜在的简单和快速的解决方案,以解决产品或解决方案配置器在负载下的性能问题。
然而,请记住,SAP解决方案销售配置运行时引擎被设计为使用内存数据进行操作,在访问数据库时其性能必然会下降。因此,你应该长期解决阻止数据被缓存的原因。例如,你应该与你的企业一起审查对知识库和/或定价条件记录的变化频率,并调整保留数据的缓存的生存时间参数。或者,你可以禁用缓存过期机制,并注意使过时的数据失效(见SAP注释2408624)。