You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@ignite.apache.org by 王 刚 <wa...@live.cn> on 2018/03/26 01:42:09 UTC
答复: Liquibase with Ignite?
Maybe beause there is no callback fucntion for org.apache.ignite.IgniteJdbcThinDriver.
I use a class mock liquibase, hope can help you:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.samples.vehicles.ignite.init;
import com.samples.vehicles.common.DomainUtils;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DependsOn;
import org.springframework.jdbc.core.JdbcTemplate;
/**
* @author lenovo
*/
@Configuration
public class ILikeLiquibase {
private final Logger log = LoggerFactory.getLogger(this.getClass());
@Autowired
private JdbcTemplate jdbcTemplate;
private final String lock = UUID.randomUUID().toString();
private final List<String> sqlList = new ArrayList<>();
private final Map<String, String> sqlMap = new HashMap<>();
//add new script here
private void loadScripts() {
addSql("20180314WG03", "DROP TABLE IF EXISTS alarm_record_file;");
addSql("20180314WG04", "CREATE TABLE alarm_record_file(fileossid VARCHAR PRIMARY KEY,alarm_id VARCHAR,"
+ "file_type Long, channel Long, create_time TIMESTAMP);");
addSql("20180314WG05", "DROP TABLE IF EXISTS gps;");
addSql("20180314WG06", "CREATE TABLE gps(id Long PRIMARY KEY ,vehicle_id Long, time TIMESTAMP,driver_id Long,"
+ "status Long,lng Long,lat Long,height Long,speed Long,direction Long,wirelessstrength Long,gnns Long,mileage Long);");
addSql("20180323DXM01", "DROP TABLE IF EXISTS alarm_record_file;");
addSql("20180323DXM02", "CREATE TABLE alarm_record_file(fileossid VARCHAR,alarm_id VARCHAR,"
+ "file_type Long, channel Long, create_time TIMESTAMP, PRIMARY KEY(fileossid,alarm_id));");
}
private void mergeScripts() {
jdbcTemplate.query("select id, sql from Public.sqlScriptLog",
(rs, row) -> {
String id = rs.getString("id");
String sql = rs.getString("sql");
if (sqlMap.containsKey(id) && !sqlMap.get(id).equals(sql)) {
throw new RuntimeException("Sql script changed id:" + id);
}
sqlList.remove(id);
return null;
});
}
private void addSql(String id, String sql) {
if (sqlList.contains(id)) {
throw new RuntimeException("duplicate sql script");
}
sqlList.add(id);
sqlMap.put(id, sql);
}
private void createTable() {
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS sqlScriptLog("
+ " id VARCHAR PRIMARY KEY, sql VARCHAR)"
+ " WITH \"backups=2\";");
jdbcTemplate.execute("CREATE TABLE IF NOT EXISTS sqlScriptLock("
+ " id VARCHAR PRIMARY KEY, lock LONG)"
+ " WITH \"backups=2\";");
}
private void checkLock() {
Integer nLock = jdbcTemplate.queryForObject("select count(*) from sqlScriptLock",
Integer.class);
if (nLock == 0) {
addLock();
}
Integer myLock = jdbcTemplate.queryForObject("select count(*) from sqlScriptLock "
+ "where id = ? ", new Object[]{lock}, Integer.class);
if (myLock == 0) {
log.info("SqlScriptManagement waiting for lock ...");
try {
Thread.sleep(10000L);
} catch (Exception e) {
}
checkLock();
}
}
private void addLock() {
log.info("SqlScriptManagement get lock ...");
jdbcTemplate.update("insert into sqlScriptLock (id, lock) values (?, ?)",
new Object[]{lock, 1});
}
private void removeLock() {
log.info("SqlScriptManagement remove lock ...");
jdbcTemplate.update("delete from sqlScriptLock "
+ "where id = ?", new Object[]{lock});
}
private void runSql() {
Collections.sort(sqlList);
log.info("SqlScriptManagement run scripts:" + DomainUtils.bean2json(sqlList));
sqlList.forEach(id -> {
log.info("Running sql script id:" + id);
jdbcTemplate.execute(sqlMap.get(id));
jdbcTemplate.update("insert into sqlScriptLog(id, sql) VALUES (?,?)",
ps -> {
ps.setString(1, id);
ps.setString(2, sqlMap.get(id));
});
});
}
@Bean
@DependsOn("igniteConfig")
public boolean updateSql() throws InterruptedException {
createTable();
loadScripts();
checkLock();
try {
mergeScripts();
runSql();
} catch (Exception e) {
throw e;
} finally {
removeLock();
}
return true;
}
}
发送自 Windows 10 版邮件<https://go.microsoft.com/fwlink/?LinkId=550986>应用
________________________________
发件人: vkulichenko <va...@gmail.com>
发送时间: Monday, March 26, 2018 9:23:13 AM
收件人: user@ignite.apache.org
主题: Re: Liquibase with Ignite?
Never heard of anyone doing this, but I don't see why it wouldn't work. Did
you have any issues while working with this combination?
-Val
--
Sent from: http://apache-ignite-users.70518.x6.nabble.com/