无法使用 Hibernate 连接到 Informix

Posted

技术标签:

【中文标题】无法使用 Hibernate 连接到 Informix【英文标题】:Cannot connect to Informix using Hibernate 【发布时间】:2017-09-17 17:00:26 【问题描述】:

我正在尝试使用 Hibernate 5.2.10 连接到 Informix 数据库,但程序没有响应并且卡住而没有抛出任何错误消息。

我在控制台中找不到任何东西。关于我犯了什么错误的任何建议?我是 Hibernate 的新手

hibernate.cfg.xml

<property name="connection.driver_class">com.informix.jdbc.IfxDriver</property>
<property name="connection.url">jdbc:informixsqli://****:1528/****:informixserver=*****</property>
<property name="connection.username">*****</property>
<property name="connection.password">*****</property>

控制台:

Sep 17, 2017 11:05:55 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core 5.2.10.Final
Sep 17, 2017 11:05:55 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Sep 17, 2017 11:06:05 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations 5.0.1.Final
Sep 17, 2017 11:06:05 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH010002: C3P0 using driver: com.informix.jdbc.IfxDriver at URL: jdbc:informix-sqli://d7uat:1528/d7main:informixserver=uatserver
Sep 17, 2017 11:06:05 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH10001001: Connection properties: user=******, password=****
Sep 17, 2017 11:06:05 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH10001003: Autocommit mode: false
SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.
Sep 17, 2017 11:06:07 AM org.hibernate.c3p0.internal.C3P0ConnectionProvider configure
INFO: HHH10001007: JDBC isolation level: <unknown>
Sep 17, 2017 11:06:08 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.InformixDialect
Sep 17, 2017 11:06:14 AM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@7a0ef219] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.

HibernateUtil

private static final SessionFactory sessionFactory = buildSessionFactory();

public static SessionFactory getSessionFactory() 
    return sessionFactory;


private static SessionFactory buildSessionFactory()
    final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
    try 
        return new 
     MetadataSources(registry).buildMetadata().buildSessionFactory();
    
    catch (Throwable ex) 
        System.err.println("Initial SessionFactory creation failed." + ex);
        StandardServiceRegistryBuilder.destroy( registry );
        throw new ExceptionInInitializerError(ex);
    

Informix 测试

 public static CustomerInvoice lookupInvoice(String invoiceNumber)
    Session session = null;
    List<CustomerInvoice> customerInvoiceList = new ArrayList<CustomerInvoice>();
    CustomerInvoice customerInvoice = null;
    try 
        session = HibernateUtil.getSessionFactory().openSession();
        Query query = session.createQuery(invoiceByNumber);
        query.setParameter("invoiceNumber", invoiceNumber+"%");
        customerInvoiceList = ((org.hibernate.query.Query) query).list();

     catch (Exception e) 
        e.printStackTrace();
        session.close();
     finally 
        if (session != null && session.isOpen()) 
            session.close();
        
    


    if(customerInvoiceList.size()>0)
        customerInvoice = customerInvoiceList.get(0);
    

    return customerInvoice;


【问题讨论】:

可能在 Ifx 连接后(在 openSession() 中)出现异常,但未在控制台中记录/转储。尝试连接到虚拟数据库或使用错误密码时是否出现异常? 【参考方案1】:

我使用 5.2 和最新的 jdbc 驱动程序进行了快速测试,它似乎对我来说工作正常。我正在使用您的 HibernateUtil 和类似的 Hibernate 配置文件:

