On 4/30/2012 5:55 PM, markspace wrote:
I'm making a small website as a personal project using only the JDBC
interface. (No ORM, etc.) Well, I did the CRUD for exactly one bean and
found it pretty tedious going. So I started looking around for
something
light-weight to help me out. I found the Apache commons dbutils
project:
<
http://commons.apache.org/dbutils/>
And: is there a better, light-weight non-ORM package that you might
recommend instead? Something a bit more complete.
What are you actually gaining by not using a full blown ORM
(JPA, traditional Hibernate etc.)?
Precisely so that you don't have a full-blown ORM with either a native
API or JPA. I'll give you an example: I do integrations with lightweight
ESBs [1], and sometimes I might have to write some simple JDBC in
components and all I want are some Java Beans to represent the ResultSet
rows. Just for packaging. Something like DBUtils could be handy (in fact
I'm delighted that markspace reminded me of this handy API). I
definitely don't want a full-blown JPA ORM in that environment.
Like I said in another post, if you make an argument that a full-blown
ORM is always preferable to a lightweight one, that's practically
tantamount to saying that it never makes sense to use JDBC either.
If we are talking about "single row centric" then I would go for
either the heavy ORM to get functionality or plain JDBC to avoid
dependency (the last argument is more or less a SE only argument).
I would find it difficult to see a good argument for going with
the light ORM.
For "multi row centric" then I would go for plain JDBC as
ORM is not intended for that.
I think I'd analyze it probably the same way. Usually.
However, the situation I am describing here - it's one example, there
are others - is one where I don't want JPA or native ORM units-of-work
or anything barely above raw JDBC. It's simply the case that from time
to time I might want to package a ResultSet row as an object, with zero
special meaning. That's all I'm saying.
It's not like I often have this requirement. 90+ percent of the tiem
it's JPA for me, almost all of the rest is plain JDBC. Using a simple OR
mapper like DBUtils would be very occasional.
I doubt that you will save any code in your app.
Likely not. That's not why you'd pick a rudimentary mapper.
I doubt that the less memory usage will be noticeable.
Likely not. It's not why I'd make a decision.
It is not really a problem that the full blown ORM is hundreds
of thousands of lines of code, because maintenance is not
your responsibility.
It's not, no. But that full-blown ORM with 500,000 lines of code (pretty
close to what EclipseLink 2.2 has in its 'org' package [2]) is going to
have quite a few more defects than an ORM with 5,000 lines of code
(DBUtils has about 8,000 [2]).
That is obvious true, but I don't know if it is relevant.
If we follow the traditional rule of 1 bug per 1000 lines
of code, then we will see:
500 KLOC => 500 bugs
5 KLOC => 5 bugs
But there are two things to remember:
1) The same usage will only use a smaller portion of the large library.
2) This is when delivered first time. Bugs get fixed as they get found.
The more the code is used the faster the bugs get found.
If we compare the 500 KLOC library with the 5 KLOC library then
doing what the small library can do may only use 25 or 50 KLOC of
the large library.
If that is the case and the larger library is used so much more than
the smaller library (and the functionality of the larger library
that can be done by the smaller library is most likely the
functionality most used) that there are 5 or 10 times less bugs
left per size, then there may actually be fewer bugs left.
Is this just number magic? I don't think so!
If you want a stable OS and a stable database would you go for
an exotic product with a small code base or a well known
product with a much larger code base?
The LOC count isn't one that I'd use to make the decision, Arne.
Although I'd certainly read the bug database to find out what could hurt.
You mentioned maintenance, not me, and I know from bitter experience
that ORM problems are *my* problems.
But I'll reiterate that if I went with a small, very rudimentary mapper
that it would be special case and a situation where a full-blown ORM
would be massive overkill.
I would not want to fix it. I would want something where you can report
the bug to someone and let them fix it.
You have no real choice with a large ORM anyway. You report it, and if
you're lucky a few minor versions down the pipe and a few months later
you see a fix.
That is not really level 1 cache.
What do you consider to be a cache? A cache means that you've got your
stuff in a storage area that's faster to access than the original
location. Usually memory. If I get my stuff through JDBC, and access
data afterwards off the ResultSet, that's a cache. If I convert that
ResultSet to a collection of objects, and access data in that collection
afterwards, that's a cache.
Insofar as this level of caching is similar to a persistence context,
which is referred to as Level 1 in JPA, I have no problems thinking of
it as Level 1 equivalent.
If it was just that: no. But there are other features that also could
become useful.
Arne
Hopefully you know what you need early on, considering as how you did
good requirements analysis. In which case you're using JPA because you
already know you need it.
AHS