2012-01-17 7 views
17

Grails 2.0 parece tener algunos cambios en DataSource.groovy y yo no parecen ser capaces de obtener MySQL funcionando como lo fue en 1.3.7Cómo hacer el trabajo de MySQL en griales 2.0

hice grails install-dependency mysql:mysql-connector-java:5.1.16 en lugar de sólo tirando el .jar en lib. Escuché que esta es la manera de hacerlo en estos días.

Esto es lo que han reemplazado en mi DataSource.groovy:

driverClassName = "org.h2.Driver" 
... 
url = "jdbc:h2:mem:devDb;MVCC=TRUE" 

Con

driverClassName = "com.mysql.jdbc.Driver" 
... 
url = "jdbc:mysql://localhost:3306/${dbNamer}?autoreconnect=true" 

Cambio por supuesto, el nombre de usuario, contraseña y dbNamer a las entradas válidas ... ¿qué estoy haciendo mal? ¿Hay un tutorial de Grails 2.0 que cubra la configuración de mysql?

me sale este error monstruo:

| Loading Grails 2.0.0 
| Configuring classpath. 
| Environment set to development..... 
| Packaging Grails application..... 
| Compiling 1 source files..... 
| Running Grails application 
| Error 2012-01-16 21:39:10,134 [Thread-9] ERROR context.GrailsContextLoader - Error  executing bootstraps: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'hibernateProperties' while setting bean property 'hibernateProperties'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateProperties': Cannot resolve reference to bean 'dialectDetector' while setting bean property 'properties' with key [hibernate.dialect]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dialectDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 
Message: Error creating bean with name 'transactionManagerPostProcessor': Initialization of bean failed; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'transactionManager': Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'hibernateProperties' while setting bean property 'hibernateProperties'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateProperties': Cannot resolve reference to bean 'dialectDetector' while setting bean property 'properties' with key [hibernate.dialect]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dialectDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 
    Line | Method 
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 166 | run  in java.util.concurrent.FutureTask 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run  in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run . . . in java.lang.Thread 
Caused by BeanCreationException: Error creating bean with name 'transactionManager':  Cannot resolve reference to bean 'sessionFactory' while setting bean property 'sessionFactory'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'hibernateProperties' while setting bean property 'hibernateProperties'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateProperties': Cannot resolve reference to bean 'dialectDetector' while setting bean property 'properties' with key [hibernate.dialect]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dialectDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 166 | run  in java.util.concurrent.FutureTask 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run  in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run . . . in java.lang.Thread 
Caused by BeanCreationException: Error creating bean with name 'sessionFactory': Cannot resolve reference to bean 'hibernateProperties' while setting bean property 'hibernateProperties'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'hibernateProperties': Cannot resolve reference to bean 'dialectDetector' while setting bean property 'properties' with key [hibernate.dialect]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dialectDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 166 | run  in java.util.concurrent.FutureTask 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run  in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run . . . in java.lang.Thread 
Caused by BeanCreationException: Error creating bean with name 'hibernateProperties': Cannot resolve reference to bean 'dialectDetector' while setting bean property 'properties' with key [hibernate.dialect]; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'dialectDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 166 | run  in java.util.concurrent.FutureTask 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run  in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run . . . in java.lang.Thread 
Caused by BeanCreationException: Error creating bean with name 'dialectDetector': Invocation of init method failed; nested exception is org.springframework.jdbc.support.MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 166 | run  in java.util.concurrent.FutureTask 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run  in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run . . . in java.lang.Thread 
Caused by MetaDataAccessException: Error while extracting DatabaseMetaData; nested exception is org.apache.commons.dbcp.SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 
->> 334 | innerRun in java.util.concurrent.FutureTask$Sync 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 166 | run  in java.util.concurrent.FutureTask 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run  in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run . . . in java.lang.Thread 
Caused by SQLNestedException: Cannot load JDBC driver class 'com.mysql.jdbc.Driver' 
->> 1429 | createConnectionFactory in org.apache.commons.dbcp.BasicDataSource 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 1371 | createDataSource in  '' 
| 1044 | getConnection in  '' 
| 334 | innerRun in java.util.concurrent.FutureTask$Sync 
| 166 | run . . . in java.util.concurrent.FutureTask 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run  in java.lang.Thread 
Caused by ClassNotFoundException: com.mysql.jdbc.Driver 
->> 217 | run  in java.net.URLClassLoader$1 
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 
| 205 | findClass in java.net.URLClassLoader 
| 321 | loadClass in java.lang.ClassLoader 
| 266 | loadClass in  '' 
| 1420 | createConnectionFactory in org.apache.commons.dbcp.BasicDataSource 
| 1371 | createDataSource in  '' 
| 1044 | getConnection in  '' 
| 334 | innerRun in java.util.concurrent.FutureTask$Sync 
| 166 | run . . . in java.util.concurrent.FutureTask 
| 1110 | runWorker in java.util.concurrent.ThreadPoolExecutor 
| 603 | run . . . in java.util.concurrent.ThreadPoolExecutor$Worker 
^ 679 | run  in java.lang.Thread 

Respuesta

21

install-dependency simplemente descarga el frasco y lo coloca en la memoria caché de la hiedra. Pero no ha declarado que su aplicación tiene una dependencia en ese jar. BuildConfig.groovy tiene una declaración de dependencia comentada para el controlador MySQL. Simplemente elimine el comentario y actualice la versión, si lo desea, y la agregará al classpath de su aplicación. También descargaría el jar a su caché Ivy si no lo hubiera hecho con install-dependency.

