2017-04-20 19 views
2

問題は何ですか?私はH2データベースを使用しますエラー:PoolableConnectionFactoryを作成できません(falseを返したisValid())

誰かが私の問題の解決策を持っていますか? Iを使用しH2 DATA BASE、休止

このHY HibernateConfig.java

package com.train.shoponlinebackend.config; 
@Configuration 
@ComponentScan(basePackages = {"com.train.shoponlinebackend.dto"}) 
@EnableTransactionManagement 
public class HibernateConfig { 

private static String DATABASE_URL = "jdbc:h2:tcp://localhost/~/onlineshopping"; 
private static String DATABASE_DRIVER = "org.h2.Driver"; 
private static String DATABASE_DIALECT = "org.hibernate.dialect.H2Dialect"; 
private static String DATABASE_USERNAME = "sa"; 
private static String DATABASE_PASSWORD = ""; 
@Bean 
public DataSource getDataSource() { 

    BasicDataSource dataSource = new BasicDataSource(); 
    dataSource.setDriverClassName(DATABASE_DRIVER); 
    dataSource.setUrl(DATABASE_URL); 
    dataSource.setUsername(DATABASE_USERNAME); 
    dataSource.setPassword(DATABASE_PASSWORD); 

    return dataSource; 
} 

@Bean 
public SessionFactory getSessionFactory(DataSource dataSource) { 
    LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(dataSource); 

    builder.addProperties(getHibernateProperties()); 
    builder.scanPackages("com.train.shoponlinebackend.dto"); 

    return builder.buildSessionFactory(); 
} 

private Properties getHibernateProperties() { 
    // TODO Auto-generated method stub 
    Properties properties = new Properties(); 
    properties.put("hibernate.dialect", DATABASE_DIALECT); 
    properties.put("hibernate.show_sql", true); 
    properties.put("hibernate.format_sql", true); 

    return properties; 
} 

@Bean 
public HibernateTransactionManager getTransactionManager(SessionFactory sessionFactory) { 
    HibernateTransactionManager transactionManager = new HibernateTransactionManager(sessionFactory); 

    return transactionManager; 
} 

}

DAO IMPLマイ方法5:

@Repository("categoryDAO") 
public class CategoryDAOImpl implements CategoryDAO { 

    @Autowired 
    private SessionFactory sessionFactory; 


    @Override 
     @Transactional 
     public boolean add(Category category) { 
      try { 
       // add category 
       sessionFactory.getCurrentSession().persist(category); 
       return true; 

      } catch (Exception e) { 
       e.printStackTrace(); 
       return false; 
      } 
     } 
} 

マイJUnitテスト

@Test 
    public void testAdCategory(){ 
     category = new Category(); 
     category.setActive(true); 
     category.setDescription("This is some description of TV"); 
     category.setImageURL("CAT_1.png"); 
     category.setName("Television"); 

     assertEquals("Success added category", true, categoryDAO.add(category)); 
    } 

私のエラー私のJUnitテストを実行している:

org.springframework.transaction.CannotCreateTransactionException: Could not open Hibernate Session for transaction; nested exception is org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection 
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:542) 
    at org.springframework.transaction.support.AbstractPlatformTransactionManager.getTransaction(AbstractPlatformTransactionManager.java:373) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.createTransactionIfNecessary(TransactionAspectSupport.java:447) 
    at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:277) 
    at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) 
    at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
    at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213) 
    at com.sun.proxy.$Proxy28.add(Unknown Source) 
    at com.train.shoponlinebackend.test.CategoryTestCase.testAdCategory(CategoryTestCase.java:36) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) 
    at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) 
    at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) 
    at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) 
    at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:325) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) 
    at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) 
    at org.junit.runners.ParentRunner$3.run(ParentRunner.java:290) 
    at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) 
    at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) 
    at org.junit.runners.ParentRunner.access$000(ParentRunner.java:58) 
    at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) 
    at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:26) 
    at org.junit.runners.ParentRunner.run(ParentRunner.java:363) 
    at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:86) 
    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:459) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:675) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:382) 
    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:192) 
