As some of you may have read, I've just finished creating a module called DBD::SQLite, which you can now find on CPAN. This is a DBD driver that is a self contained local RDBMS, so you install it and you don't have to install any server (like MySQL or Postgres), it just works. It's a lot like DBD::CSV or DBD::Sprite. In fact it's almost identical to DBD::Sprite except it's fast. The docs for DBD::Sprite say that it's only good for a few records. Well today I've been testing DBD::SQLite with 100_000 records, and it was still fast - results were coming back before I could blink. I'm going to update my tests to 1 million records, but it'll take a while.
But then Barrie Slaymaker asked me when and why you would use DBD::SQLite, and I honestly couldn't answer him. If you want a toy database for demos, DBD::CSV is fine and great for knocking apps together with. If you want to go into production with something, then you'll probably be happy with MySQL, and not be happy with SQLite, since it's completely typeless (it treats all columns as strings of variable length regardless). The only real argument for SQLite is that it's fast and easy to manage. In that sense it gives you all the advantages of DBD::Sprite (well, most of them), and none of the downside.
But what I really want to know is if you monks out there would use it, so that I can update the docs to reflect if/when/why you would use it. So please, let me know. Thanks!
Re (tilly) 1: Would you use SQLite?
by tilly (Archbishop) on Feb 21, 2002 at 22:06 UTC
|
Why wouldn't I use it?
My use would be a good place to cache data on a local filesystem. Say you have your database server, and several local machines. Suppose that you have a lot of read-only queries where the backing data does not change often.
Well then, why not cache some of the often hit stuff per webserver and not even bother the database unless you need to? The typing issue is unimportant since all of the data is actually managed elsewhere. Since the entire thing (drivers and all) is in one self-contained module, that makes installation even more convenient than MySQL.
UPDATE
After looking at the documentation for the database, read-only cached data looks like pretty much the only thing I would use it for. The locking is incredibly coarse-grained. However there are cases when it is convenient to have an easily-installed read-only data store. | [reply] |
|
In the same vein, I'd like to see some benchmarks with SQLite vs Cache::Cache, DBM, etc for readonly caches. Since the write lock is global, reading would seem to be it's biggest benefit. If it's faster than Cache::Cache, then you have a potential user in me. :-)
As for what I would use it for, I'd probably use it in a project like the one I'm finishing up right now. It is a simple order app with 5 screens. Currently the data is stored in CSV files & read using Text::CSV. And I'm using hidden form elements to maintain state between screens. In this case, it's not worth it to use a "real" database. And I'm not even sure they have access to one. But DBD::SQLite might be just the ticket for this instance. As long as it's simple to compile/install.
| [reply] |
Re: Would you use SQLite?
by Corion (Patriarch) on Feb 21, 2002 at 21:11 UTC
|
I'm not sure whether I'd use SQlite, as I use databases mainly for two purposes :
- Data storage - of course, with the amounts of my stored data, I could most likely keep the whole stuff in memory and wouldn't need a "real" database for it.
- Process coordination/serialization - most "real" databases have internal protection against multiprocess issues, so I can offload the burden of maintaining a locked list to a database. I can easily set up producer/consumer relationships via a database table without having to worry about locking and stability; I can even upgrade a consumer or a producer on the fly without the other half noticing.
For the data storage part, the SQL syntax helps much here, as it makes searching easier to comprehend unless you want to do fancy (re/grep) searching. SQlite would help with the expandability/portability of the solution, as I could go from a flat file to a "real" database anytime.
I guess that, to use SQlite as a scheduler/coordinating entity, I would have to start a "SQlite SQL server" (you heard it first on http://www.perlmonks.org), which opens sockets, and have some "special" DBD driver for my other processes to connect to the central server to cope with forked childs. This is not necessarily bad, as there is no other administration overhead with this SQL server, but on the other side, such a SQL server could be written independant of the underlying storage structure; it would be possible to have a server over DBD::CSV as well.
These are my raw thoughts, if I come up with more points, I'll add them to this node ...
perl -MHTTP::Daemon -MHTTP::Response -MLWP::Simple -e ' ; # The
$d = new HTTP::Daemon and fork and getprint $d->url and exit;#spider
($c = $d->accept())->get_request(); $c->send_response( new #in the
HTTP::Response(200,$_,$_,qq(Just another Perl hacker\n))); ' # web
| [reply] [d/l] |
|
| [reply] |
Re: Would you use SQLite?
by mirod (Canon) on Feb 21, 2002 at 23:06 UTC
|
| [reply] |
Re: Would you use SQLite?
by maverick (Curate) on Feb 21, 2002 at 22:16 UTC
|
How about self contained demos? Put a copy of perl on the cd, have the autorun.inf fire up a little perl webserver and use DBD::SQLite as the database engine for your demo sites.
/\/\averick
perl -l -e "eval pack('h*','072796e6470272f2c5f2c5166756279636b672');"
| [reply] |
Re: Would you use SQLite?
by simon.proctor (Vicar) on Feb 22, 2002 at 00:25 UTC
|
Well I had a think and my answer would be yes, I would use this module provided it was stable (;P). Seriously though, I think this module would become more useful the more you use it (if you see what I mean).
Some immediate ideas I had (not necessarily good ones) are:
- Alternative to htaccess under apache (with mod_perl of course)
- Provide a tie interface and use it to store logs
- Those cases where you have no RDBMS on your host.
- Learning tool for teaching simple SQL (TK Gui etc)
- Caching (mentioned above but I liked it)
However, I'll probably download it, play with it and then use it for something totally different.
Just a thought :)
Simon
| [reply] |
Re: Would you use SQLite?
by trs80 (Priest) on Feb 21, 2002 at 22:46 UTC
|
I am really surprised at how far you have followed this
Matts, your original post to the dbi-dev included:
"Anyway, this is my first hack at a DBD driver, so it's likely buggy,
leaky, etc. But seems to work for the simple selects I've run on it so
far. I've done no optimization, no performance tests, or anything. I
literally hacked this together today for fun. And I'm not particularly
looking to maintain it unless there's really strong interest in it, and
even then I'd rather someone offered to take it over."
I had assumed (falsely) that it was more of a programming
exercise. Now it seems (here I go assuming again) that you
are very interested in how this module is regarded by the
community.
My opinions on this?
- The DBIx and DBD namespace is polluted right now. The number
of choices is almost overwhelming for new comers.
- I like using MySQL as a database and it is convient for
*me* to do that.
- I am interested in DBD::SQLite, but I haven't
taken the time to play with it. So maybe I am not
interested enough.
- I would be more interested if a clear benefit in
using it over the other currently available solutions was
presented.
- I don't consider speed enough of a benefit.
- Issues like number of users, remote access, support, etc. would contribute to my use of the module.
- Since you indicate(d) you are not interested in maintaining
I am not likely to invest time into until someone does
take over maintaining it.
In short I am looking for a compelling reason to
*use* DBD::SQLite.
| [reply] |
Re: Would you use SQLite?
by zengargoyle (Deacon) on Feb 22, 2002 at 02:00 UTC
|
Maybe. It actually sounds like a good fit for my current major undertaking.
I'm writing a server that
listens to Cisco Netflow data, does some real-time statistics (the flows are saved for heavy-duty processing), looks for interesting developments and notifies somebody if needed. The coolest part is the client which connects to the sever over SSL, and allows you to query the current store of data. This sounds like a job for SQLite!!! The data doesn't need to be kept
for long, speed is needed to keep up with the flows, the intended audience has a better grasp of SQL than
perl (the current client part of the server is a eval $_ while(<>) type of loop), and it's read-only to boot.
Sounds like a winner to me.
| [reply] [d/l] |
Re: Would you use SQLite?
by gav^ (Curate) on Feb 22, 2002 at 01:42 UTC
|
| [reply] |
|
| [reply] |
Re: Would you use SQLite?
by dash2 (Hermit) on Feb 22, 2002 at 17:43 UTC
|
As a software developer providing commercial tools for customers on a wide variety of platforms, I think there is a crying need for a simple way to store information without relying on a particular database being installed. Many of our customers are small players with shared hosting. Some will have mysql, but we can't afford the maintenance/debugging/support costs of multiple versions. If DBD::SQLite is reliable enough, and has no security issues, I would definitely be interested!
dave hj~ | [reply] |
Re: Would you use SQLite?
by scottstef (Curate) on Feb 22, 2002 at 14:27 UTC
|
Just a thought- wouldn't this possibly be a quickie CGI tool/solution for people that use shared hosting?
Having a quick, small database, that could be installed as a non-root user kinda makes sense.
"The social dynamics of the net are a direct consequence of the fact that nobody has yet developed a Remote Strangulation Protocol." -- Larry
Wall | [reply] |
Re: Would you use SQLite?
by SwellJoe (Scribe) on Mar 04, 2002 at 17:27 UTC
|
Hi Matt,
tilly referred me to SQLite in a couple of threads I've posted (Performance quandary and Berkeley DB performance, profiling, and degradation...) regarding a BerkeleyDB based program I'm developing...
So, in the spirit of desparately trying stuff until something works so that I can stop working on this darned program once and for all, I've just converted it from using BerkeleyDB to DBI::SQLite, and it seems to be working great. So the answer to your question is, "Yep. I would use SQLite." It seems to be working quite nicely, except for one quirk that I think is likely due to my ignorance of the DBI (more on that in a moment). The test database is about a quarter million sub-4k objects, with the real database topping 2 million--I haven't run it on the big database but on the test db it works great! The old BerkeleyDB version was roughly equal or a little faster in the case of a few thousand objects, but performance declined rapidly due to some pathological handling code in my program (which using a relational db allows me to eliminate completely).
Anyway, it seems like an ideal solution for me, as I have to provide a simple to use set of RPMs for my programs and SQLite is a lot easier to package up and use than MySQL or PostGreSQL. I'll be spending the next few hours on converting the support tools and testing with my small db before rolling it out to a client site for more serious work (don't worry, I can keep an eye on things and deal with any bugs that pop up--I know it's early code). Anything I ought to be watching for? In a couple of posts, here and at use.perl, I think you've mentioned suspected memory leaks--still suspicious?
Now to my problem...I have the following line:
$dbh->do("INSERT INTO objects (md5, url) VALUES ('$md5', '$key')");
Which produces the following error:
DBD::SQLite::db do failed: near "'http://www.gnome.org/images/banner-c
+ontribute": syntax error at ./logtaild.pl line 113, <OBJECT> line 1.
But only on a few (very few) entries into the db. I got about 50 errors like this during the full 250,000 object insertion run. The md5 field is a CHAR(32) while the url field is a VARCHAR(8192)...Am I doing something wrong here? I don't quite know what to make of the extra "'" in the entries that lead to an error--there is nothing particularly different about these few entries that I can see. Searching the Monastary and Google doesn't bring me any enlightenment, so it doesn't seem to be a DBI general issue, but I may have missed it.
Anyway, thanks for the SQLite DBD--it's very cool, and worked right out of the box. One issue, it doesn't seem that the NDEBUG option is disabled in the module build...the SQLite author pretty strongly recommends doing so, at least when performance matters. | [reply] [d/l] [select] |
|
Is this possibly because there are single quotes in the $key value? So your SQL may in fact look like this (minus the formatting :-)
INSERT INTO objects (md5, url)
VALUES (
'$md5',
''http://www.gnome.org/images/banner-contribute'
-- ^ note the extra single quote!!!
)
If so, it would be a good case to use those ever handy DBI placholders
$dbh->do("INSERT INTO objects (md5, url) VALUES (?,?)"
undef,
$md5, $key);
HTH
broquaint | [reply] [d/l] [select] |
|
| [reply] |
|
|
| [reply] |
|
Re: Would you use SQLite?
by dragonchild (Archbishop) on Oct 16, 2003 at 15:24 UTC
|
I have a real production reason to use DBD::SQLite - storing page hits for a large CGI application. One application I used to work on had a MySQL front-end database (used for session info and page-hit stuff) and an Oracle back-end database for actual data. There was a table that recorded every hit this application received. That table took over 45 seconds to return any sort of useful information. (It was extremely useful in debugging issues that occurred when users did stupid things.)
Now, one thing I would've loved to have would be the information stored per week or per month, but making the table structure necessary would've been ... annoying ... to say the least. But, a simple module overlay on DBD::SQLite would've helped immensely. Just have a dbfile for each week and ATTACH it as necessary. From what I can see, it would've easily handled the session information, as well. (Though, again, we could've used a separate file for each session and ATTACHed as necessary ... ? I think this would've been better because there were four front-end servers in a round-robin setup ...)
------
We are the carpenters and bricklayers of the Information Age.
The idea is a little like C++ templates, except not quite so brain-meltingly complicated. -- TheDamian, Exegesis 6
... strings and arrays will suffice. As they are easily available as native data types in any sane language, ... - blokhead, speaking on evolutionary algorithms
Please remember that I'm crufty and crochety. All opinions are purely mine and all code is untested, unless otherwise specified.
| [reply] |
Re: Would you use SQLite?
by tomhukins (Curate) on Feb 26, 2002 at 12:48 UTC
|
My laptop only has 128M of memory, so I'd consider running a lightweight database like DBD::SQLite instead of something like MySQL or PostgreSQL to reduce memory requirements. | [reply] |
|
FWIW, I don't think the amount of memory you have would preclude you from running either PostgreSQL or MySQL. I have a fairly old laptop P150/80MB and it runs mod_perl, PostgreSQL, X and a browser pretty well. Not great, but certainly sufficient for coffee-shop development and demo purposes.
Chris
M-x auto-bs-mode
| [reply] |
|
|