我想开始在我的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;
}
答案 0 :(得分:0)
尝试使用PostgreSQL compatibility mode:
要使用PostgreSQL模式,请使用数据库URL
jdbc:h2:~/test;MODE=PostgreSQL
或SQL语句SET MODE PostgreSQL
。