Calling a different java app from within java app-Collection of common programming errors

When dealing with a client/server style application, all the business logic, including the persistence layer, should be maintained on the server side.

That is, the client connects to some server process and makes requests. It should never care about how the data is managed or stored. It just cares about getting and manipulating the data. This also means that you centralise the business associated with that data, which means that should it change, you are less likely to need to change the client.

This also means that all the access information for the database never leaves the domain of the server.

Now the question is, how do you achieve. This answer will come down to exactly what it is you want to achieve an the means by which you want to achieve it, but, I would also add, the client should be authenticating with the server first, meaning that the user must be made to enter and user name and password in order to be able access the data (unless it’s a public accessible API, then you probably don’t care).

You could use

RMI. This would allow you to expose server objects that the client could interact with. This is good if you wish to send objects from the server to the client. It allows the client to interact with Java objects as if they were local objects.

From a coding point of view, this is a (relatively) simple solution, as you are dealing with Java Objects. The problem is though, only Java clients (with the right libraries) will be able to access the server.

You could use

Plain Sockets. This will allow you to connect to a service on the server and communicate with it.

You can even serialize objects between the client and server, allow the application to deal with Java Objects as well.

This is also a much more difficult approach, as you become responsible for dealing with the low level protocol and error handling (which RMI takes care of for you).

This approach does, however, provide you with the opportunity for other clients to connect to your server (so long as you are using just a plain sockets and serializing objects ;)).

This is a lot of work…

You could use

Some kind of web service (Servlet’s under Tomcat for example or event a J2EE server), that would use simple HTTP requests to list of available services/functions that would return either something like JSON or XML response which the client would then need to parse.

This is, by far, the most open and probably the most common solution. It would take some work to get running, but is far less involved then using something like sockets and is also the most flexible, as you wouldn’t need release no libraries each time you want to change or update a service.

Now all these allow you to provide secure connections over the wire, through SSL, you just need to establish the correct connection from the client to the server, so you’ve got an added level of security.

Each hides the database access behind a server layer, adding additional protection to the database.