Best way to access a sqlite database file in a web service - java

First question from me on stack overflow.
I have created a java web application containing a web service using netbeans (I hope a web application were the correct choice). I use the web application as is with no extra frameworks. This web service use a sqlite JDBC driver for accessing a sqlite database file.
My problem is that the file path end up incorrect when I try to form the JDBC connection string. Also, the working directory is different when deploying and when running JUnit tests. I read somewhere about including the file as a resource, but examples of this were nowhere to be seen.
In any case, what is the best way to open the sqlite database, both when the web service is deployed and when I test it "locally"?
I don't know much about web services, I just need it to work, so please, help me with the technicalities.
Update
To put this a litle bit in context, some "println" code gives this:
Printing the work directory from a simple JUnit test gives
C:\MinaFiler\Work\SOA\BusTimetableWS
Invoking a similar web servic method returns
C:\Program Files\sges-v3\glassfish\domains\domain1
The connection string is formed from prepending "jdbc:sqlite:" to the path which at the moment is absolute:
C:\MinaFiler\Work\SOA\BusTimetableWS\src\java\miun\bustimetable\database\sqlit\BusTimetableWS.db
However, this fails because my tests throws exceptions stating database tables doesn't exist although they really do, I can see them with sqlite3.exe .

One way would be to use a config file that you can read and fetch your connection string from there.
I'm sure the framework you are using has some kind of standard way of saving configurations.
Another option would be to place the db in a known relative path from your main execution files. Then when executed fetch your current directory, and look for the db from that path.

In any case, what is the best way to open the sqlite database, both when the web service is deployed and when I test it "locally"?
The web service should use a DataSource to retrieve a connection from a connection pool configured at the application server level. In your unit test, use whatever you want (a standalone connection pool, a direct JDBC connection).
But in both cases, why don't you use an absolute path to the database file in your jdbc url? From How to Specify Database Files:
jdbc:sqlite:C:/work/mydatabase.db
The working directory wouldn't matter if you do so.

Related

Get JDBC connection working in play framework (java)

Was wondering, what steps am I missing to get a jdbc embeded h2 database working in my play application? Following these docs.
So far editted Application.conf file to contain this:
db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:databases/test"
db.default.user=test
db.default.password="testtest"
Next I created a libs directory and added the jar file
h2-1.3.174.jar
Is this necessary or does the provided driver handle all types of h2 databases (embeded and server - I know it handles in memory)?
Now in the controler how can I access the database? Do I have to start/shutdown the database?
I know I can get connections from the getConnection() method in play.db. But everytime I execute a statement through this connection I get an exception saying no data is available. If I then check - looks like directory
databases/test
was not created so no database files exist.
What am I missing?
H2 works out of the box. Just create a new project in the terminal.
Otherwise, to your listing:
I think you should change db.default.url="jdbc:h2:databases/test" to db.default.url="jdbc:h2:mem:play"
don't need to create lib directories. It's all handeled by the build in dependency mgmt sbt
Just use the model objects and call save/update. No need to call start/shutdown
you are in a framework, it's all there ready for you...
I think you should start reading the documentation from the beginning to the end and examine the example applications. It's all there what you are looking for.
In addition to myborobudur's answer I'll only mention, that you don't need to use memory database, as you can for an instance use file storage (Embedded) or even run H2 as a server and then connect to it with TCP in Server Mode... Everything is clearly described in H2 documentation.

How run java web strat application with hsql and glassfish?

