Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring grails应用程序中多次触发Datasource.groovy(第二次调用时引发异常)_Spring_Hibernate_Grails_Groovy - Fatal编程技术网

Spring grails应用程序中多次触发Datasource.groovy(第二次调用时引发异常)

Spring grails应用程序中多次触发Datasource.groovy(第二次调用时引发异常),spring,hibernate,grails,groovy,Spring,Hibernate,Grails,Groovy,创建应用程序的变通方法: 使用Postgres数据库创建Grails应用程序 需要在执行应用程序时创建数据库(即从项目本身创建数据库,而不是手动创建数据库) 为了创建数据库,我在datasource.groovy中调用groovy服务CreateDatabaseService,如下所示: import demo.grails.CreateDatabaseService CreateDatabaseService.serviceMethod() dataSource { pooled = t

创建应用程序的变通方法:

  • 使用Postgres数据库创建Grails应用程序
  • 需要在执行应用程序时创建数据库(即从项目本身创建数据库,而不是手动创建数据库)
  • 为了创建数据库,我在datasource.groovy中调用groovy服务CreateDatabaseService,如下所示:

    import demo.grails.CreateDatabaseService
    CreateDatabaseService.serviceMethod()
    dataSource {
       pooled = true
       jmxExport = true
       driverClassName = "org.postgresql.Driver"
       dialect = "org.hibernate.dialect.PostgreSQLDialect"
       username = "postgres"
       password = "password"
    }
    hibernate {
       cache.use_second_level_cache = true
       cache.use_query_cache = false
       singleSession = true // configure OSIV singleSession mode
       flush.mode = 'manual' 
    }
    
    // environment specific settings
    environments {
    development {
        dataSource {
            dbCreate = "create-drop" 
            url = "jdbc:postgresql://localhost:5432/SampleAppDb"
        }
    }
    test {
        dataSource {
            dbCreate = "update"
            url = "jdbc:postgresql://localhost:5432/SampleAppDb"
        }
    } .....
    
    CreateDatabaseService的完整代码:

    package demo.grails
    import groovy.sql.Sql
    import java.sql.DriverManager
    import java.sql.Connection
    import java.sql.SQLException
    import java.sql.*
    
    class CreateDatabaseService {
    
    public static flag =0
    
    def static serviceMethod() {
    
        Connection conn = null;
        Statement stmt = null;
            try{
             if(flag == 0)  {
                   //STEP 2: Register JDBC driver
                   Class.forName("org.postgresql.Driver");
                   //STEP 3: Open a connection
                   System.out.println("Connecting to database...");
                   conn =     DriverManager.getConnection("jdbc:postgresql://localhost:5432", "postgres", "password");
                   //STEP 4: Execute a query
                   System.out.println("Creating database...");
                   stmt = conn.createStatement();
                   String isDatabase = "select datname from pg_catalog.pg_database where lower(datname) = lower('SampleAppDb')"
                   ResultSet rs = stmt.executeQuery(isDatabase);
                   String idr
                   while(rs.next()){
                       //Retrieve by column name
                       idr  = rs.getString("datname");
                   }
                     if(!idr.equals("SampleAppDb")) {
                       String sql = "create database SampleAppDb";
                       stmt.executeUpdate(sql);
                       System.out.println("Database created successfully...");
                       flag =1
                     }
                     else {
                        flag =1
                     }
              }
             }catch(Exception e){
                e.printStackTrace();
    
            }
            finally{
                 stmt.close();
                conn.close();
             }
        }
    
    }
    
    在运行grails应用程序时,下面是完整的堆栈跟踪,它显示多次调用datasource.groovy,尽管数据库是从应用程序创建的,但在第二次调用datasource.groovy时,却抱怨没有找到合适的驱动程序

    |Loading Grails 2.4.5
    |Configuring classpath
    .
    |Environment set to development
    .................................
    |Packaging Grails application
    ................Connecting to database...
    Creating database...
    Database created successfully...
    ....................
    |Running Grails application
    Connecting to database...
    Error |
    java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432
    Error |
        at java.sql.DriverManager.getConnection(DriverManager.java:689)
    Error |
        at java.sql.DriverManager.getConnection(DriverManager.java:247)
    Error |
        at java_sql_DriverManager$getConnection.call(Unknown Source)
    Error |
        at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:45)
    Error |
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:108)
    Error |
        at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:124)
    Error |
        at demo.grails.CreateDatabaseService.serviceMethod(CreateDatabaseService.groovy:23)
    Error |
        at demo.grails.CreateDatabaseService$serviceMethod.call(Unknown Source)
    Error |.......
    
    请建议如何克服这个错误

    BuildConfig.groovy

    dependencies {
        // specify dependencies here under either 'build', 'compile', 'runtime',               'test' or 'provided' scopes e.g.
        // runtime 'mysql:mysql-connector-java:5.1.29'
        // runtime 'org.postgresql:postgresql:9.3-1101-jdbc41'
        runtime 'postgresql:postgresql:9.0-801.jdbc4'
        test "org.grails:grails-datastore-test-support:1.0.2-grails-2.4"
    }
    
    plugins {
        // plugins for the build system only
        build ":tomcat:7.0.55.2" // or ":tomcat:8.0.20"
    
        // plugins for the compile step
        compile ":scaffolding:2.1.2"
        compile ':cache:1.1.8'
        compile ":asset-pipeline:2.1.5"
    
        // plugins needed at runtime but not for compilation
        runtime ":hibernate4:4.3.8.1" // or ":hibernate:3.6.10.18"
        runtime ":database-migration:1.4.0"
        runtime ":jquery:1.11.1"
    
        // Uncomment these to enable additional asset-pipeline capabilities
        //compile ":sass-asset-pipeline:1.9.0"
        //compile ":less-asset-pipeline:1.10.0"
        //compile ":coffee-asset-pipeline:1.8.0"
        //compile ":handlebars-asset-pipeline:1.3.0.3"
    }
    }
    

    验证
    BuildConfig

    dependencies {
        ...
        compile 'org.grails.plugins:hibernate:4.3.10.4'
        provided 'org.postgresql:postgresql:9.4-1203-jdbc4'
        ...
    }
    

    它运行两次可能不是问题,您的问题是缺少postgreSql驱动程序,请共享您的
    BuildConfig
    @shaydel添加了配置文件。顺便说一句,这不会被视为“注入”,您只是使用导入类的静态方法。注入的Springbean是一个类的实例。尝试了您的建议,但它抱怨grailsCentral中没有此类工件。