Хобрук: Ваш путь к мастерству в программировании

многократный запуск Datasource.groovy в приложении Grails (генерация исключения при вызове во второй раз)

Обходной путь для создания приложения:

  1. создание приложения Grails с использованием базы данных Postgres.
  2. Необходимо создать базу данных при выполнении приложения (т. е. база данных должна создаваться из самого проекта, а не создаваться вручную).

Для создания базы данных я вызываю отличный сервис CreateDatabaseService в datasource.groovy следующим образом:

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"
}
}

  • тот факт, что он запускается дважды, может не быть проблемой, ваша проблема в том, что у вас отсутствует драйвер postgreSql, пожалуйста, поделитесь своим BuildConfig 16.02.2016
  • @shaydel добавил файл конфигурации 16.02.2016
  • Кстати, это не будет считаться «инъекцией», вы просто используете статический метод класса, который вы импортируете. Внедренный компонент Spring является экземпляром класса. 16.02.2016

Ответы:


1

Убедитесь, что у вас есть следующая конфигурация в вашем BuildConfig

dependencies {
    ...
    compile 'org.grails.plugins:hibernate:4.3.10.4'
    provided 'org.postgresql:postgresql:9.4-1203-jdbc4'
    ...
}
16.02.2016
  • попробовал ваше предложение, но он жалуется на отсутствие такого артефакта в grailsCentral. 16.02.2016
  • Новые материалы

    Я собираюсь научить вас Python шаг за шагом
    Привет, уважаемый энтузиаст Python! 👋 Готовы погрузиться в мир Python? Сегодня я приготовил для вас кое-что интересное, что сделает ваше путешествие более приятным, чем шарик мороженого в..

    Альтернатива шаблону исходящих сообщений для архитектуры микросервисов
    Познакомьтесь с двухэтапным сообщением В этой статье предлагается альтернативный шаблон для папки Исходящие : двухэтапное сообщение. Он основан не на очереди сообщений, а на..

    React on Rails
    Основное приложение Reverb - это всеми любимый монолит Rails. Он отлично обслуживает наш API и уровень просмотра трафика. По мере роста мы добавляли больше интерактивных элементов..

    Что такое гибкие методологии разработки программного обеспечения
    Что представляют собой гибкие методологии разработки программного обеспечения в 2023 году Agile-методологии разработки программного обеспечения заключаются в следующем: И. Введение A...

    Ториго  — революция в игре Го
    Наш следующий вызов против ИИ и для ИИ. Сможет ли он победить людей в обновленной игре Го? Обратите внимание, что в следующей статье AI означает искусственный интеллект, а Goban  —..

    Простое развертывание моделей с помощью Mlflow — Упаковка классификатора обзоров продуктов NLP от HuggingFace
    Как сохранить свои модели машинного обучения в формате с открытым исходным кодом с помощью MLFlow, чтобы позже получить возможность легкого развертывания. Сегодня модели упаковки имеют несколько..

    Математика и интуиция - Часть 1
    У каждой математической формулы есть доказательство. Часто эти доказательства слишком сложно понять, поскольку многие из них основаны на индукции, некоторые - на очень сложных наблюдениях, а..