我还没有看到这个特定池和 Tomcat 池之间的性能比较,但我猜你会用一辆只播放一个广播电台的法拉利换一辆播放两个电台的老爷车。 Look at the comparisons of Tomcat vs the others - it's significantly faster。如果您没有获得太多流量,那么也许这没什么大不了的。
抛开性能问题不谈,注册你自己的DataSource 很容易——只需在grails-app/conf/spring/resources.groovy 中创建一个具有正确名称的bean,你的bean 就会覆盖Grails 配置的那个。所有 Spring bean 都是如此;如果您使用 Grails 或插件之前配置的名称注册一个新 bean,那么您的将获胜。并根据需要设置属性:
import org.apache.commons.dbcp2.BasicDataSource
beans = {
dataSource(BasicDataSource) {
url = '${dataSource.url}'
driverClassName = '${dataSource.driverClassName}'
username = '${dataSource.username}'
password = '${dataSource.password}'
// other valid setters - see the source or
// javadocs for what's available
}
}
请注意,在引用 Config.groovy 变量时必须使用单引号(DataSource.groovy 中的值会合并到“dataSource”键下的主配置中),因为该触发器的 Spring 属性占位符处理将替换指定的在系统属性、属性文件和 Grails 中的配置中查找的键。如果你使用双引号,它们会变成 GString 并且过早地被评估并且会导致异常。
但这还不够——除了大幅降低池性能之外,这将为您提供一个有效的连接池,但会消除 Grails 添加的两个很酷的功能。如果你不定制任何东西,你得到的dataSource bean 实际上是两个代理包装真正的dataSource。一个是org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy,它避免了在没有更新发生时在事务开始时配置连接的成本。它配置了一个缓存方法调用的Connection 代理(setAutoCommit(false),设置隔离级别、只读、超时等),当您进行实际更新时,它将这些值应用于实际连接并使用它。但是,如果您不进行任何更新,您将节省时间,虽然节省的时间不多,但会在繁忙的网站上加起来。另一个是org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy,它确保在事务或休眠会话期间,如果您转到dataSource 获取连接,您将获得已经使用的连接,因此您将能够看到活动更新,读取未提交的更改等。
所以实际上有 3 个数据源 bean,您可以使用名称 dataSourceUnproxied 注册上面的一个,其他通过引用注册:
dataSourceUnproxied(BasicDataSource) {
url = ...
...
}
dataSourceLazy(LazyConnectionDataSourceProxy, ref('dataSourceUnproxied'))
dataSource(TransactionAwareDataSourceProxy, ref('dataSourceLazy'))
即使相关,您也应该对每个问题提出一个问题。我将用指向代码的指针来回答第二个问题。如果有多个数据源,并且每个数据源有 3 个 bean,那么您最终会得到大量冗余代码和配置,因此 DataSourceGrailsPlugin 确实创建了一个具有公共属性的抽象父 bean 定义并从中构建真正的 bean;你可以看到这一切in the code。