背景:我有2个项目
A:基于Spring的java项目
B:gui的Grails项目
我有两个相关的问题:
如何在grails项目中使用 org.apache.commons.dbcp2.BasicDataSource 而不是默认的apache tomcat DataSource? org.apache.tomcat.jdbc.pool.DataSource 存在限制,它只允许一个initSql String 。我想运行2个init sql语句[“SET SCHEMA”,“SET ROLE”],这可以用于dbcp2,因为它需要一个connectionInitSqls List 。我还尝试将2个sql语句与分号组合,但tomcat数据源给出了验证错误。
是否可以从另一个父bean扩展数据源?我想从我的java项目中定义的抽象bean扩展grails数据源,其目的是重用常见的数据源属性。
答案 0 :(得分:1)
我还没有看到这个特定游泳池和Tomcat游泳池之间的性能比较,但我的猜测是你将在一辆法拉利车上进行交易,这只法拉利只能为一个两人的老爷车打一个广播电台。 Look at the comparisons of Tomcat vs the others - it's significantly faster。如果你没有获得太多的流量,那么这可能不是什么大问题。
除了性能问题之外,很容易注册自己的DataSource
- 只需在grails-app/conf/spring/resources.groovy
中使用正确的名称创建一个bean,您的将覆盖Grails配置的bean。所有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中的查找替换指定的键。如果您使用双引号,它们将成为GStrings,并且过早评估并将导致异常。
这还不够 - 除了大的游戏性能降级之外,这会给你一个有效的连接池,但会消除Grails添加的两个很酷的功能。如果你不自定义任何东西,你得到的dataSource
bean实际上是包裹真实dataSource
的两个代理。一个是org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy
,它避免了在没有更新发生时在事务开始时配置连接的成本。它配置一个Connection
代理,用于缓存方法调用(setAutoCommit(false)
,设置隔离级别,只读,超时等)。当您进行实际更新时,它会将这些值应用于实际连接和使用它。但是如果你不进行任何更新,你将节省时间,这不是很大的节省,但会在繁忙的网站上加起来。另一个是org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy
,可确保在事务或Hibernate会话期间,如果您转到dataSource
获取连接,则会获得已使用的连接,因此您将能够查看活动更新,读取未提交的更改等。
所以实际上有3个数据源bean,您可以使用名称dataSourceUnproxied
注册上面的那个,其他的通过引用注册:
dataSourceUnproxied(BasicDataSource) {
url = ...
...
}
dataSourceLazy(LazyConnectionDataSourceProxy, ref('dataSourceUnproxied'))
dataSource(TransactionAwareDataSourceProxy, ref('dataSourceLazy'))
即使相关,每个问题也应该提出一个问题。我将用指向代码的指针回答第二个问题。如果有多个数据源,每个数据源有3个bean,那么最终会有大量的冗余代码和配置,因此DataSourceGrailsPlugin
会创建一个具有公共属性的抽象父bean定义,并从中构建真正的bean;你可以看到所有in the code。