簡體   English   中英

在grails應用程序中多次觸發Datasource.groovy(第二次調用時引發異常)

[英]multiple times triggering of Datasource.groovy in grails application ( throwing exception when called second time)

解決方法以創建應用程序:

  1. 使用Postgres數據庫創建Grails應用程序。
  2. 在執行應用程序時需要創建數據庫(即從項目本身創建數據庫,而不是手動創建數據庫)。

為了創建數據庫,我在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'
    ...
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM