How to load multiple sqlite driver versions on a single java server? - java

The Problem
Hi, I'm trying to implement sqlite in a server plugin, but I'd like to use a different version than is provided with the server - is this possible?
I've set up sqlite in my project, and it works perfectly for most data types, however because of the server's sqlite version, I'm unable to write binary arrays to my database. The server ships with 3.7.2, however this version doesn't support Statement#setBinaryStream, so I'd like to use 3.8.11.2 in my project.
I'm unable to change the server's sqlite version, and it is unlikely that this version will be changed any time soon, so my solution was to try and include a different sqlite version in my project jar, and use that. I'm a big fan of sqlite, so if possible, I'd like to be able to use it.
What I've Tried
I have tried the following:
Use the maven shade plugin to include the sqlite-jdbc library with my project, relocating org.sqlite to me.Fupery.shaded.sqlite
Register my relocated driver with the java.sql.DriverManager singleton:
Driver driver = ((Driver) Class.forName("me.Fupery.shaded.sqlite.JDBC").newInstance());
DriverManager.registerDriver(driver);
Get the connection as usual
Connection connection = DriverManager.getConnection("jdbc:sqlite:" + dbFileURL);
But no luck! The lib is correctly included in my jar, and the code to register the driver (above) runs without exceptions, however when I try to write a byte stream, it throws an AbstractMethodError as usual (indicating it's using the old version, not the one I loaded).
Is there a way to specify which driver to use when getting a connection? I looked through the DriverManager and Driver methods but couldn't find anything I could use.
Alternative Methods
Alternatively, is there another method I can use to write a blob to a database in the server's provided sqlite version (3.7.2)? I tried Statement#setBytes before Statement#setBinaryStream, but I didn't have any luck - no exceptions are thrown, but the column I set the byte to is empty.
A test I wrote here returns without errors, but when I check the database afterwards, the "test" column is empty every time (other data types work fine):
$ SELECT * FROM test_table;
test1|
test2|
test3|

I've decided to use the Statement#setBytes method to write to a blob instead in 3.7.2, now that I've been able to get this to work correctly. It's is a simpler and tidier solution, and works just as well.

Related

How to allow other people to use desktop application that relies on database?

So I've created a java desktop application using Swing. It stores data entered into the application in a MySQL database (localhost). Now how would someone else be able to use the application ? Would they require a MySQL database as well ? What are the best practices for doing this. I do eventually hope to submit the entire project folder to github.
I guess I would have to ask first whether this program is a demo or classroom project or if it's a real application, because the answer would be different.
For a demo project, it would be fine to post your code to github, and also dump the database to a .sql file and commit that as well. MySQL ships with a handy tool called mysqldump that will do just that - export the entire contents of your database. Then a person can clone your github repo, install MySQL locally, and run your sql script to get a copy of your database. Once they follow those steps, they should be able to run a copy of your swing app on their machine just like you can. One caveat here though is it's best practice to avoid putting very large files (especially binary files) in git. I'm not sure what you need, but if you can put a small sql file out there that's definitely preferred.
That's a segue into the other answer which is hosting your MySQL database somewhere. For a real application, making copies just won't do. Then what you need to do is host your database centrally using a service like this one and allow your users to connect to it. You can still use mysqldump to get your database out there on the web after creating it on localhost. If you go this route though, you'll definitely want to avoid putting your database connection strings on github. Again, this scenario is really only useful if your app is intended to be used for real - don't bother with hosting if you don't need it.
Hope this helps!
Firstly, you should install mysql with a public ip, then alter the connection to mysql with the ip,the example follows below
String url = "jdbc:mysql://ip:3306/db";
Connection conn = DriverManager.getConnection(url, user, password);
if you want to run java program like exe file, package the java program to a jar file with jre

Access Visual FoxPro database from Java

I've been trying to access a Visual Fox Pro database from Java for a week now. I'm getting desperate because my project is in a very tied budget and timeframe. (As any other project, I guess, hahaha)
I have a .dbf, a .cdx and a .fpt files. I need to be able to look for a record, extract data, and update data. I don't have a VFP licence.
I hope someone has some pointers or a working example that I can use. If the only way is buying a driver I'll be willing to consider it based on suggestions received.
This is a short description of what I have tried.
I found this xBaseJ: java objects to read and write to dBase files. But it doesn't suport CDX index files.
Also found this Example to access a dbf. But my tests show this exception: java.sql.SQLException: [Microsoft][Controlador ODBC dBase] La tabla externa no tiene el formato esperado.
I guess a translation to english of this error could be something like: java.sql.SQLException: [Microsoft][ODBC dBase Driver] External table is not in the expected format
Because of that error I think I need a newer driver. In this microsoft page say they no longer have an ODBC driver, and everybody should use OLE DB Provider. The problem is I haven't found a way to use it from java.
As far as I can tell, there is no way to do it directly. Found here someone talking about a JACOB "thingy", and someone comments about the need to create a C++ or C# "something" to be able to do what I need. I think he is talking about The JACOB Project: A JAva-COM Bridge. But I also don't know what COM calls would actually have to make.
Haven't been able to find a suitable JDBC driver.
Thank you all.
Ely.
I found the way to do it.
I ended up using JACOB (from here <= upd 2021-10-25: now here).
Downloaded and installed Visual FoxPro OLE DB driver from http://msdn.microsoft.com/en-US/vfoxpro/bb190232 (upd 2021-10-25: links there do not work anymore). the direct link is: Microsoft OLE DB Provider for Visual FoxPro 9.0 SP2 (upd 2021-10-25: does not work anymore)
Downloaded JACOB version 1.17 binary and source code.
Added jacob.jar as a Java Build Path library
Copied jacob-1.17-x86.dll to the project directory (same place as eclipse's .project file)
Copied jacob-1.17_src\jacob-1.17\samples\com\jacob\samples\ado contents to my src directory and:
Removed the ms directory
renamed test.java to Main.java
Changed the connection string to:
String connectStr = "Provider=vfpoledb;Data Source=C:\\path\\to\\Data\\;Collating Sequence=general;";
Changed the queryStr to match one of the dbf's name
Hope this helps someone else.
Since the jacob approach did not work anymore as described and others seemed to work without the OLE DB bridge, I cancelled trying there and successfully did it via hxtt.com drivers:
register with some email and the mailed link contains some password to get to the drivers page
there one can download the proper driver, e.g. v42 till Java 8 or v43 since Java 9
use the following JDBC settings in your env (e.g. Eclipse Database Explorer) to access your DBF files (e.g. you have some C:\foo\bar.dbf):
driver jar: e.g. DBF_JDBC42_tillJava8.jar
driver class: com.hxtt.sql.dbf.DBFDriver
URL: jdbc:dbf:/c:/foo/
(if required by your tool with dummy values:)
database: db
user/pass: usr / <empty pass>
You may find interesting to use a jdbc driver for foxpro files.
I made some quick tests with this one, and it almost looks like you are using a real database in Java.
Regards,

Derby database encoding

I found that Derby database is installed with the jdk automatically. I wanted to use bu I encountered a problem for which I could not find the solution in google.
I have a russian version of windows. Derby seems to be installed correctly, but when i start the database itself or sysinfo - it gives me out some info but in some unknown symbols - actually its a mess in cyrillic symbols instead of plain english. When i try to create a database - it throws an exception so I cant connect, but I cant read the message because of the mess in the symbols.
Has anyone had the same problem?
If I dont find the solution, how can I uninstall Derby from the jdk-release and install it locally into another directory?
You can install derby separately by going to http://db.apache.org/derby and downloading the JAR files and adding it to your project class path. I always do this instead of using the default derby that comes with the JDK.
by the way, if you do this and still get those weird symbols, your problem might be elsewhere. Hope you solve this, derby is a cool embedded db :)
You can also use derby as a filesystem DB. Download from here Then in your code, you need to change driver name and connection string accordingly.
For in memory
driver=org.apache.derby.jdbc.EmbeddedDriver
url=jdbc:derby:memory:myDB;create=true
For fileSystem ,
driver=org.apache.derby.jdbc.ClientDriver
url=jdbc:derby://localhost:1527/schema_name;create=true

How to create installer once finished with Java Desktop Application with MySQL DB?

I have finished writing a Java Desktop application with a mySQL database. I want to make the application run outside netbeans and let it be installed on other computers. I know about building the project and creating the runnable jar file, however this requires me to export the database itself to the other computer I want the application to run on.
My question is two parts:
1)Is there a way I can create a setup file that also installs the database and the application together?
2)Also my database path is hard coded, does that mean I have to change the code every time I install my application for someone, what is the better way to do that?
Thanks
Yes. You can use some setup builder, like InnoSetup, for example. Personally, however, I like giving my customers a zip file, which they extract wherever they like. The executable jar should be able to handle everything by itself (I like it where there is no need to install the software, just unpack and run).
If it is hardcoded, then yes (but, what do you mean by hardcoded? path to file? ip address?). You should use properties or configuration files for paths and other external things your software depends on. The software should read from those files. Upon startup check for presence of such file(s) - if missing, the user should be shown a window in which the config can be entered.
As for deploying MySQL with your code - consider using a server for that, so that your users are not forced to install MySQL, instead they connect to it over the net. If you need the database only for storing data locally, why not using SQLite or a similar, file-based db engine?
The above answers are just suggestions and more-less reflect the way I am thinking. I would be happy to hear from someone with more experience. Nonetheless, I hope the answers help a little :)
I agree with Sorrow.
If I have to use MySQL, it is normally over the net since I don't want to allow my clients pass through the hazzles of installing MySQL themselves. If however you am stuck with using MySQL locally, investigate MySQL unattended installations + NSIS Installer.
If you can use any db you want, I just use javadb/derby. It comes bundled with most Java installations these days and if not all you need is to add a jar file to you application.
As per 'hardcoding' paths, I really don't understand what you mean. You really don't have 'paths' as it were, I am assuming what you mean is connection string. You don't have to hardcode your connection string, just put some parameters in a properties file and construct your connection string from them.
1) Is there a way I can create a setup file that also installs the database and the application together?
See my answer to Java based Standalone application.
2) Also my database path is hard coded, does that mean I have to change the code every time I install my application for someone, what is the better way to do that?
Have the DB installer pop a JFileChooser to ask the user where they want to install the DB. Store that path using the JNLP API PersistenceService. Here is my demo. of the PersistenceService.

Microsoft ODBC error after building Java program

I made a little Java application which writes stuff to an Access database.
When I run it in Eclipse, it works just fine, but when i build it using Maven and run it, it fails.
As soon as I try to access the database it gives me the following error:
[Microsoft][ODBC Manager] Data source
name not found and no default driver
specified
I know this is a common error but there are so many vague solutions out there I'm too confused to get it fixed.
I have no User DSN's or System DSN's whatsoever, I also don't have a running SQL server as far as I know.
I have no clue as to what to do next.
Wondering if this could be a bitness issue (assuming the machine is 64bit)?
I suspect that this is more about which Java Runtime Environment) is being used to execute the built application rather than what is used to actually build it...
Microsoft only has a 32bit ODBC driver for Access - so, unless the Java application is being run in a 32bit JRE then I suspect there will be no way it can interface with the 32bit native C portion of the Bridge that, in turn, will load the 32bit ODBC Driver.
Just a thought...
You probably use connect string with relative .mdb filename. You can use full filename:
jdbc:odbc:Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\\Nwind.mdb

Categories