Я работал над небольшим проектом, который включает синхронизацию двух баз данных с использованием симметричных ds.Одна из моих баз данных - mysql, а другая - h2.Я хочу, чтобы моя программа обновляла базу данных h2 нажатием кнопки.Однако функция обновления генерирует ошибку, похожую на:
org.h2.jdbc.JdbcSQLException: Error creating or initializing trigger
"SYM_ON_I_FOR_DBTRGGR_CRS_LCL" object, class "org.jumpmind.symmetric.db.h2.H2Trigger", cause: "org.h2.message.DbException: Class ""org.jumpmind.symmetric.db.h2.H2Trigger"" not found [90086-176]"; see root cause for details; SQL statement:
INSERT INTO passenger VALUES(1, 'Person1', 20, 'City1', 'City2', 1); [90043-176]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
at org.h2.message.DbException.get(DbException.java:167)
at org.h2.schema.TriggerObject.load(TriggerObject.java:77)
at org.h2.schema.TriggerObject.fireRow(TriggerObject.java:167)
at org.h2.table.Table.fireRow(Table.java:935)
at org.h2.table.Table.fireAfterRow(Table.java:925)
at org.h2.command.dml.Insert.insertRows(Insert.java:162)
at org.h2.command.dml.Insert.update(Insert.java:115)
at org.h2.command.CommandContainer.update(CommandContainer.java:79)
at org.h2.command.Command.executeUpdate(Command.java:254)
at
org.h2.jdbc.JdbcStatement.executeUpdateInternal(JdbcStatement.java:132)
at org.h2.jdbc.JdbcStatement.executeUpdate(JdbcStatement.java:117)
at h2Connector.UpdateLocalDB(dataBaseManager.java:105)
at h2Connector.<init>(dataBaseManager.java:34)
at dataBaseManager.main(dataBaseManager.java:8)
Caused by: org.h2.message.DbException: Class "org.jumpmind.symmetric.db.h2.H2Trigger" not found [90086-176]
at org.h2.message.DbException.get(DbException.java:167)
at org.h2.util.Utils.loadUserClass(Utils.java:672)
at org.h2.schema.TriggerObject.load(TriggerObject.java:70)
... 12 more
Caused by: org.h2.jdbc.JdbcSQLException: Class "org.jumpmind.symmetric.db.h2.H2Trigger" not found [90086-176]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:344)
... 15 more
Caused by: java.lang.ClassNotFoundException: org.jumpmind.symmetric.db.h2.H2Trigger
at java.net.URLClassLoader.findClass(URLClassLoader.java:382)
at java.lang.ClassLoader.loadClass(ClassLoader.java:424)
at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:349)
at java.lang.ClassLoader.loadClass(ClassLoader.java:357)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at org.h2.util.Utils.loadUserClass(Utils.java:665)
... 13 more
Я видел похожий пост https://sourceforge.net/p/symmetricds/discussion/739236/thread/8a54e2ec/, в котором говорится, что «Попробуйте это из домашнего каталога SymmetricDS. Для базы данных H2 необходимы библиотеки SymmetricDS длятриггеры Java. "и руководствуясь командой
java -cp web/WEB-INF/lib/*:lib/h2-1.3.176.jar org.h2.tools.Console
Я пытался запустить свой код, используя это, но, к сожалению, не смог понять.
Вот мой файл свойств h2 (локальная сторона):
engine.name=CRIS_Local-01
db.driver=org.h2.Driver
db.url=jdbc:h2:CRISDB;AUTO_SERVER=TRUE;LOCK_TIMEOUT=60000
db.user=sa
db.password=
registration.url=http://localhost:31415/sync/CRIS_Server-00
group.id=CRIS_Local
external.id=01
job.routing.period.time.ms=5000
job.push.period.time.ms=1000
job.pull.period.time.ms=1000
Вот мой файл свойств mysql (на стороне сервера):
engine.name=CRIS_Server-00
db.driver=com.mysql.jdbc.Driver
db.url=jdbc:mysql://localhost/PassDB?tinyInt1isBit=false
db.user=root
db.password=passwd
registration.url=
sync.url=http://localhost:31415/sync/CRIS_Server-00
group.id=CRIS_Server
external.id=00
job.purge.period.time.ms=7200000
job.routing.period.time.ms=5000
job.push.period.time.ms=1000
job.pull.period.time.ms=1000
auto.registration=true
initial.load.create.first=true
Вот мой код Java для установки соединения:
h2Connector(){
stmt = null;
con = null;
try{
Class.forName("org.h2.Driver");
con = DriverManager.getConnection("jdbc:h2:~/Downloads/symmetric-server-3.10.2/tmp/h2/CRISDB;AUTO_SERVER=TRUE;LOCK_TIMEOUT=60000", "sa","");
stmt = con.createStatement();
System.out.println("Connected to h2 Succesfully!");
}catch(Exception e){
e.printStackTrace();
}
Passenger psg = GivePassenger(1,isOccupied);
System.out.println(psg.Name);
UpdateLocalDB(psg);
}
Вот мой UpdateLocalDB(Passenger psg)
public void UpdateLocalDB(Passenger psg){
String query = "";
query = "INSERT INTO passenger VALUES(";
query += Integer.toString(psg.PNRNo) + ", ";
query += "'"+psg.Name+"', ";
query += Integer.toString(psg.age)+", ";
query += "'"+psg.start+"', ";
query += "'"+psg.end+"', ";
query += Integer.toString(psg.seat) + ");";
System.out.println(query);
try{
stmt.executeUpdate(query);
System.out.println("Updated Succesfully!");
}
catch(Exception e){
e.printStackTrace();
}
}
Часть Query работает нормально PS: я новичок в SymmetricDS