+0

¿Acabo de olvidarse de tener que hacer esto antes, o es la cosa dependencia nuevo en 2.0? ¿o es porque hice 'install-dependency' en lugar de soltar el jar? – Mikey

+2

Ha estado presente desde 1.2. Como dije, 'install-dependency' es algo global, solo descarga el jar y lo almacena en caché, pero no tiene ningún efecto en la aplicación actual. Ver http://grails.org/doc/latest/ref/Command%20Line/install-dependency.html –

12

que acabo de hacer un griales> limpias y funcionó

+0

, también funcionó para mí. el comando es como nombre_aplicación> grails clean –

+1

No puedo darte suficientes votos a favor. –

+0

sí, funcionó por completo para mí, sin cambios en BuildConfig.groovy requirió – moeTi

3

terminé escribiendo un guión maravilloso que pone a prueba la conexión a MySQL. El código sigue Colóquelo en scripts/TestMysql.groovy y ejecútelo p. como

grails test test-mysql localhost 3306 test-db grails-user grails-password 

La primera "prueba" es ejecutar la secuencia de comandos en el entorno de prueba, en caso de que haya algún cambio en DataSource.groovy.

Si puede conectarse a MySQL con este script, al menos sabrá la configuración correcta para su DataSource.groovy. En caso de éxito, también imprime la sección pertinente dataSource {} para insertar en DataSource.groovy.

/* Testing grails/GORM connection to mysql 
* Call this script "scripts/TestMysql.groovy" 
* Usage: "grails test-mysql" or, to run in another environment, e.g. "grails test test-mysql" 
* (This is in case you have changed DataSource.groovy and nothing is working.) 
* 
* Up to five parameters: 
* grails test test-mysql <host> <port> <database> <user> <password> 
* e.g. grails test test-mysql localhost 3306 test root rootpassword. 
* The database name can also be empty. 
*/ 

import groovy.sql.Sql 

includeTargets << grailsScript("_GrailsInit") << grailsScript("_GrailsArgParsing") 

target(main: "The description of the script goes here!") { 

    def list=argsMap['params'] 
    def host=list[0] ? list[0] : 'localhost' 
    def port=list[1] ? list[1] : '3306'  
    def db=list[2] ? list[2] : ''    // can leave empty 
    def user=list[3] ? list[3] : 'grails'  
    def pswd=list[4] ? list[4] : 'grails' 

    println "Connecting to " + host + ":" + port 
    println "Database:" + db 
    println "User: " + user 
    println "Password: " + pswd 

    def jdbc_string='jdbc:mysql://' + host + ':' + port + '/' + db 

    def sql 
    try { 
     sql = Sql.newInstance(jdbc_string, user, pswd, "com.mysql.jdbc.Driver") 
    } catch (com.mysql.jdbc.exceptions.jdbc4.CommunicationsException e) { 
     println "ERROR! Cannot connect to " + host + ":" + port 
     println "Check host, port, your open ports and other firewall settings; try to connect with some other program" 
     println "" 
     println e 
     return 
    } catch (com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException e) { 
     println "MySQL ERROR, perhaps wrong database name!" 
     println "" 
     println e 
     return 
    } catch (java.sql.SQLException e) { 
     println "MySQL ERROR, perhaps wrong login/password!" 
     println "" 
     println e 
     return 
    } 

    println "SUCCESS! Connected to MySQL" 
    def query = "SHOW DATABASES" 

    println "Executing query " + query + "..." 
    sql.eachRow(query) { 
     println it 
    } 

    println "OK, Done!" 

    println """ 
     dataSource { 
      dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', '' 
      url = "jdbc:mysql://${host}:${port}/${db}" 
      username="${user}" 
      password="${pswd}" 
     } 
     """ 

} 

setDefaultTarget(main) 

actualización: en efecto, una vez que este guión estaba trabajando, era fácil de hacer Griales funcionan tan bien. Solo tuve que hacer grails clean, borrar todos los archivos *.class que sobrevivieron, restaurar el original DataSource.groovy y luego grails compile --refresh-dependencies. Luego cambie DataSource.groovy, y funciona como un amuleto.

Aquí está mi trabajando DataSource.groovy:

dataSource { 
    pooled = true 
    driverClassName = "com.mysql.jdbc.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' 
} 
// environment specific settings 
environments { 
    development { 
     dataSource { 
      dbCreate = "create-drop" // one of 'create', 'create-drop', 'update', 'validate', '' 
      url = "jdbc:mysql://localhost:8890/test" 
      username="grails" 
      password="grails" 
     } 
    } 
    test { 
     dataSource { 
      dbCreate = "update" 
      url = "jdbc:h2:mem:testDb;MVCC=TRUE;LOCK_TIMEOUT=10000" 
     } 
    } 
    production { 
     dataSource { 
      dbCreate = "update" 
      url = "jdbc:h2:prodDb;MVCC=TRUE;LOCK_TIMEOUT=10000" 
      pooled = true 
      properties { 
       maxActive = -1 
       minEvictableIdleTimeMillis=1800000 
       timeBetweenEvictionRunsMillis=1800000 
       numTestsPerEvictionRun=3 
       testOnBorrow=true 
       testWhileIdle=true 
       testOnReturn=true 
       validationQuery="SELECT 1" 
      } 
     } 
    } 
} 
Cuestiones relacionadas