1 Reply Latest reply: Jun 14, 2012 5:36 PM by madchedar0 RSS

JBoss 7.1.1 and Hibernate 4.0.1 with mySQL - java.sql.SQLException: No suitable driver found for jdbc:mysql://

madchedar0 Newbie

I'm trying to create an ejb that programmatically configures hibernate to connect to a database.

 

I'm able to connect using just jdbc calls, but when I use hibernate, I'm getting a "No suitable driver found" error.

 

I have a HibernateFun bean that tells hibernate to load a User.hbm.xml file, then I set the hibernate connection properties.  dbhost is just mapped to 127.0.0.1 and my dummy user/password is user/password.  Again, I'm able to connect a-ok and retrieve data using a JDBC connection (see the jdbcConnect method).

 

Here's my code:

 

 

package test.ejb;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;

import org.hibernate.cfg.Configuration;

@Singleton
@Startup
public class HibernateFun {
    protected Logger logger;

    private static SessionFactory hibernateSessionFactory;

    public HibernateFun() {
        logger = Logger.getLogger(this.getClass());
    }

    @PostConstruct
    public void postConstruct() {
        //logger.info("This is a print from the post construct method!");

        /*logger.info("Going to try a regular jdbc connection");
        jdbcConnect();
        logger.info("Finished a regular jdbc connection test");*/

        logger.info("Trying a hibernate connect");
        hibernateConnect();
        logger.info("Finished hibernate connect");
    }

    private void hibernateConnect() {
        Configuration cfg = new Configuration();

        cfg.addClass(User.class);
        cfg.setProperty("hibernate.connection.driver_class", "com.mysql.jdbc.Driver"); 
        cfg.setProperty("hibernate.connection.url", "jdbc:mysql://dbhost:3306/");
        cfg.setProperty("hibernate.connection.username", "user");
        cfg.setProperty("hibernate.connection.password", "password");
        cfg.setProperty("hibernate.connection.pool_size", "1"); //?

        cfg.setProperty("hibernate.dialect", "org.hibernate.dialect.MySQLInnoDBDialect");

        hibernateSessionFactory = cfg.buildSessionFactory();


        logger.info("Going to try and do a session");
        Session session = hibernateSessionFactory.openSession();

        int ID = 1;
        User user = (User) session.createQuery("SELECT u FROM User u "
                    + "WHERE u.ID = ?").setInteger(0, ID).uniqueResult();

        session.close();

        logger.info("Here's the user I got: " + user.getName());
    }

    // This does connect/work correctly...
    private synchronized void jdbcConnect() {
        Connection conn = null;
        String url = "jdbc:mysql://dbhost:3306/";
        String driver = "com.mysql.jdbc.Driver";
        String userName = "user";
        String password = "password";
        try {
            Class.forName(driver).newInstance();
            conn = DriverManager.getConnection(url, userName, password);
            logger.info("\t\t*** Connected to the database! ***");
            conn.close();
            logger.info("\t\tDisconnected from database");
        } catch (Exception e) {
            logger.error("\t\t *** Trouble connecting to database: " + e);
        }
    }

}

 

 

And here's the log.  Not sure why there are double prints but that's another story:

 