D:\Infx\work\Hibernate>java list
Sep 18, 2017 10:53:49 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core 5.2.11.Final
Sep 18, 2017 10:53:49 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Sep 18, 2017 10:53:49 AM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-configuration. Use namespace http://www.hibernate.org/dtd/hibernate-configuration instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Sep 18, 2017 10:53:50 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations 5.0.1.Final
Sep 18, 2017 10:53:50 AM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.informix.jdbc.IfxDriver] at URL [jdbc:informix-sqli://420ito:9088/stores7:INFORMIXSERVER=ids1210;user=informix;password=dummy;]
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: 
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Sep 18, 2017 10:53:51 AM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Sep 18, 2017 10:53:52 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.InformixDialect
Sep 18, 2017 10:53:53 AM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@37ebc9d8] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Sep 18, 2017 10:53:55 AM org.hibernate.hql.internal.QueryTranslatorFactoryInitiator initiateService
INFO: HHH000397: Using ASTQueryTranslatorFactory
Hibernate: select state0_.id as id1_0_, state0_.code as code2_0_, state0_.sname as sname3_0_, state0_.next_state_id as next_sta4_0_ from States state0_ order by state0_.id asc
test, test
test, test
Sep 18, 2017 10:53:55 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl stop
INFO: HHH10001008: Cleaning up connection pool [jdbc:informix-sqli://420ito:9088/stores7:INFORMIXSERVER=ids1210;user=informix;password=dummy;]

D:\Infx\work\Hibernate>

我得到类似“挂起”的唯一方法是如果我在打开的 session() 期间遇到异常。我强制使用没有“经典”方法的旧 Hibernate 版本库 (3.x) 编译该方法:

D:\Infx\work\Hibernate>java list
Sep 18, 2017 10:54:42 AM org.hibernate.Version logVersion
INFO: HHH000412: Hibernate Core 5.2.11.Final
Sep 18, 2017 10:54:42 AM org.hibernate.cfg.Environment <clinit>
INFO: HHH000206: hibernate.properties not found
Sep 18, 2017 10:54:42 AM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-configuration. Use namespace http://www.hibernate.org/dtd/hibernate-configuration instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Sep 18, 2017 10:54:42 AM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit>
INFO: HCANN000001: Hibernate Commons Annotations 5.0.1.Final
Sep 18, 2017 10:54:42 AM org.hibernate.boot.jaxb.internal.stax.LocalXmlResourceResolver resolveEntity
WARN: HHH90000012: Recognized obsolete hibernate namespace http://hibernate.sourceforge.net/hibernate-mapping. Use namespace http://www.hibernate.org/dtd/hibernate-mapping instead.  Support for obsolete DTD/XSD namespaces may be removed at any time.
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl configure
WARN: HHH10001002: Using Hibernate built-in connection pool (not for production use!)
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001005: using driver [com.informix.jdbc.IfxDriver] at URL [jdbc:informix-sqli://420ito:9088/stores7:INFORMIXSERVER=ids1210;user=informix;password=dummy;]
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001001: Connection properties: 
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Sep 18, 2017 10:54:44 AM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Sep 18, 2017 10:54:44 AM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.InformixDialect
Sep 18, 2017 10:54:46 AM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@37ebc9d8] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.
Exception in thread "main" java.lang.NoSuchMethodError: org.hibernate.SessionFactory.openSession()Lorg/hibernate/classic/Session;
        at list.main(list.java:12)
....
.... 
....

和你一样,“最后一个”INFO 消息是“从 JdbcConnectionAccess 获得的连接”,但之后我也得到了 nosuchmethod 异常。我必须按 control+c 才能出去。

也许您的异常已发送到其他地方;)

编辑

这是我用来直接从控制台测试它的代码,应该是运行它所需的一切。

D:\Infx\work\Hibernate>cat set5.cmd
@echo off
set CLASSPATH=
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\javassist-3.20.0-GA.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\dom4j-1.6.1.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\hibernate-jpa-2.1-api-1.0.0.Final.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\hibernate-core-5.2.11.Final.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\hibernate-commons-annotations-5.0.1.Final.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\ifxjdbc.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\jta-1.1.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\classmate-1.3.0.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\jboss-logging-3.3.0.Final.jar
set CLASSPATH=%CLASSPATH%;D:\infx\work\Hibernate\lib5\antlr-2.7.7.jar
set CLASSPATH=%CLASSPATH%;.

D:\Infx\work\Hibernate>cat hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
   "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
   "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
   <hibernate-configuration>
   <session-factory >
   <property
      name="connection.driver_class">com.informix.jdbc.IfxDriver
   </property>
   <property
       name="connection.url">jdbc:informix-sqli://420ito:9088/stores7:INFORMIXSERVER=ids1210;user=informix;password=dummy;
   </property>
   <property
      name="dialect">org.hibernate.dialect.InformixDialect
   </property>
    <property name="hibernate.show_sql">true
   </property>

   <property
       name="current_session_context_class">thread
   </property>
<property name="hbm2ddl.auto">update</property>

   <mapping resource="State.hbm.xml"/>
   </session-factory>

</hibernate-configuration>

D:\Infx\work\Hibernate>cat State.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
   "-//Hibernate/Hibernate Mapping DTD//EN"
   "http://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
   <class
      name="State"
      table="States">
      <id
         name="id"
         column="id">
         <generator class="increment"/>
      </id>

      <property
         name="code"
         column="code"/>
      <property
         name="sname"
         column="sname"/>
      <many-to-one
         name="nextState"
         cascade="all"
         column="next_state_id"/>
   </class>
