为啥 Grails 使用 H2 而不是 Oracle?
Posted
技术标签:
【中文标题】为啥 Grails 使用 H2 而不是 Oracle?【英文标题】:Why Grails is using H2 instead of Oracle?为什么 Grails 使用 H2 而不是 Oracle? 【发布时间】:2012-08-21 20:59:44 【问题描述】:我花了很多时间来解决这个问题。我是 GRAILS 和 GROOVY 的初学者。 我有名为“tms_dev”的旧版 Oracle 数据库架构。此模式有一些表(例如 checktypes 表)。我也有域类 Checktype 和 ChecktypesController 类 - 由 GRAILS 生成的控制器。
这个类有列表方法:
定义列表(整数最大值)
params.max = Math.min(max ?: 10, 100)
[checktypesInstanceList: Checktypes.list(params), checktypesInstanceTotal: Checktypes.count()]
我还配置了 Datasource.groovy 文件以使用具有此类内容的 oracle
dataSource
pooled = true
driverClassName = "oracle.jdbc.OracleDriver"
dialect = "org.hibernate.dialect.Oracle10gDialect"
username = "TMS_DEV"
password = "password"
hibernate
cache.use_second_level_cache = true
cache.use_query_cache = false
cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory'
development
dataSource
dbCreate = "update" // one of 'create', 'create-drop','update'
url = "jdbc:oracle:thin:@server_name:1522:sid_name"
production
dataSource
dbCreate = "update" // one of 'create', 'create-drop','update'
url = "jdbc:oracle:thin:@server_name:1522:sid_name"
我运行我的应用程序。并点击主页上的“tst7.ChecktypesController”引用。
结果我有异常:
| Error 2012-08-27 14:41:03,469 [http-bio-8080-exec-9] ERROR util.JDBCExceptionReporter - Table "CHECKTYPES" not found; SQL statement:
select * from ( select this_.CHECKTYPECODE as CHECKTYP1_21_0_, this_.active as active21_0_, this_.availabilitychecktype as availabi3_21_0_, this_.checktypecode as checktyp1_21_0_, this_.checktypedescr as checktyp4_21_0_, this_.TARGETTYPECODE as TARGETTY5_21_0_ from CHECKTYPES this_ ) where rownum <= ? [42102-164]
| Error 2012-08-27 14:41:03,547 [http-bio-8080-exec-9] ERROR errors.GrailsExceptionResolver - JdbcSQLException occurred when processing request: [GET] /Tst7/checktypes/list
Table "CHECKTYPES" not found; SQL statement:
select * from ( select this_.CHECKTYPECODE as CHECKTYP1_21_0_, this_.active as active21_0_, this_.availabilitychecktype as availabi3_21_0_, this_.checktypecode as checktyp1_21_0_, this_.checktypedescr as checktyp4_21_0_, this_.TARGETTYPECODE as TARGETTY5_21_0_ from CHECKTYPES this_ ) where rownum <= ? [42102-164]. Stacktrace follows:
Message: Table "CHECKTYPES" not found; SQL statement:
select * from ( select this_.CHECKTYPECODE as CHECKTYP1_21_0_, this_.active as active21_0_, this_.availabilitychecktype as availabi3_21_0_, this_.checktypecode as checktyp1_21_0_, this_.checktypedescr as checktyp4_21_0_, this_.TARGETTYPECODE as TARGETTY5_21_0_ from CHECKTYPES this_ ) where rownum <= ? [42102-164]
Line | Method
->> 329 | getJdbcSQLException in org.h2.message.DbException
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
| 169 | get in ''
| 146 | get . . . . . . . . . . . in ''
| 4753 | readTableOrView in org.h2.command.Parser
| 1080 | readTableFilter . . . . . in ''
| 1686 | parseSelectSimpleFromPart in ''
| 1793 | parseSelectSimple . . . . in ''
| 1680 | parseSelectSub in ''
| 1523 | parseSelectUnion . . . . in ''
| 1022 | readTableFilter in ''
| 1686 | parseSelectSimpleFromPart in ''
| 1793 | parseSelectSimple in ''
| 1680 | parseSelectSub . . . . . in ''
| 1523 | parseSelectUnion in ''
| 1511 | parseSelect . . . . . . . in ''
| 405 | parsePrepared in ''
| 279 | parse . . . . . . . . . . in ''
| 251 | parse in ''
| 217 | prepareCommand . . . . . in ''
| 415 | prepareLocal in org.h2.engine.Session
| 364 | prepareCommand . . . . . in ''
| 1121 | prepareCommand in org.h2.jdbc.JdbcConnection
| 71 | <init> . . . . . . . . . in org.h2.jdbc.JdbcPreparedStatement
| 267 | prepareStatement in org.h2.jdbc.JdbcConnection
| 281 | prepareStatement . . . . in org.apache.commons.dbcp.DelegatingConnection
| 313 | prepareStatement in org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper
| 55 | <init> . . . . . . . . . in grails.orm.PagedResultList
| 45 | list in tst7.ChecktypesController
| 195 | doFilter . . . . . . . . in grails.plugin.cache.web.filter.PageFragmentCachingFilter
| 63 | doFilter in grails.plugin.cache.web.filter.AbstractFilter
| 1110 | runWorker . . . . . . . . in java.util.concurrent.ThreadPoolExecutor
| 603 | run in java.util.concurrent.ThreadPoolExecutor$Worker
^ 722 | run . . . . . . . . . . . in java.lang.Thread
然后我尝试在列表方法中创建直接 Oracle 连接
def list(Integer max)
def sql = Sql.newInstance("jdbc:oracle:thin:@server_name:1522:instance_name", "TMS_DEV",
"password", "oracle.jdbc.driver.OracleDriver")
sql.eachRow("select * from Dbdrivers")
println it.dbdrivercode
比我运行应用程序。结果 println it.dbdrivercode - 工作正常(连接工作!!!)。
这个问题最奇怪的是异常是由h2(内存数据库中的H2)类(org.h2.jdbc.JdbcConnection ,org.h2.jdbc.JdbcConnection 等等)。
【问题讨论】:
为了摆脱简单的东西......表CHECKTYPES实际上是否存在于模式TMS_DEV中? 当然可以!此表存在于模式 TMS_DEV 中。此外,当我尝试在域类中映射此表时,例如“class Checktypes static mapping = table 'TMS_DEV.CHECKTYPES' ...”而不是“table 'CHECKTYPES” ...我有错误“找不到模式 TMS_DEV” ... 看来使用的驱动是org.h2
,而不是你说的Oracle驱动。您的Datasource.groovy
有您发布的内容吗?您的 Config.groovy 没有覆盖某些数据库配置?什么是 Grails 版本?
--你的 Datasource.groovy 有你发布的内容吗?是——你的 Config.groovy 没有覆盖一些数据库配置? NOT OVERRIDE -- 什么是 Grails 版本? GRAILS 版本 - 2.1.0
是的,由于某种原因,它使用的是 H2 数据库而不是 Oracle。您可以在其中一个 H2 类上设置断点以找出原因。
【参考方案1】:
您默认使用 H2 驱动程序,因为您的 production 和 development 块在 environments 块之外被忽略。
【讨论】:
在这种情况下,请您将我的回答标记为“已接受”。很高兴听到您的问题已得到解决。【参考方案2】:听起来像是应用程序缓存问题。在运行应用程序之前尝试运行 grails clean。
【讨论】:
以上是关于为啥 Grails 使用 H2 而不是 Oracle?的主要内容,如果未能解决你的问题,请参考以下文章
为啥 Chrome 对某些资源使用 Http/1.1 而不是 H2