Cómo hacer que MySQL funcione en grails 2.0
datasource gorm (3)
install-dependency
solo descarga el jar y lo coloca en su caché Ivy. 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 archivo jar a su caché Ivy si no lo hubiera hecho con install-dependency
.
Grails 2.0 parece tener algunos cambios en DataSource.groovy
y parece que no puedo ejecutar mysql como estaba en 1.3.7
Lo hice grails install-dependency mysql:mysql-connector-java:5.1.16
lugar de simplemente tirar el .jar en lib. Escuché que esta es la manera de hacerlo en estos días.
Esto es lo que he 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"
Cambiando, por supuesto, el nombre de usuario, la contraseña y dbNamer a 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 de 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
Acabo de hacer un grial> limpio y funcionó
Terminé escribiendo un guión maravilloso que prueba la conexión a MySQL. El código sigue Colóquelo en scripts / TestMysql.groovy y ejecútelo como
grails test test-mysql localhost 3306 test-db grails-user grails-password
La primera "prueba" es ejecutar el script 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 dataSource {}
para insertarla 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 : de hecho, una vez que este script estuvo funcionando, fue fácil hacer que Grails también funcione. Solo tenía que hacer que grails clean
, eliminar todos los archivos *.class
que sobrevivieron, restaurar el DataSource.groovy
original y luego grails compile --refresh-dependencies
. Luego cambie DataSource.groovy
, y funciona como un amuleto.
Aquí está mi trabajo 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"
}
}
}
}