2012-09-25 110 views
0

我目前編碼一個CRUD項目,我使用HSQL-DB:CRUD方法不使用hsql-db連接?

這裏是我的HSQL-DB連接器類:

public class hsqlmanager { 

    private static final Logger log = Logger.getLogger(hsqlmanager.class); 

    private static Connection con=null; 

    private static void openConnection(){ 
     try { 
      Class.forName("org.hsqldb.jdbcDriver"); 
      log.info("Loaded JDBC Driver"); 
     } 
     catch (Exception e) { 
      log.error("ERROR: failed to load JDBC driver - " + e.getMessage()); 
      return; 
     } 

     try { 
      con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/db_test","SA",""); 
      log.info("Connection established");   
     } 
     catch(SQLException e){ 
      log.error("db connection error Exception: " + e.getMessage()); 
     } 
    } 

    public static void closeConnection() { 
     try { 
      con.close(); 
      log.info("DB conn closed"); 
     } 
     catch(SQLException e) { 
      log.error("Error at closing" + e.getMessage()); 
     } 
    } 

    public static Connection getConnection() { 
     if (con==null){ 
      openConnection(); 
     } 
     else { 
      try { 
       if(con.isClosed()){ 
        con = DriverManager.getConnection("jdbc:hsqldb:hsql://localhost/db_test","SA",""); 
        log.info("DB connection re-opened."); 
       } 
      } catch(SQLException e){ 
       log.error("re-open mistake" + e.getMessage()); 
       return null; 
      } 
     } 

     return con; 
    } 

} 

這裏是我的CRUD類:

import java.sql.Connection; 
import java.sql.PreparedStatement; 
import java.sql.ResultSet; 
import java.sql.SQLException; 
import java.util.ArrayList; 

import org.apache.log4j.Logger; 

public class DAOProdukt implements IDAOProdukt { 

    private static final Logger log = Logger.getLogger(DAOProdukt.class); 
    Connection conn; 

    public DAOProdukt(){ 
     conn = hsqlmanager.getConnection(); 
    } 
    //created ein Produkt p 
    @Override 
    public void create(Produkt p) { 
     if(p==null) {   throw new IllegalArgumentException("Erstellen von null-Objekten in der DB nicht möglich"); 
     } 
     PreparedStatement ps=null; 

     try { 
      ps = conn.prepareStatement("INSERT INTO Produkt(name, kategorie, delete) VALUES(?, ?, ?, ?);"); 
     } catch (SQLException e1) { 
      log.error("Cannot establish db connection"); 
      e1.printStackTrace(); 
     } 

     try { 

      ps.setString(1, p.getName()); 
      ps.setString(2, p.getKategorie()); 
      ps.setBoolean(3, p.isDeleted()); 
      ps.execute(); 
      ps.close(); 

      log.info("Produkt created."); 
     } 
     catch (SQLException e) { 
      log.error("Produkt couldn`t be created: " + e.toString()); 
     } 

    } 
} 

編譯器總是指向crud類並給出錯誤信息:

log.error("Cannot establish db connection"); 

我非常感謝你的回答!

PS:我運行該命令的服務器: 的java -classpath的lib/hsqldb.jar中org.hsqldb.server.Server --database.0文件:HSQLDB/hemrajdb --dbname.0 db_test

回答

0

嘗試連接之前,必須啓動HSQLDB服務器以在jdbc:hsqldb:hsql://localhost/db_test URL處提供數據庫服務。

見指南:

http://hsqldb.org/doc/2.0/guide/running-chapt.html#rgc_server_modes

您發表評論您已啓動服務器。因此我更仔細地查看了你的代碼。這裏有個問題:

try { 
     ps = conn.prepareStatement("INSERT INTO Produkt(name, kategorie, delete) VALUES(?, ?, ?, ?);"); 
    } catch (SQLException e1) { 
     log.error("Cannot establish db connection"); 
     e1.printStackTrace(); 
    } 

當你捕捉到異常時,你應該記錄異常消息。您記錄的固定消息可能不正確。

如果您查看INSERT語句,將列出三列,但將四個參數作爲值。 HSQLDB將通過一條信息消息來引發異常。但是,您的代碼會忽略該消息,而是會打印您自己的錯誤消息。

+0

ok我嘗試重構代碼一點點,並把jdbc:hsqldb:hsql:// localhost/db_test第一次,但我仍然得到相同的錯誤信息... – maximus

+0

服務器是一個單獨的進程,你運行在你的節目之前。 – fredt

+0

是啊我的服務器正在運行該命令:java -classpath lib/hsqldb.jar org.hsqldb.server.Server --database.0文件:hsqldb/hemrajdb --dbname.0 db_test – maximus