如何从 Grails 中正确删除 H2

Posted

技术标签:

【中文标题】如何从 Grails 中正确删除 H2【英文标题】:How to properly remove H2 from Grails 【发布时间】:2014-11-20 15:40:04 【问题描述】:

我正在尝试最小化我的 Grails (2.4.2) 应用程序,并剔除 create-app 生成的很多我不会使用的东西。

其中之一是 H2。我只是不打算使用它,此外,如果我需要嵌入式数据库,我更喜欢使用 HSQLDB。

所以我对我的BuildConfig进行了以下更改:

...

// Remove the DB console for all environments, not just dev.
grails.dbconsole.enabled = false

...

grails.project.dependency.resolution = 
    inherits("global") 
        excludes 'h2'
    

    ...

现在,当我执行run-app 时,我收到以下错误:

... <huge stacktrace omitted for brevity>
Caused by: org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is java.sql.SQLException: org.h2.Driver
    ... 4 more
Caused by: java.sql.SQLException: org.h2.Driver
    ... 4 more
Caused by: java.lang.ClassNotFoundException: org.h2.Driver
    at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
    at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:425)
    at java.lang.Class.forName(Class.java:270)
    ... 4 more
Error |
Forked Grails VM exited with error

发生了什么以及如何修复此错误同时正确删除 H2 及其任何配置/引用?


更新,我的 DataSources.groovy 文件

dataSource 
    pooled = true
    jmxExport = true
    driverClassName = "org.h2.Driver"
    username = "sa"
    password = ""

hibernate 
    cache.use_second_level_cache = true
    cache.use_query_cache = false
    //    cache.region.factory_class = 'net.sf.ehcache.hibernate.EhCacheRegionFactory' // Hibernate 3
    cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4
    singleSession = true // configure OSIV singleSession mode


// environment specific settings
environments 
    development 
        dataSource 
            dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', ''
            url = "jdbc:h2:mem:devDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
        
    
    test 
        dataSource 
            dbCreate = "update"
            url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
        
    
    production 
        dataSource 
            dbCreate = "update"
            url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000;DB_CLOSE_ON_EXIT=FALSE"
            properties 
                // See http://grails.org/doc/latest/guide/conf.html#dataSource for documentation
                jmxEnabled = true
                initialSize = 5
                maxActive = 50
                minIdle = 5
                maxIdle = 25
                maxWait = 10000
                maxAge = 10 * 60000
                timeBetweenEvictionRunsMillis = 5000
                minEvictableIdleTimeMillis = 60000
                validationQuery = "SELECT 1"
                validationQueryTimeout = 3
                validationInterval = 15000
                testOnBorrow = true
                testWhileIdle = true
                testOnReturn = false
                jdbcInterceptors = "ConnectionState"
                defaultTransactionIsolation = java.sql.Connection.TRANSACTION_READ_COMMITTED
            
        
    

【问题讨论】:

您是否从 DataSource.groovy 文件中删除了对 H2 的引用? 谢谢@Gregg (+1) - 请查看我的更新并在 Donal 的回答下跟进问题 - 我有同样的问题要问你! 【参考方案1】:

在您的grails-app/conf/DataSources.groovy 中,您可能有一些对 h2 驱动程序的引用,例如

dataSource 
    pooled = true
    jmxExport = true
    driverClassName = "org.h2.Driver"
    username = "sa"
    password = ""

如果您不使用任何数据库,请完全删除 dataSource 配置。如果您使用不同的数据库,请将 h2 驱动程序类名替换为您的数据库的驱动程序的类名。

【讨论】:

感谢@Donal (+1) - 请查看我的更新,其中包括我的整个DataSources.groovy 文件。我害怕删除我的dataSource 配置,因为我在文件中看到了其他h2 引用。我很想完全摆脱dataSources,因为我的Grails 应用程序没有数据库(相反,它将依赖于所有持久性的支持服务)。从此文件中删除所有内容是否安全?或者在项目的其他部分是否引用了这些其他配置? @unfettered 我认为您可以从DataSources.groovy 中删除所有内容,甚至可以删除文件本身

以上是关于如何从 Grails 中正确删除 H2的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Grails 应用程序的 URL 中删除应用程序名称?

从 zip 文件安装 grails 插件的正确方法是啥?

在 Grails 中扩展具有一对多关系的域类

如何在 Grails 域类中正确设置属性值

grails 应用程序中的“打开的文件太多” - 如何正确关闭打开的文件和流?

如何使用 Spring resource.groovy 正确注入 Grails 服务