Caused by: org.hibernate.exception.GenericJDBCException: Unable to acquire JDBC Connection 
    at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:111) 
    at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:97) 
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:102) 
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.getPhysicalConnection(LogicalConnectionManagedImpl.java:129) 
    at org.hibernate.internal.SessionImpl.connection(SessionImpl.java:514) 
    at org.springframework.orm.hibernate5.HibernateTransactionManager.doBegin(HibernateTransactionManager.java:448) 
    ... 32 more 
Caused by: java.sql.SQLException: Cannot create PoolableConnectionFactory (isValid() returned false) 
    at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2294) 
    at org.apache.commons.dbcp2.BasicDataSource.createDataSource(BasicDataSource.java:2039) 
    at org.apache.commons.dbcp2.BasicDataSource.getConnection(BasicDataSource.java:1533) 
    at org.hibernate.engine.jdbc.connections.internal.DatasourceConnectionProviderImpl.getConnection(DatasourceConnectionProviderImpl.java:122) 
    at org.hibernate.internal.NonContextualJdbcConnectionAccess.obtainConnection(NonContextualJdbcConnectionAccess.java:35) 
    at org.hibernate.resource.jdbc.internal.LogicalConnectionManagedImpl.acquireConnectionIfNeeded(LogicalConnectionManagedImpl.java:99) 
    ... 35 more 
Caused by: java.sql.SQLException: isValid() returned false 
    at org.apache.commons.dbcp2.PoolableConnection.validate(PoolableConnection.java:284) 
    at org.apache.commons.dbcp2.PoolableConnectionFactory.validateConnection(PoolableConnectionFactory.java:357) 
    at org.apache.commons.dbcp2.BasicDataSource.validateConnectionFactory(BasicDataSource.java:2307) 
    at org.apache.commons.dbcp2.BasicDataSource.createPoolableConnectionFactory(BasicDataSource.java:2290) 
    ... 40 more 

答えて

3

があなたのpom.xmlファイル内のH2のバージョンを確認してください。

h2データベースエンジンが1.4.194の場合、h2データベースドライバのmavenまたはgradleを使用して追加する依存関係も1.4.194である必要があります。

0

H2を使用するたびにこの問題に遭遇するため、根本的な原因(および解決策)を再掲します。 H230をインストールして接続したら、インストールしたH2 bin Jar(メインクラスのもの)の正確なバージョンを確認してください。 H2サーバーの場所はあなたのプログラムではありません)。ここで私は(今月...)使用していますものです:もちろん

C:\Program Files (x86)\H2\bin\h2-1.4.195.jar 

あなたH2サーバが別のプラットフォームや場所にすることができ..

ルール:いつセットアップクラスパス(つまり、あなたのMavenはプロジェクトのPOMファイル)**あなたのH2サーバーで使用されているものと同じH2 jarファイルをプログラムに指定してください**(上記のものは私のものです)。 H2はこれに非常に厄介です。

Mavenのユーザーは、これが彼らのPOMファイルに指定されている場合があります:

<!-- H2 DATABASE --> 
<dependency> 
    <groupId>com.h2database</groupId> 
    <artifactId>h2</artifactId> 
    <version>1.4.193</version> <!-- Does not match the server jar --> 
</dependency> 

は "193" を参照してください?これは、上記のjarファイルを参照してください(195を使用)。

195を使用するようにPOMを変更すると、問題を解決します(ここで使用しているものは何でもH2のバージョン代替)

<!-- H2 DATABASE --> 
    <dependency> 
     <groupId>com.h2database</groupId> 
     <artifactId>h2</artifactId> 
     <version>1.4.195</version> <!-- Matches the server JAR --> 
    </dependency> 

あなたがイライラやMavenリポジトリに得ることができない場合は、単にH2をコピーしますプロジェクトの外に(あなたのプロジェクトの外に)あなたのプロジェクトに(サーバの外に)インストールされたサーバjarファイルを移動してください。

関連する問題