与 HSQLDB 的休眠连接

Posted

技术标签:

【中文标题】与 HSQLDB 的休眠连接【英文标题】:Hibernate connection with HSQLDB 【发布时间】:2012-07-18 11:54:58 【问题描述】:

我在设置我的第一个 Hibernate 项目时遇到问题。我遵循教程并在启动代码时卡住了。我相信,在开始与 HSQLDB 的连接时,程序会卡住。它不提供任何错误消息。 控制台中的详细输出如下:

172 [main] INFO org.hibernate.annotations.common.Version - Hibernate Commons Annotations 3.2.0.Final
172 [main] INFO org.hibernate.cfg.Environment - Hibernate 3.6.10.Final
172 [main] INFO org.hibernate.cfg.Environment - hibernate.properties not found
187 [main] INFO org.hibernate.cfg.Environment - Bytecode provider name : javassist
187 [main] INFO org.hibernate.cfg.Environment - using JDK 1.4 java.sql.Timestamp handling
265 [main] INFO org.hibernate.cfg.Configuration - configuring from resource: /hibernate.cfg.xml
265 [main] INFO org.hibernate.cfg.Configuration - Configuration resource: /hibernate.cfg.xml
375 [main] INFO org.hibernate.cfg.Configuration - Reading mappings from resource : org/itg/ACLwithHibernate/User.hbm.xml
484 [main] INFO org.hibernate.cfg.Configuration - Configured SessionFactory: null

现在已经配置好了,我调用 buildSessionFactory():

562 [main] INFO org.hibernate.cfg.HbmBinder - Mapping class: org.itg.ACLwithHibernate.User -> USER
577 [main] INFO org.hibernate.cfg.Configuration - Hibernate Validator not found: ignoring
593 [main] INFO org.hibernate.cfg.search.HibernateSearchEventListenerRegister - Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled.
593 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Using Hibernate built-in connection pool (not for production use!)
593 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - Hibernate connection pool size: 10
593 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - autocommit mode: false
609 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - using driver: org.hsqldb.jdbcDriver at URL: jdbc:hsqldb:hsql://localhost:9001
609 [main] INFO org.hibernate.connection.DriverManagerConnectionProvider - connection properties: user=sa, password=****

而且……仅此而已。它永远不会继续我的 main() 类中的下一条指令。它卡在某个地方。 当我调试时,我得到了这个:

overview of the debugger

这是我的 hibernate.cfg.xml:

<hibernate-configuration>

    <session-factory>

        <!-- Database connection settings -->
        <property name="connection.driver_class">org.hsqldb.jdbcDriver</property>
        <property name="connection.url">jdbc:hsqldb:hsql://localhost:9001</property>
        <property name="connection.username">sa</property>
        <property name="connection.password"></property>

        <!-- JDBC connection pool (use the built-in) -->
        <property name="connection.pool_size">10</property>

        <!-- SQL dialect -->
        <property name="dialect">org.hibernate.dialect.HSQLDialect</property>

        <!-- Enable Hibernate's automatic session context management -->
        <property name="current_session_context_class">thread</property>

        <!-- Disable the second-level cache  -->
        <property name="cache.provider_class">org.hibernate.cache.NoCacheProvider</property>

        <!-- Echo all executed SQL to stdout -->
        <property name="show_sql">true</property>

        <!-- Drop and re-create the database schema on startup -->
        <property name="hbm2ddl.auto">update</property>

        <mapping resource="org/itg/ACLwithHibernate/User.hbm.xml"/>

    </session-factory>

</hibernate-configuration>

我的 HSQLDB 服务器正在运行并输出以下内容:

[Server@3ed5dee4]: [Thread[org.hsqldb.Server.main(),5,org.hsqldb.Server]]: checkRunning(false) entered
[Server@3ed5dee4]: [Thread[org.hsqldb.Server.main(),5,org.hsqldb.Server]]: checkRunning(false) exited
[Server@3ed5dee4]: Startup sequence initiated from main() method
[Server@3ed5dee4]: Loaded properties from [C:\Users\dbr\workspace\test_hibernate\server.properties]
[Server@3ed5dee4]: Initiating startup sequence...
[Server@3ed5dee4]: Server socket opened successfully in 0 ms.
[Server@3ed5dee4]: Database [index=0, id=0, db=file:target/data/tutorial, alias=] opened sucessfully in 630 ms.
[Server@3ed5dee4]: Startup sequence completed in 640 ms.
[Server@3ed5dee4]: 2012-07-18 12:36:53.717 HSQLDB server 2.0.0 is online on port 9001
[Server@3ed5dee4]: To close normally, connect and execute SHUTDOWN SQL
[Server@3ed5dee4]: From command line, use [Ctrl]+[C] to abort abruptly

当 server.silent = false 时,当我的客户端连接时,我还会得到以下信息:

[Thread[HSQLDB Server @1af5458a,5,org.hsqldb.Server]]: handleConnection(Socket[addr=/127.0.0.1,port=49438,localport=9001]) entered
[Thread[HSQLDB Server @1af5458a,5,org.hsqldb.Server]]: handleConnection() exited
[Thread[HSQLDB Connection @9437a04,5,HSQLDB Connections @1af5458a]]: ODBC client connected.  ODBC Protocol Compatibility Version 0.0

您以前遇到过类似的问题吗?您知道出了什么问题吗? 非常感谢您。 丹妮

【问题讨论】:

您的数据库是否在本地主机上运行?你能远程登录到 localhost:9001 吗? @Funtik 你说得对,我没想过要这么做。是的,我可以 telnet 并收到 HSQLDB JDBC Network Listener. User JDBC driver with Network Compatibility Version1.9.0.0 and a JDBC URL like jdbc:hsqldb:hsql://hostname... 然后连接断开。 我不熟悉HSQLDB,但我会尝试创建一个数据库别名,并将其用作休眠连接中的数据库名称 要调试,请将 server.silent=false 添加到 server.properties。尝试使用 HSQLDB 2.2.8(来自 Maven),因为它与 Hibernate 方言更兼容。 谢谢@fredt,我尝试使用 2.2.8 版和 server.silent=false 并编辑我的帖子以包含固有日志。 【参考方案1】:

当 HSQLDB Server 与 Hibernate 或其他框架一起使用时,必须检查客户端和服务器使用的 HSQLDB jar 版本,并确保它们是相同版本的 HSQLDB。还需要使用最新版本的 HSQLDB。

如果您使用属性server.silent=false(或silent=false 作为命令行参数)启动 HSQLDB 服务器,则很容易对 HSQLDB 服务器进行故障排除。这将显示尝试的连接。

在本例中,服务器显示:

[Thread[HSQLDB Connection @9437a04,5,HSQLDB Connections @1af5458a]]: 
      ODBC client connected.  ODBC Protocol Compatibility Version 0.0

这表示版本不兼容问题,因为 ODBC 实际上并未用于 Java 到 HSQLDB 的连接。

【讨论】:

【参考方案2】:

它卡在连接到您的数据库中。 为了调试,从配置中删除连接池大小元素并将 hbmtoddl 设置为 false。

【讨论】:

不幸的是,它给了我完全相同的行为和输出。不知何故,连接似乎建立得很好,因为当我终止“冻结”代码时,我在服务器的输出上得到一个java.net.SocketException: Connection reset 我的 log4j.properties 中有 log4j.logger.org.hibernate=debuglog4j.rootLogger=debug, stdoutlog4j.logger.org.hibernate.SQL=debug 但您在信息模式而不是调试模式下运行。可以看到日志级别是info

以上是关于与 HSQLDB 的休眠连接的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 netbeans 将 javadb 或 hsqldb 嵌入到带有休眠的 java 应用程序中?

与本地 HSQLDB 的多个连接 - Java

连接 HSQLDB 服务器

org.hsqldb.HsqlException:连接异常:连接失败:java.io.EOFException

HSQLDB - 9.0 之前的客户端尝试连接

如何将多个数据库( hsqldb、mysql )与单独文件中的 DB 设置连接起来