将Spring Boot Postgres转换为H2

时间:2016-11-22 05:36:20

标签: spring-boot h2

我想开始在我的API层中运行H2作为嵌入式数据库,这非常轻。我收到一个我似乎无法找到的错误,除了我的SQL语法之外,使用H2而不是postgres的主要更改是什么:

// source: Data Structures and Problem Solving Using C++ 2nd Edition
// page 329
void sortingAlgs::shellSort(std::vector<int>& array, int n) {
    for (int gap{static_cast<int>(n/2)}; gap > 0;
         gap = gap == 2 ? 1 : static_cast<int>(gap / 2.2)) { // floor
        for (int i{gap}; i < n; i++) {
            int temp = array[i];
            int j = i;

            for (; j >= gap && temp < array[j-gap]; j -= gap) {
                array[j] = array[j-gap];
            }
            array[j] = temp;
        }
}
}


// source: http://quiz.geeksforgeeks.org/heap-sort/
// source: Introduction to Algorithms page 154
    void sortingAlgs::max_heapify(std::vector<int>& array, int n, int i) {
    int largest = i;      // Initialize largest as root
    int l = 2*i + 1;  // left = 2*i + 1
    int r = 2*i + 2;  // right = 2*i + 2

    // If left child is larger than root
    if (l < n && array[l] > array[largest])
        largest = l;

    // If right child is larger than largest so far
    if (r < n && array[r] > array[largest])
        largest = r;

    // If largest is not root
    if (largest != i) {
        std::swap(array[i], array[largest]);
        // Recursively heapify the affected sub-tree
        max_heapify(array, n, largest);
    }
}

// source: http://quiz.geeksforgeeks.org/heap-sort/
// source: Introduction to Algorithms page 160
void sortingAlgs::heapSort(std::vector<int>& array, int n) {
    // Build heap (re-arrange array)
    for (int i = (n / 2) - 1; i >= 0; i--) {
        max_heapify(array, n, i);
    }

    // One by one extract an element from heap
    for (int i = n-1; i >= 0; i--)
    {
        // Move current root to end
        std::swap(array[0], array[i]);
        // call max heapify on the reduced heap
        max_heapify(array, i, 0);
    }
}

这是我的类PsqlUtils:

16 9:27:41 PM org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: Invalid value "1000" for parameter "resultSetHoldability" [90008-193]] with root cause
org.h2.jdbc.JdbcSQLException: Invalid value "1000" for parameter "resultSetHoldability" [90008-193]
    at org.h2.message.DbException.getJdbcSQLException(DbException.java:345)
    at org.h2.message.DbException.get(DbException.java:179)
    at org.h2.message.DbException.getInvalidValueException(DbException.java:228)
    at org.h2.jdbc.JdbcConnection.checkHoldability(JdbcConnection.java:1445)
    at org.h2.jdbc.JdbcConnection.createStatement(JdbcConnection.java:261)
    at com.project.x.api.utils.PsqlUtils.getStatement(PsqlUtils.java:146)
    at com.project.x.api.utils.PsqlUtils.sqltoList(PsqlUtils.java:51)
    at com.project.x.api.utils.PsqlUtils.sqltoJson(PsqlUtils.java:79)
    at com.project.x.api.dao.UserDao.getUserCnt(UserDao.java:192)

示例用户DAO可能存在问题:

@Component
public class PsqlUtils {

    final static Logger log = LoggerFactory.getLogger(PsqlUtils.class);

    //Config
    private final String db_url;
    private final String db_username;
    private final String db_password;
    @Autowired
    public PsqlUtils(@Value("${db.url}") String db_url, @Value("${db.username}") String db_username, @Value("${db.password}") String db_password) {
        this.db_url = db_url;
        this.db_username = db_username;
        this.db_password = db_password;
    }