14:03:40,718 INFO  [test.ejb.HibernateFun] (MSC service thread 1-3) Trying a hibernate connect
14:03:40,718 INFO  [com.emergentspace.mbs.data.DataTransformerBean] (MSC service thread 1-12) Starting MBS data transformation service
14:03:40,728 INFO  [org.hibernate.cfg.Configuration] (MSC service thread 1-1) HHH000221: Reading mappings from resource: test/ejb/User.hbm.xml
14:03:40,731 INFO  [org.hibernate.cfg.Configuration] (MSC service thread 1-3) HHH000221: Reading mappings from resource: test/ejb/User.hbm.xml
14:03:40,733 INFO  [org.hibernate.cfg.Configuration] (MSC service thread 1-1) HHH000221: Reading mappings from resource: test/ejb/User.hbm.xml
14:03:40,734 INFO  [org.hibernate.cfg.Configuration] (MSC service thread 1-3) HHH000221: Reading mappings from resource: test/ejb/User.hbm.xml
14:03:40,776 WARN  [org.hibernate.internal.util.xml.DTDEntityResolver] (MSC service thread 1-1) HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http
://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
14:03:40,776 WARN  [org.hibernate.internal.util.xml.DTDEntityResolver] (MSC service thread 1-3) HHH000223: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/. Use namespace http
://www.hibernate.org/dtd/ instead. Refer to Hibernate 3.6 Migration Guide!
14:03:40,856 INFO  [javax.enterprise.resource.webcontainer.jsf.config] (MSC service thread 1-4) Initializing Mojarra 2.1.7-jbossorg-1 (20120227-1401) for context '/mbs'
14:03:40,878 INFO  [org.jboss.web] (MSC service thread 1-9) JBAS018210: Registering web context: /db
14:03:40,902 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-3) HHH000402: Using Hibernate built-in connection pool (not for productio
n use!)
14:03:40,902 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-1) HHH000402: Using Hibernate built-in connection pool (not for productio
n use!)
14:03:40,907 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-1) HHH000115: Hibernate connection pool size: 1
14:03:40,907 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-3) HHH000115: Hibernate connection pool size: 1
14:03:40,909 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-1) HHH000006: Autocommit mode: false
14:03:40,910 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-3) HHH000006: Autocommit mode: false
14:03:40,912 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-1) HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://n
exusdb:3306/]
14:03:40,913 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-3) HHH000401: using driver [com.mysql.jdbc.Driver] at URL [jdbc:mysql://n
exusdb:3306/]
14:03:40,914 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-1) HHH000046: Connection properties: {user=user, password=****}
14:03:40,916 INFO  [org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl] (MSC service thread 1-3) HHH000046: Connection properties: {user=user, password=****}
14:03:40,918 WARN  [org.hibernate.engine.jdbc.internal.JdbcServicesImpl] (MSC service thread 1-1) HHH000342: Could not obtain connection to query metadata : No suitable driver found for jdbc:mysql://n
exusdb:3306/
14:03:40,920 WARN  [org.hibernate.engine.jdbc.internal.JdbcServicesImpl] (MSC service thread 1-3) HHH000342: Could not obtain connection to query metadata : No suitable driver found for jdbc:mysql://n
exusdb:3306/
14:03:40,923 INFO  [org.hibernate.dialect.Dialect] (MSC service thread 1-1) HHH000400: Using dialect: org.hibernate.dialect.MySQLInnoDBDialect
14:03:40,924 INFO  [org.hibernate.dialect.Dialect] (MSC service thread 1-3) HHH000400: Using dialect: org.hibernate.dialect.MySQLInnoDBDialect
14:03:40,927 INFO  [org.hibernate.engine.jdbc.internal.LobCreatorBuilder] (MSC service thread 1-1) HHH000422: Disabling contextual LOB creation as connection was null
14:03:40,928 INFO  [org.hibernate.engine.jdbc.internal.LobCreatorBuilder] (MSC service thread 1-3) HHH000422: Disabling contextual LOB creation as connection was null
14:03:40,930 INFO  [org.hibernate.engine.transaction.internal.TransactionFactoryInitiator] (MSC service thread 1-1) HHH000399: Using default transaction strategy (direct JDBC transactions)
14:03:40,932 INFO  [org.hibernate.engine.transaction.internal.TransactionFactoryInitiator] (MSC service thread 1-3) HHH000399: Using default transaction strategy (direct JDBC transactions)
14:03:40,935 INFO  [org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory] (MSC service thread 1-1) HHH000397: Using ASTQueryTranslatorFactory
14:03:40,938 INFO  [org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory] (MSC service thread 1-3) HHH000397: Using ASTQueryTranslatorFactory
14:03:40,971 INFO  [test.ejb.HibernateFun] (MSC service thread 1-1) Going to try and do a session
14:03:40,974 INFO  [test.ejb.HibernateFun] (MSC service thread 1-3) Going to try and do a session
14:03:41,046 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (MSC service thread 1-1) SQL Error: 0, SQLState: 08001
14:03:41,046 WARN  [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (MSC service thread 1-3) SQL Error: 0, SQLState: 08001
14:03:41,047 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (MSC service thread 1-1) No suitable driver found for jdbc:mysql://dbhost:3306/
14:03:41,049 ERROR [org.hibernate.engine.jdbc.spi.SqlExceptionHelper] (MSC service thread 1-3) No suitable driver found for jdbc:mysql://dbhost:3306/
14:03:41,061 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-1) MSC00001: Failed to start service jboss.deployment.subunit."mbs.ear"."mbs-ejb.jar".component.HibernateFun.START: org.jboss.msc.
service.StartException in service jboss.deployment.subunit."mbs.ear"."mbs-ejb.jar".component.HibernateFun.START: Failed to start service
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1767) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) [rt.jar:1.6.0_30]
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) [rt.jar:1.6.0_30]
        at java.lang.Thread.run(Thread.java:662) [rt.jar:1.6.0_30]
