Relative path to SQLite DB in context.xml

做~自己de王妃 提交于 2019-12-05 15:48:44

I have found following examples of using JDBC with SQLite:

  • For memory access:

     jdbc:sqlite::memory:
    
  • For relative paths:

     jdbc:sqlite:relative/path.db
    
  • For absolute paths:

     jdbc:sqlite:/absolute/path.db
    

As a different approach: did you try to use jdbc:sqlite:~/myapp.db ? This should be a writable location on the computers of everyone running that application. (Although I've seen the evil that are read-only home directories.)

I'm not exactly sure if SQLite supports ~ in the database URL. I know H2 does, and I can nothing but recommend it as an embedded Java DB. If you don't want to change databases, you might want to see if Tomcat allows some parameter substitution in its configuration files, like ${user.home}. (Some preliminary Googling gives me mailing list results that seem to imply that's be case in at least server.xml, so it could be worth just trying it.)

I'm still not exactly sure what you're trying to achieve though: are you the one running the Tomcat instance, or is it a shared tomcat instance running under some system account?

You could also try to set up another world-writable location on the network to put the database in. Somewhere under /var/ maybe, or just a folder that's set to ug=rwx in one person's home directory.

titaniumdecoy

I am still looking for a way to use a relative path to the database in the context.xml file.

However, I figured out how to get extract the path to the database from the context.xml file. It's not pretty, but it works. I couldn't figure out how to parse the context.xml file as XML so this ugly hack looks for a line beginning with "url=".

URL url = getServletContext().getResource("/META-INF/context.xml");
Properties props = new Properties();
props.load(url.openStream());
String strval = props.getProperty("url");
Pattern pattern = Pattern.compile("\\\W*\"(.\*)\"\\\W*");
Matcher matcher = pattern.matcher(strval);
matcher.find();
String constr = matcher.group(1);
if (constr != null)
    this.jdbcConnectionString = constr;

I had the same issue with Spring and jdbc.properties I fix that by removing // and write the relative path

Try this

<?xml version="1.0" encoding="UTF-8"?>
<Context path="/mywebapp">
    <Resource name="jdbc/mydb" auth="Container" type="javax.sql.DataSource"
        maxActive="100" maxIdle="30" maxWait="10000"
        username="myusername" password="mypassword" driverClassName="org.sqlite.JDBC"
        url="jdbc:sqlite:web/my.db"/>
</Context>
titaniumdecoy

I found the answer to my question here. The solution is to get the resource rather than try to parse the database URL out of the context.xml file.

This answer is already given by honzas. I am reiterating it to make it more clear (b/c I also didn't understand it at first).

jdbc:sqlite:relative/path.db

That is correct for a relative path. Notice the lack of a / before relative. That makes the path absolute. You can also use this:

jdbc:sqlite:./relative/path.db

The . refers to the current folder.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!