    public List<Map<String, Object>> sqltoList(final String sql) {
        log.debug("SqltoJson sql : {}", sql);
        String jsonData;

        Connection connection;
        Statement statement;
        ResultSet resultSet;
        final List<Map<String, Object>> objList = new ArrayList<>();

        try  {
            connection = getConnection();
            connection.setAutoCommit(false);
            statement = getStatement(connection);
            resultSet = executeQuery(statement, sql);

            final int columnCount = resultSet.getMetaData().getColumnCount();

            while (resultSet.next()) {
                final Map<String, Object> rowData = new HashMap<>();
                for (int column = 1; column <= columnCount; ++column) {
                    rowData.put(resultSet.getMetaData().getColumnName(column), resultSet.getObject(column));
                }
                objList.add(rowData);
            }

            resultSet.close();
            statement.close();
            connection.close();


        }catch (SQLException | IOException e){
            throw new RuntimeException(e.getMessage(), e);
        }
        return objList;
    }

    public String sqltoJson(final String sql) throws SQLException {
        log.debug("SqltoJson sql : {}", sql);
        String jsonData;

        List<Map<String, Object>> objList = sqltoList(sql);

        if (!objList.isEmpty()) {
            final ObjectMapper mapper = new ObjectMapper();
            try {
                jsonData = mapper.writeValueAsString(objList);
            } catch (JsonProcessingException e) {
                throw new RuntimeException(e.getMessage(), e);
            }
        } else {
            jsonData = "[]";
        }



        return jsonData;
    }

    public String sqltoJsonObject(final String sql) throws SQLException {
        log.debug("SqltoJson sql : {}", sql);

        String jsonData;

        Connection connection;
        Statement statement;
        ResultSet resultSet;

        try  {
            connection = getConnection();
            connection.setAutoCommit(false);
            statement = getStatement(connection);
            resultSet = executeQuery(statement, sql);

            final int columnCount = resultSet.getMetaData().getColumnCount();
            final List<Map<String, Object>> objList = new ArrayList<>();

            resultSet.next();
            final Map<String, Object> rowData = new HashMap<>();
            for (int column = 1; column <= columnCount; ++column) {
                rowData.put(resultSet.getMetaData().getColumnName(column), resultSet.getObject(column));
            }
            objList.add(rowData);

            if (!objList.isEmpty()) {
                final ObjectMapper mapper = new ObjectMapper();
                jsonData = mapper.writeValueAsString(rowData);
            } else {
                jsonData = "[]";
            }


        } catch (SQLException | IOException e){
            throw new RuntimeException(e.getMessage(), e);
        }
        return jsonData;
    }

    public Connection getConnection() throws IOException, SQLException {

        //final Properties props = readProperties(propertiesPath);
        final Connection connection = DriverManager.getConnection(db_url, db_username, db_password);
        connection.setAutoCommit(false);
        return connection;
    }


    public Statement getStatement(Connection connection) throws SQLException {
        final Statement statement = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY, ResultSet.CONCUR_READ_ONLY, ResultSet.FETCH_FORWARD);
        statement.setFetchSize(0);
        return statement;
    }

    public ResultSet executeQuery(Statement statement, String query) throws SQLException {
        log.debug("sql : {}", query);
        return statement.executeQuery(query);
    }

    public Statement getStatementExecute(Connection connection) throws SQLException {
        return connection.createStatement();
    }
}

在H2控制台上,SQL工作正常:

public String getUserCnt() throws NarratorException {
    final String sql = "select count(\"user_id\") cnt from \"user\"";
    final String jsonArray;

    try {
        jsonArray = psqlUtils.sqltoJson(sql);
    } catch (SQLException e){
        throw new RuntimeException(e.getMessage(), e);
    }
    if (jsonArray.equals("[]")) {
        throw new NarratorException(Response.Status.NOT_FOUND, "User Not Found!!!");
    }
        return jsonArray;
}

1 个答案:

答案 0 :(得分:0)

尝试使用PostgreSQL compatibility mode

  

要使用PostgreSQL模式,请使用数据库URL jdbc:h2:~/test;MODE=PostgreSQL或SQL语句SET MODE PostgreSQL