2016-07-13 26 views
0

Ich führe H2 im Auto-Server-Modus aus, so dass mehrere Prozesse darauf zugreifen können. Aber ich kann org.h2.tools.Script nicht über die Befehlszeile ausführen, wenn TOMEE es bereits verwendet. Wenn ich TOMEE herunterfahre, funktioniert org.h2.tools.Script einwandfrei. HierKann org.h2.tools.Script über die Befehlszeile im AUTOSERVER-Modus nicht ausführen

ist die commnad I
java -cp h2-1.4.188.jar org.h2.tools.Script -url ‚jdbc bin mit: h2: ~/test; FILE_LOCK = FILE; AUTO_SERVER = TRUE '-user sa -password sa -script test.sql

Ausnahme ich, wenn ich den Befehl, wenn Tomcat bis

Exception in thread "main" org.h2.jdbc.JdbcSQLException: IO Exception: "java.io.FileNotFoundException: /var/lib/test.sql (Permission denied)"; SQL statement: 
SCRIPT TO '/var/lib/test.sql' [90028-188] 
     at org.h2.message.DbException.getJdbcSQLException(DbException.java:345) 
     at org.h2.message.DbException.get(DbException.java:168) 
     at org.h2.message.DbException.convertIOException(DbException.java:328) 
     at org.h2.command.dml.ScriptBase.openOutput(ScriptBase.java:146) 
     at org.h2.command.dml.ScriptCommand.query(ScriptCommand.java:159) 
     at org.h2.command.CommandContainer.query(CommandContainer.java:90) 
     at org.h2.command.Command.executeQuery(Command.java:197) 
     at org.h2.server.TcpServerThread.process(TcpServerThread.java:320) 
     at org.h2.server.TcpServerThread.run(TcpServerThread.java:159) 
     at java.lang.Thread.run(Thread.java:745) 
Caused by: java.io.FileNotFoundException: /var/lib/test.sql (Permission denied) 
     at java.io.FileOutputStream.open0(Native Method) 
     at java.io.FileOutputStream.open(FileOutputStream.java:270) 
     at java.io.FileOutputStream.<init>(FileOutputStream.java:213) 
     at java.io.FileOutputStream.<init>(FileOutputStream.java:101) 
     at org.h2.store.fs.FilePathDisk.newOutputStream(FilePathDisk.java:290) 
     at org.h2.store.fs.FileUtils.newOutputStream(FileUtils.java:233) 
     at org.h2.command.dml.ScriptBase.openOutput(ScriptBase.java:144) 
     ... 6 more 

     at org.h2.engine.SessionRemote.done(SessionRemote.java:624) 
     at org.h2.command.CommandRemote.executeQuery(CommandRemote.java:158) 
     at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:179) 
     at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:158) 
     at org.h2.tools.Script.process(Script.java:141) 
     at org.h2.tools.Script.process(Script.java:120) 
     at org.h2.tools.Script.runTool(Script.java:101) 
     at org.h2.tools.Script.main(Script.java:46) 

ich bin nicht sicher, warum ich FileNotFoundException sehen. Denken Sie daran, das geht weg, wenn TOMEE nicht läuft.

Irgendwelche Ideen? Ich bin in einem Docker-Container. Ich habe sichergestellt, dass die URL zwischen TOMEE und Script übereinstimmt.

Antwort

0

Ich habe herausgefunden, warum das passiert. Der TOMEE-Prozess wird als Testbenutzer ausgeführt, während der Script-Befehl als root ausgeführt wird. Da TOMEE zuerst auf die H2 DB zugreift, sollte der Benutzer 'test' die Berechtigung zum Schreiben in/var/lib/haben. Der Ordner/var/lib verfügt jedoch über Berechtigungen für root-Benutzer, sodass der Testbenutzer nicht darauf schreiben kann.