JDO - 数据核 - HSQL 错误

Posted

技术标签:

【中文标题】JDO - 数据核 - HSQL 错误【英文标题】:JDO - datanucleus - HSQL error 【发布时间】:2012-05-17 14:15:53 【问题描述】:

对于我当前的项目,我必须使用 HSQL-JDO。我正在编写示例应用程序来检查它是如何工作的。如果我将 HSQL 与 jdbc(没有任何 orm)一起使用,我的代码运行良好。但是使用 JDO 我收到“套接字创建错误”

[Server@187a84e4]: [Thread[main,5,main]]: checkRunning(false) entered [Server@187a84e4]: [Thread[main,5,main]]: checkRunning(false) exited [Server@187a84e4]: [Thread[main,5,main]]: checkRunning(false) entered [Server@187a84e4]: [Thread[main,5,main]]: checkRunning(false) exited [Server@187a84e4]: [Thread[main,5,main]]: checkRunning(false) entered [Server@187a84e4]: [Thread[main,5,main]]: checkRunning(false) exited [Server@187a84e4]: [Thread[main,5,main]]: checkRunning(false) entered [Server@187a84e4]: [Thread[main,5,main]]: checkRunning(false) exited JdbcOdbcDriver class loaded registerDriver: driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@a13f991] DriverManager.initialize: jdbc.drivers = null JDBC DriverManager initialized registerDriver: driver[className=org.hsqldb.jdbcDriver,org.hsqldb.jdbcDriver@44e06940] DriverManager.getConnection("jdbc:hsqldb:hsql://localhost:8974/test_db") trying driver[className=sun.jdbc.odbc.JdbcOdbcDriver,sun.jdbc.odbc.JdbcOdbcDriver@a13f991] *Driver.connect (jdbc:hsqldb:hsql://localhost:8974/test_db) trying driver[className=org.hsqldb.jdbcDriver,org.hsqldb.jdbcDriver@44e06940] SQLState(08000) vendor code(-80) java.sql.SQLException: socket creation error at org.hsqldb.jdbc.Util.sqlException(Unknown Source) at org.hsqldb.jdbc.jdbcConnection.(Unknown Source) at org.hsqldb.jdbcDriver.getConnection(Unknown Source) at org.hsqldb.jdbcDriver.connect(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at java.sql.DriverManager.getConnection(Unknown Source) at org.apache.commons.dbcp.DriverManagerConnectionFactory.createConnection(DriverManagerConnectionFactory.java:78) at org.apache.commons.dbcp.PoolableConnectionFactory.makeObject(PoolableConnectionFactory.java:582) at org.apache.commons.pool.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:1158) at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106) at org.datanucleus.store.rdbms.ConnectionFactoryImpl$ManagedConnectionImpl.getConnection(ConnectionFactoryImpl.java:444) at org.datanucleus.store.rdbms.RDBMSStoreManager.(RDBMSStoreManager.java:264)

这是 main 中的代码 Server server = new Server(); server.setAddress("localhost"); server.setDatabaseName(0, "test_db"); server.setDatabasePath(0, "test_db"); server.setPort(8974); server.setTrace(true);

    Properties properties = new Properties();
    properties.setProperty("javax.jdo.PersistenceManagerFactoryClass","org.datanucleus.api.jdo.JDOPersistenceManagerFactory");
    properties.setProperty("javax.jdo.option.ConnectionDriverName","org.hsqldb.jdbcDriver");
    properties.setProperty("javax.jdo.option.ConnectionURL","jdbc:hsqldb:hsql://localhost:8974/test_db");
    properties.setProperty("javax.jdo.option.ConnectionUserName","SA");
    properties.setProperty("javax.jdo.option.ConnectionPassword","");
    properties.setProperty("javax.jdo.option.ConnectionPassword","");

    properties.setProperty("datanucleus.autoCreateSchema","true");
    properties.setProperty("datanucleus.validateTables","false");
    properties.setProperty("datanucleus.validateConstraints","false");

    PersistenceManagerFactory pmf = JDOHelper.getPersistenceManagerFactory(properties);

    PersistenceManager pm = pmf.getPersistenceManager();
    Transaction tx=pm.currentTransaction();

    tx.begin();
    pm.makePersistent(new Session("aniruddha"));
    tx.commit();

    Query q = pm.newQuery("SELECT FROM "+Session.class.getName());

    List<Session> sessions = (List<Session>)q.execute();
    //Iterator<Session> iter = sessions.iterator();

    for(Session s : sessions)
        System.out.println(s.getSESSION_ID()+" : "+s.getSESSION_USERNAME());
    

这是我要坚持的豆子

@PersistenceCapable public class Session private Session() // Default constructor required by jdo public Session(String session_username) SESSION_USERNAME = session_username;

public long getSESSION_ID() 
    return SESSION_ID;

public String getSESSION_USERNAME() 
    return SESSION_USERNAME;

public void setSESSION_ID(long sESSION_ID) 
    SESSION_ID = sESSION_ID;

public void setSESSION_USERNAME(String sESSION_USERNAME) 
    SESSION_USERNAME = sESSION_USERNAME;



@PrimaryKey
@Persistent(valueStrategy=IdGeneratorStrategy.INCREMENT)
private long SESSION_ID;
private String SESSION_USERNAME;

【问题讨论】:

谷歌搜索该异常,HSQL 将提供大量信息 如果我输入类似“jdbc:hsqldb:file:test_db”的连接字符串。有用。但如果连接字符串类似于“jdbc:hsqldb:hsql://localhost:8974/test_db”给我“套接字创建错误” 我的配置好像有问题。我做了谷歌,但还没有找到解决问题的方法。 评论 ***.com/questions/10637433/… 对我来说很好。 【参考方案1】:

如果服务器模式不起作用,那么您还没有启动 HSQLDB 服务器。适用于我的任何一种形式,无论是 URL 还是文件。我完全按照 HSQLDB 文档从命令行启动服务器。

通过对 Server 的 API 调用,您似乎缺少调用“server.start()”。无论哪种方式,问题都在于 HSQLDB 服务器启动,而不是 DataNucleus 访问。

【讨论】:

感谢您的回复。我的问题解决了。我没有启动服务器。

以上是关于JDO - 数据核 - HSQL 错误的主要内容,如果未能解决你的问题,请参考以下文章

为啥我在 Google App Engine 上使用 JDO 的查询中出现转换错误?

HSQL 触发器生成 SQL 错误:-458,SQLState: S1000 / java.lang.ArrayIndexOutOfBoundsException

SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase] 错误

HSQL 2.2.4,错误的查询计划

HSQL 和 Hibernate - 许多删除语句上的内存不足错误

liquibase hsql db列创建错误