From: Karl S. <ka...@dm...> - 2001-08-08 22:30:14
|
I've only been toying with Mason for the last couple weeks. I haven't done web development in about a year. At that time, my tool of choice was ASP. I am finding it difficult going from Server.CreateObject("ADODB.Connection") to using DBI. man DBI and man DBD::mysql are both extremely useful for using DBI, but how best to utilize it through mason is a small mistery to me. I think my main problem is that with ASP, there was no such thing as a persitent connection (as a matter of fact, you were supposed to close the connection as soon as possible), and now I'm worried that I'm not tweaking things right. Most (if not all) of the information I have concerning using DBI with Mason comes from 1 question in the FAQ. This leads me to believe one of three things: - Mason or mod perl are not the ideal solution for database driven sites, or - My strong dependency on databases is unique, or finally; - People who write the mason documentation don't realize the dominance of database driven sites. Don't get me wrong, I can open a connection through mason to a database and do eveyrthing I need with it. But database connections, and recordset fetching are by far the number one cause of latency on high-traffic websites, and I want to know all the ways to do it; along with the strength and limitations of each. I think *if* mason is capable of driving heavy database driven sites, far more documentation, examples, and discussion need be made about it. Right now, this is what I have. In handler.pl (outside of "sub handler") { package HTML::Mason::Commands; use vars qw($dbh); use Apache::DBI; } I believe that the above code makes the $dbi variable globally accessibly, and that it imports the Apache::DBI package. next I have in sub handler: my $datasource = "DBI:mysql:database=blah;host=localhost"; my $username = "blah"; my $password = "blah"; my $attr = { RaiseError=>1 ,AutoCommit=>0 }; # Apache::DBI->connect_on_init($datasource, $username, $password, $attr); # Apache::DBI->setPingTimeOut($datasource, 0); $HTML::Mason::Commands::dbh = DBI->connect($datasource, $username, $password, $attr); ok, so the first 4 lines are DBI related. The next 3 lines are where I start getting confused. The 2 commented out lines come from the faq, whereas the bottom line comes from the Admin Manual (on how to create global varibables). AS you can see, I decided to follow the admin manual's suggestion, since it makes sense to me. Am I supposed to be using one or the other? Or are they supposed to be used jointly? If I have the choice, what is the difference, and which do I want. How does Apache::DBI->connect_on_init($datasource, $username, $password, $attr); assign a value to the $dbh global I made? With the code that I have now, i don't have any problems, because I have a nice $dbh variable i every page which I can do anything "man DBI" tells me. but what if I didn't have access to handler.pl ? Would my only alternative be to connect from each component to the database? ala: use Apache::DBI; my $dbh = DBI->connect(...); ... my $dbh->disconnect(); Obviously this costs me a connection each time I hit that component. This is how ASP does it with ADODB, there are no persistent connections (unless ODBC / OLE DB are doing something in the background??) and I never really saw it as being a huge problem. Are database connections more costly using DBI and that's why we want to make them persistent? or is windows just sloppy and offers us no solution. What are the other ways to create database connections? Both persistent and not. I realize I could mix the two, and have { package HTML::Mason::Commands; use vars qw($dbh); use Apache::DBI; } in my handler.pl and then $dbh->connect(...) in each necessary component - though I don't see that saving me much overhead. Hope my concerns make sense. Thanks, Karl |