</hibernate-mapping>

D:\Infx\work\Hibernate>cat HibernateUtil.java
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.boot.MetadataSources;
import org.hibernate.boot.registry.StandardServiceRegistry;
import org.hibernate.boot.registry.StandardServiceRegistryBuilder;
import org.hibernate.cfg.Configuration;

public class HibernateUtil  private static final SessionFactory sessionFactory = buildSessionFactory();

public static SessionFactory getSessionFactory() 
    return sessionFactory;


private static SessionFactory buildSessionFactory()
    final StandardServiceRegistry registry = new StandardServiceRegistryBuilder().configure().build();
    try 
        return new
     MetadataSources(registry).buildMetadata().buildSessionFactory();
    
    catch (Throwable ex) 
        System.err.println("Initial SessionFactory creation failed." + ex);
        StandardServiceRegistryBuilder.destroy( registry );
        throw new ExceptionInInitializerError(ex);
    


  public static void shutdown() 
// Close caches and connection pools
     getSessionFactory().close();
  



D:\Infx\work\Hibernate>cat create.java
import java.util.*;
import org.hibernate.*;
import javax.persistence.*;

public class create 
 public static void main(String[] args) 

   java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.FINEST  );
   java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.SEVERE  );
   Session Session = HibernateUtil.getSessionFactory().openSession();
   Transaction Transaction = Session.beginTransaction();

   State myState = new State();
   myState.setcode(args[0]);
   myState.setsname(args[1]);
   Long stateId = (Long) Session.save(myState);

   System.out.println("Stated added: "+myState.getcode()+", "+myState.getsname() );

   Transaction.commit();
   Session.close();
// Shutting down the application
   HibernateUtil.shutdown();
  


D:\Infx\work\Hibernate>cat list.java
import java.util.*;
import org.hibernate.*;
import javax.persistence.*;

public class list 
 public static void main(String[] args) 

   java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.FINEST  ); 
   java.util.logging.Logger.getLogger("org.hibernate").setLevel(java.util.logging.Level.SEVERE  );

   Session newSession = HibernateUtil.getSessionFactory().openSession();
   Transaction newTransaction = newSession.beginTransaction();
   List states = newSession.createQuery("from State order by id asc").list();

   for ( Iterator iter = states.iterator();
      iter.hasNext(); ) 
      State state = (State) iter.next();
      System.out.println(state.getcode() +", " + state.getsname() );
   
   newTransaction.commit();
   newSession.close();

   HibernateUtil.shutdown();
  

D:\Infx\work\Hibernate>

create.java 将插入一个新行,list.java 将从“State”表中选择:

D:\Infx\work\Hibernate>java com.informix.jdbc.Version
IBM Informix JDBC Driver Version 4.10.JC9

D:\Infx\work\Hibernate>javac create.java

D:\Infx\work\Hibernate>javac list.java

D:\Infx\work\Hibernate>java create test1 test2
Hibernate: select max(id) from States
Stated added: test1, test2
Hibernate: insert into States (code, sname, next_state_id, id) values (?, ?, ?, ?)

D:\Infx\work\Hibernate>java list
Hibernate: select state0_.id as id1_0_, state0_.code as code2_0_, state0_.sname as sname3_0_, state0_.next_state_id as next_sta4_0_ from States state0_ order by state0_.id asc
test, test
test, test
test1, test2

D:\Infx\work\Hibernate>

但我想它应该与您已经拥有的没有太大不同。

【讨论】:

我在其他任何地方都看不到我的异常,我使用的是 4.10.9 版本的 Informix JDBC 驱动程序。您使用的哪个版本可以正常工作? JC8 和 JC9 之间的东西 ;) 刚刚用 JC9 测试过,它的工作原理是一样的。使用虚拟用户时是否看到异常?【参考方案2】:

感谢您尝试帮助我。从休眠配置文件中删除此属性后,问题得到解决。

<property name="hbm2ddl.auto">update</property> 

【讨论】:

以上是关于无法使用 Hibernate 连接到 Informix的主要内容,如果未能解决你的问题,请参考以下文章

Spring Hibernate无法使用名称中的连字符连接到SQL Server

HSQLDB EJB3.0 Hibernate 无法连接到数据库

Java Hibernate - 无法连接到 H2

使用 Hibernate 连接到 SQL Server 2008 命名实例时出现问题

使用 JPA/Hibernate 将 Spring Boot 连接到 PostgreSql 数据库时失败

使用 micronaut-data-hibernate-jpa 库连接到 jpa 时出错