I have java program with main function, that packaged into jar archive. There is dao class with DataSource. An jdbc url to data file is expected an is passed as argument to main function. Everything works as standalone application, but how I must link jar file with database when they both in glassfish? For example, I put jnlp into glassfish docroot directory, and put HSQL database file with populated data too. Whta link I must pass tho that database? If I simple replace
"C:\path"
with
"http://localhost:8080\path_inside_docroot_folder"
I get EOFException in java when it tryies to read a file.
Off topic:
Also it very strange, when I created hsql database I write something like this:
jdbc:hsqldb:C:\\path\db_file.dat
But actually in the path there is no exactly db_file.dat. There are several files, like:
db_sile.dat.tmp
db_sile.dat.lck
db_sile.dat.log
db_sile.dat.properties
db_sile.dat.scrip
Can anyone solve my problem? May files mentioned upper influence to the problem or it is pure glassfish deploy problem?
If something unclear ask me.
The answer is you can not run HSQL inside as static resource glassfish. You can run HSQL server as HTTP server or as servlet if you deploy web application. The solution for my problem is to put JNDI file and java jar file as static resources in glassfish and run HSQL server in the same computer (where glassfish is running).

JDBC and Sql Server 2008 Connectivity

I am accessing an SQL server 2008 Database through JDBC4.0. the problem is I can access my DB just when my glassfish server is restarted, it run the code normally but once, if i make any changes into the code i have to restart the glassfish server otherwise it generate the following error.
WARNING: Failed to load the sqljdbc_auth.dll cause : Native Library C:\Windows\System32\sqljdbc_auth.dll already loaded in another classloader
Kindly guide me what should i do to solve this problem i am using Eclipse editor. and my code is
String url = "jdbc:sqlserver://localhost;databaseName=ProductDB; integratedSecurity=true;";
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver").newInstance();
con = DriverManager.getConnection(url);
System.out.println("Connected");
If you have a data source correctly defined in GlassFish you should be able to simply re-deploy your application in order to see changes to .java files (you can even use hot deploy although my experience with that has been less than great). XML files shouldn't even need a redeploy.
Update: I see from your edit you are loading the driver etc manually. I suggest you let GlassFish manage the data source and use resource injection to acquire a connection.
Edit: Re-reading your question properly... you don't need the sqljdbc_quth.dll library if you are using sql authentication but it will speeds up authentication with the sql server. I tried it out with one of our products but it didn't make any noticeable difference so I've not bothered since.
If you do any changes in xml or .java file definitely you have to restart.
If you use re loadable resource-bundle to read properties file its ok.
Updated :
Just go to Project in top bar than check "Build Automatically". It will stop auto building the project and saves your precious time.

Can tomcat store variables/properties that get called from a war

I want to be able to deploy my app using ANT to Tomcat.
I don't want the process to be any different for dev and prod. However the two use different databases i.e. myapp and myapp-dev
How can I make this happen? Can I store a variable in the different tomcat containers and make the application call the name of the database from Tomcat.
Or if what I am asking is ridiculous what is the generally accepted way to achieve deploying to dev and prod with the same process.
The generic way is to put the configuration string in a JNDI entry.
If JNDI is not a possible solution, then a property file in the right location (so it shows up in the classpath of the WAR files) is also useful, but needs careful documentation.
Have you considered letting the web container manage the database connection pool, so you only need a single one pr container, which then can be retrieved through JNDI?

Spring MVC Web App with Default user

I am developing a web app using Spring MVC and Hibernate that I hope to package up as a WAR file and distribute for users to deploy where needed.
The application will require the database connection details before deploying, can anyone advise on the best practice of how to do this? currently my database.properties file is packaged as part of the WAR file, is there an easier way than asking the user to manually edit this file inside the WAR file or in the source and then expect them to build the war file themselves?
I would also like an easy way for users to create a single admin user on first deploy easily - is it best to just provide a sql script to create that or is there a way to include the functionality in the web app so on first deploy it creates the user?
Thanks
Since web applications are not focused to "mass production", I can't tell if something like that is possible.
You can make an SQL script containing all your CREATE statements limited by "IF NOT EXISTS" to avoid deleting existing data. Hibernate can execute a sql script at the moment of creating the SessionFactory, if Hibernate finds a file named "import.sql" located in the classpath root, Hibernate will execute it. Also you can always edit the database.properties of an application already deployed without re-packaging the WAR.
Try Liquibase, http://www.liquibase.org/ . It does not allow your users to setup database connection details but it allows you to manage the database schema (create and update the schema) and default data.

Categories

Resources