Caused by: java.lang.IllegalStateException: JBAS011048: Failed to construct component instance
        at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:163)
        at org.jboss.as.ee.component.BasicComponent.createInstance(BasicComponent.java:85)
        at org.jboss.as.ejb3.component.singleton.SingletonComponent.getComponentInstance(SingletonComponent.java:116)
        at org.jboss.as.ejb3.component.singleton.SingletonComponent.start(SingletonComponent.java:130)
        at org.jboss.as.ee.component.ComponentStartService.start(ComponentStartService.java:44)
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.startService(ServiceControllerImpl.java:1811) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1746) [jboss-msc-1.0.2.GA.jar:1.0.2.GA]
        ... 3 more
Caused by: javax.ejb.EJBException: org.hibernate.exception.JDBCConnectionException: Could not open connection
        at org.jboss.as.ejb3.tx.CMTTxInterceptor.handleExceptionInOurTx(CMTTxInterceptor.java:166)
        at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:230)
        at org.jboss.as.ejb3.tx.CMTTxInterceptor.requiresNew(CMTTxInterceptor.java:333)
        at org.jboss.as.ejb3.tx.SingletonLifecycleCMTTxInterceptor.processInvocation(SingletonLifecycleCMTTxInterceptor.java:56)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ejb3.component.interceptors.CurrentInvocationContextInterceptor.processInvocation(CurrentInvocationContextInterceptor.java:41)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ee.component.TCCLInterceptor.processInvocation(TCCLInterceptor.java:45)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.invocation.ChainedInterceptor.processInvocation(ChainedInterceptor.java:61)
        at org.jboss.as.ee.component.BasicComponent.constructComponentInstance(BasicComponent.java:161)
        ... 9 more
Caused by: org.hibernate.exception.JDBCConnectionException: Could not open connection
        at org.hibernate.exception.internal.SQLStateConversionDelegate.convert(SQLStateConversionDelegate.java:131)
        at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
        at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:304)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.getConnection(LogicalConnectionImpl.java:169)
        at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.extractPhysicalConnection(ConnectionProxyHandler.java:82)
        at org.hibernate.engine.jdbc.internal.proxy.ConnectionProxyHandler.continueInvocation(ConnectionProxyHandler.java:138)
        at org.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
        at $Proxy42.prepareStatement(Unknown Source)    at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:147)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:166)
        at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:145)
        at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:1739)
        at org.hibernate.loader.Loader.doQuery(Loader.java:828)
        at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:289)
        at org.hibernate.loader.Loader.doList(Loader.java:2463)
        at org.hibernate.loader.Loader.doList(Loader.java:2449)
        at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2279)
        at org.hibernate.loader.Loader.list(Loader.java:2274)
        at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:470)
        at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:355)
        at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:196)
        at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1115)
        at org.hibernate.internal.QueryImpl.list(QueryImpl.java:101)
        at org.hibernate.internal.AbstractQueryImpl.uniqueResult(AbstractQueryImpl.java:890)
        at test.ejb.HibernateFun.hibernateConnect(HibernateFun.java:71)
        at test.ejb.HibernateFun.postConstruct(HibernateFun.java:37)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) [rt.jar:1.6.0_30]
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) [rt.jar:1.6.0_30]
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) [rt.jar:1.6.0_30]
        at java.lang.reflect.Method.invoke(Method.java:597) [rt.jar:1.6.0_30]
        at org.jboss.as.ee.component.ManagedReferenceLifecycleMethodInterceptorFactory$ManagedReferenceLifecycleMethodInterceptor.processInvocation(ManagedReferenceLifecycleMethodInterceptorFactory.ja
va:130)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ee.component.ManagedReferenceInterceptorFactory$ManagedReferenceInterceptor.processInvocation(ManagedReferenceInterceptorFactory.java:95)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.invocation.WeavedInterceptor.processInvocation(WeavedInterceptor.java:53)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ee.component.NamespaceContextInterceptor.processInvocation(NamespaceContextInterceptor.java:50)
        at org.jboss.invocation.InterceptorContext.proceed(InterceptorContext.java:288)
        at org.jboss.as.ejb3.tx.CMTTxInterceptor.invokeInOurTx(CMTTxInterceptor.java:228)
        ... 18 more
Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://dbhost:3306/
        at java.sql.DriverManager.getConnection(DriverManager.java:602) [rt.jar:1.6.0_30]
        at java.sql.DriverManager.getConnection(DriverManager.java:154) [rt.jar:1.6.0_30]
        at org.hibernate.service.jdbc.connections.internal.DriverManagerConnectionProviderImpl.getConnection(DriverManagerConnectionProviderImpl.java:173)
        at org.hibernate.internal.AbstractSessionImpl$NonContextualJdbcConnectionAccess.obtainConnection(AbstractSessionImpl.java:276)
        at org.hibernate.engine.jdbc.internal.LogicalConnectionImpl.obtainConnection(LogicalConnectionImpl.java:297)
        ... 56 more

 

