2017-12-05 14 views
0

그래서, 메모리에서 MySQL DB를 hsqldb로 마이그레이션하려고합니다. 이 대칭을 사용하고 있습니다. 나는 다음과 같은 특성을 가진 MySQL의 연결 서비스로 symmetricds을 시작했습니다 :in-memory hsqldb와 symmetricds

engine.name=corp-000 
db.driver=com.mysql.jdbc.Driver 
db.url=jdbc:mysql://localhost/corp?tinyInt1isBit=false 
db.user=root 
db.password= 
registration.url= 
sync.url=http://localhost:31415/sync/corp-000 
group.id=corp 
external.id=000 
job.purge.period.time.ms=7200000 
job.routing.period.time.ms=5000 
job.push.period.time.ms=10000 
job.pull.period.time.ms=10000 
initial.load.create.first=true 
auto.registration=true 
auto.reload=true 

를 작성하고 필요한 데이터와 모든 SYM 테이블을로드.

다음으로 ClientSymmetricEngine을 사용하여 java를 통해 clientnode를 만들었습니다.

public ClientNode(File file) throws FileNotFoundException, IOException { 
    propFile = file; 
    Properties propertiesFile = new Properties(); 
    propertiesFile.load(new FileReader(propFile)); 
    cEngine = new ClientSymmetricEngine(propertiesFile, true); 
    //getcEngine().openRegistration("store", "001");// client is the name of the node group and 001 is the ID 
    getcEngine().setup(); 
    getcEngine().start(); 
    }  
public ClientSymmetricEngine getcEngine() { 
    return cEngine; 
} 

이것은 clientNode 속성 파일입니다 : 이것은 내 자바 코드

: 다음

engine.name=store-001 
db.driver=org.hsqldb.jdbcDriver 
db.url=jdbc:hsqldb:mem:store001 
db.user=sa 
db.password= 
registration.url=http://localhost:31415/sync/corp-000 
group.id=store 
external.id=001 
job.routing.period.time.ms=5000 
job.push.period.time.ms=10000 
job.pull.period.time.ms=10000 

는 동일한 JVM에서 실행중인 복제 된 테이블에서 데이터를 clientNode을 시작 및 가져 오기 내 코드입니다

public static void main(String[] args) {  
    try {    
    new ClientNode(new File("C:/Train/src/main/resources/store-001.properties")); 
    Thread.currentThread(); 
    Thread.sleep(40000); 
    Class.forName("org.hsqldb.jdbcDriver"); 
    con = DriverManager.getConnection("jdbc:hsqldb:mem:store001;create=false", "sa", ""); 
    System.out.println("Connection created successfully"); 
    stmt = con.createStatement();  
    rs = stmt.executeQuery("SELECT item_id, name FROM item"); 
    while (rs.next()) { 
     System.out.println(rs.getInt("item_id") + " | " + rs.getString("name")); 
    }    
    } catch (Exception e) { 
    e.printStackTrace(System.out); 
    } 
} 

enter image description here

내가 main()을 실행할 때, 나는 symmetricds가 mysql에서 hsql 로의 복제를하는지 보았다. 하지만 hsql에서 동일한 데이터를 가져 오려고하면 표 객체가 예외를 찾을 수 없습니다.

java.sql.SQLException: user lacks privilege or object not found: ITEM 
at org.hsqldb.jdbc.JDBCUtil.sqlException(Unknown Source) 
at org.hsqldb.jdbc.JDBCStatement.fetchResult(Unknown Source) 
at org.hsqldb.jdbc.JDBCStatement.executeQuery(Unknown Source) 
at hsqlDB.FetchData.<init>(FetchData.java:24) 
at hsqlDB.ConnectDatabase.main(ConnectDatabase.java:15) 

전체 스택 추적 첨부.

누군가 내가 여기서 잘못하고있는 것을 말할 수 있다면 감사하겠습니다.

+0

@Boris을 : u는 내 질문에 보면 다시이 파일을 기반 HSQLDB를 내가 메모리 HSQLDB를 사용하고 있음을 통지하지 않습니다. 그리고 예 내 URL과 구문이 모두 정확합니다. 이것이 일어날 수있는 다른 이유가 있습니까? 보고 나서 알려주세요. – Edward

답변

1

테이블을 만드는 데 사용하는 문을 보면 테이블 이름과 열 이름이 따옴표로 묶여 대소 문자를 구분합니다. 같은 케이스를 사용하도록 SQL 쿼리를 변경하고 다음과 같이 인용 :

rs = stmt.executeQuery("SELECT \"item_id\", \"name\" FROM \"item\"");