Miles to go …

April 23, 2008

TOTD #31: CRUD Application using Grails – Hosted on GlassFish and MySQL

Filed under: glassfish, grails, netbeans, totd — arungupta @ 6:00 am

TOTD #30 explained how to create CRUD application using Grails and hosted using in-built Jetty servlet engine and in-memory HSQLDB database. Jetty and HSQLDB are built into Grails and allows to start easily. You can also use GlassFish and MySQL for deploying your applications in production environment.

This blog entry walks you through the steps of deploying a Grails application on GlassFish and MySQL.

  1. If MySQL is already installed, then download GlassFish v2 UR1. Otherwise you can also Download GlassFish v2 UR1 and MySQL co-bundle from usual Download Page (instructions).
  2. Configure MySQL database
    1. Download MySQL Connector/J 5.1.6 from here.
    2. Extract the bundle and copy “mysql-connector-java-5.1.6-bin.jar” to the “lib” directory of Grails application.
    3. Start MySQL database as:
      ~/testbed/grails-1.0.2/samples/crud >sudo /usr/local/mysql/bin/mysqld_safe –user root –console
      Starting mysqld daemon with databases from /usr/local/mysql/data
    4. Create database by giving the following command:
      ~/testbed/grails-1.0.2/samples/crud >/usr/local/mysql/bin/mysqladmin create crudProd –user root
  3. Configure the Application
    1. Edit “grails-app/conf/DataSource.groovy” to specify MySQL configuration. The updated file looks like (changes highlighted in bold):

      dataSource {
              pooled = false
              driverClassName = “com.mysql.jdbc.Driver
              username = “root
              password = “”
              dialect = “org.hibernate.dialect.MySQL5InnoDBDialect”
      hibernate {
      // environment specific settings
      environments {
              development {
                      dataSource {
                              dbCreate = “create-drop” // one of ‘create’, ‘create-drop’,'update’
                              url = “jdbc:hsqldb:mem:devDB”
              test {
                      dataSource {
                              dbCreate = “update”
                              url = “jdbc:hsqldb:mem:testDb”
              production {
                      dataSource {
                              dbCreate = “update”
                              url = “jdbc:mysql://localhost/crudProd

      Being in production, it’s recommended to use InnoDB tables instead of MyISAM tables. This can be easily specified by using the dialect as explained here. More details about the contents of “DataSource.groovy” can be found here.

    2. Create a WAR by giving the following command:

      ~/testbed/grails-1.0.2/samples/crud >grails war

      Welcome to Grails 1.0.2 –
      Licensed under Apache Standard License 2.0
      Grails home is set to: /Users/arungupta/testbed/grails-1.0.2

      Base Directory: /Users/arungupta/testbed/grails-1.0.2/samples/crud
      Note: No plugin scripts found
      Running script /Users/arungupta/testbed/grails-1.0.2/scripts/War.groovy
      Environment set to production
         [delete] Deleting: /Users/arungupta/.grails/1.0.2/projects/crud/resources/web.xml
         [delete] Deleting directory /Users/arungupta/.grails/1.0.2/projects/crud/classes
      . . .
      [propertyfile] Updating property file: /Users/arungupta/testbed/grails-1.0.2/samples/crud/staging/WEB-INF/classes/
          [mkdir] Created dir: /Users/arungupta/testbed/grails-1.0.2/samples/crud/staging/WEB-INF/plugins
           [copy] Warning: /Users/arungupta/testbed/grails-1.0.2/samples/crud/plugins not found.
            [jar] Building jar: /Users/arungupta/testbed/grails-1.0.2/samples/crud/crud-0.1.war
         [delete] Deleting directory /Users/arungupta/testbed/grails-1.0.2/samples/crud/staging
      Done creating WAR /Users/arungupta/testbed/grails-1.0.2/samples/crud/crud-0.1.war

  4. Deploy the WAR file as:

    g="2" cellspacing="2">
    ~/testbed/grails-1.0.2/samples/crud >~/testbed/glassfish/v3/p2b9/glassfish/bin/asadmin deploy crud-0.1.war
    crud-0.1 deployed successfully
    Command deploy executed successfully.

    The application is now accessible at “http://localhost:8080/crud-0.1″ and looks like:

  5. READ – Click on “StateController” and the following page is shown:

  6. CREATE – Click on “New State” and enter the values as shown below:

    and click on “Create” to see the following page:

  7. UPDATE & DELETE – You can click on “Edit” or “Delete” to perform U or D of CRUD or click on “State List” to view the updated list.

Please leave suggestions on other TOTD that you’d like to see. A complete archive is available here.

Technorati: groovy grails glassfish mysql scripting netbeans

Share and Enjoy:
  • Print
  • Digg
  • Sphinn
  • Facebook
  • Google Bookmarks
  • DZone
  • StumbleUpon
  • Technorati
  • Twitter
  • Slashdot
Related posts:
  1. TOTD #30: CRUD Application using Grails – Hosted on Jetty and HSQLDB
  2. TOTD #80: Sinatra CRUD application using Haml templates with JRuby and GlassFish Gem
  3. Getting Started with Grails on GlassFish
  4. TOTD #75: Getting Started with Grails using GlassFish v3 Embedded
  5. Grails on GlassFish v3 – Embedded or Stand-alone


  1. hi,

    Talking about production mode:

    * you don’t want to use "pooled=false"
    * you maybe want to use a jndi data source

    Thus I’ m using something like:
    production {
    dataSource {

    Sadly you then have to update web.xml, and the glassfish deployment descriptors, too.

    Comment by Bernhard — April 24, 2008 @ 1:51 am

  2. @Bernhard: Thanks for the tip! I’m sure I missed some other guidelines for Grails deployment. This blog is merely intended to show hooks with GlassFish & MySQL.

    Comment by Arun Gupta — April 24, 2008 @ 12:58 pm

  3. How about showing a Grails CRUD application with two related tables? Example: Users and Address tables, related by address_id or similar.

    Comment by Kevin Slater — April 25, 2008 @ 5:37 am

  4. thanks for the tips however I think this is a little more thani can get into.

    Comment by VA Refinance — April 25, 2008 @ 7:38 pm

RSS feed for comments on this post. TrackBack URL

Leave a comment

Powered by WordPress