This ejb is contained within an .ear.... and in the jboss-deployment-structure.xml this is how the ejb is defined:

 

<sub-deployment name="my-test-ejb.jar">
        <dependencies>
            <module name="org.apache.log4j"/>
            <module name="org.hibernate"/>
            <module name="com.mysql"/>
        </dependencies>
    </sub-deployment>

 

I installed mysql as a module... so it's referenced in jboss-deployment-structure.xml above...

 

Any ideas?

 

I've checked out:

http://stackoverflow.com/questions/6969970/hibernate-no-suitable-driver-found-for-jdbcmysql

http://stackoverflow.com/questions/10065923/error-deploying-hibernate-app-on-jboss-no-suitable-driver-found-for-jdbc

http://stackoverflow.com/questions/10761910/jboss-7-1-no-suitable-driver-found-javamysql-could-not-open-connection/10770576#10770576

http://stackoverflow.com/questions/9097699/jboss-cant-find-jdbc-driver-for-postgresql-in-development-environment

https://forum.hibernate.org/viewtopic.php?f=1&t=1015157

 

Thanks

  • 1. Re: JBoss 7.1.1 and Hibernate 4.0.1 with mySQL - java.sql.SQLException: No suitable driver found for jdbc:mysql://
    madchedar0 Newbie

    These two threads ended up helping me out:

    https://community.jboss.org/thread/177875

    https://forum.hibernate.org/viewtopic.php?f=1&t=1015136

     

    What I have is a working solution but it definitely is more of a hack.  I ended up including the driver connector I was using (com.mysql) as a dependency within the org.hibernate module used by my ejb.  There must be a better way?  I'll need to read more on this but hopefully the jboss and hibernate communities know of a better solution.

     

    Working solution:


    I already had a mysql driver that I installed as a module in my jboss7.1.1:

    https://community.jboss.org/wiki/DataSourceConfigurationInAS7#Installing_a_JDBC_driver_as_a_module

     

    In my $JBOSS_HOME/modules/org/hibernate/main module I altered the module.xml:

     

     

    <dependencies>
            <module name="asm.asm"/>
            <module name="javax.api"/>
            <module name="javax.persistence.api"/>
            <module name="javax.transaction.api"/>
            <module name="javax.validation.api"/>
            <module name="org.antlr"/>
            <module name="org.apache.commons.collections"/>
            <module name="org.dom4j"/>
            <module name="org.infinispan" optional="true"/>
            <module name="org.javassist"/>
            <module name="org.jboss.as.jpa.hibernate" slot="4" optional="true"/>
            <module name="org.jboss.logging"/>
            <module name="org.hibernate.envers" services="import" optional="true"/>
            <!-- my hack!!! -->
            <module name="com.mysql"/>
    

     

    I added my database driver module (in this case com.mysql) as a dependency to hibernate itself.  This is a very dirty solution, but it seems to work with the code I originally posted. 

     

    Hopefully there is a better solution?  I'll leave this "unanswered" until a cleaner solution is known.  Really the goal is to have everything contained in one .ear and deployed to the JBoss server vice hacking individual files on JBoss itself.  Right?