in reply to Re: [DBIx::Class] Can I extract $dbhandle from schema?
in thread [DBIx::Class] Can I extract $dbhandle from schema?

Great! 10x! It's working! DBIx creates connection at every query? Or it uses sheared dbhandle? May be you read it before me )
  • Comment on Re^2: [DBIx::Class] Can I extract $dbhandle from schema?

Replies are listed 'Best First'.
Re^3: [DBIx::Class] Can I extract $dbhandle from schema?
by CountZero (Bishop) on Aug 21, 2007 at 14:29 UTC
    DBIx::Class re-uses existing connections. It checks if connections are still open: if so they are re-used otherwise it reconnects.

    Please note DBIx::Class is not sharing connections: every my $schema = My::DB->connect('dbi:mysql:DB', 'user', 'secret_password'); will remain separate from every other connection, but every query within an individual $schema will re-use the same connection as long as it is still open. Connections only get closed when the script finishes or when explicitly closed ($schema->disconnect;) or when timed-out server-side.

    CountZero

    A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

      Wow, threads can come around after a long rest. :P

      I was having a little trouble comparing two databases with a single DBIC schema today for exactly the reason you cite: cached connection. I figured I'd post the way around that particular hobgoblin. This might be considered a bug… New connection_info should reset the connection, I think.

      my @configuration_db_one = ...; my @configuration_db_two = ...; my $schema_one = MyDBIC::Schema->connect( @configuration_db_one ); my $schema_two = MyDBIC::Schema->connect( @configuration_db_two ); # ^^^ Wrong, connection from $schema_one is reused despite new config. my $schema_one = MyDBIC::Schema->connect( @configuration_db_one ); $schema_one->storage->disconnect; my $schema_two = MyDBIC::Schema->connect( @configuration_db_two ); # ^^^ Right, $schema_one will reconnect with its own info when used.
      Sorry, thought I was logged in. This applies to the post above. I also tried using Apache::DBI and it didn't seem to work and I have since read this is not recommended either. Is that not a good solution?
        It is normal that you see your connections to be sleeping. Most queries take only a very short while to run and you will have to click the refresh button at exactly the right moment to see your connection being active.

        Don't use Apache::DBI together with DBIx::Class, they don't play well together. Both use a different philosophy which are not really compatible.

        The beauty of DBIx::Class is that it manages, caches and re-uses your DB-connections all by itself so you don't have to worry about them. Just connect to your DB at the beginning of your script and forget all about it. If you start extracting the databasehandle and use that or connect and disconnect repeatedly, you are on your own and will miss a lot of the benefits of DBIx::Class.

        I use this module a lot in a mod-perl environment and never worry about such low-level things as managing the DB-connection or --Gods forbid!-- directly using the database-handle.

        CountZero

        A program should be light and agile, its subroutines connected like a string of pearls. The spirit and intent of the program should be retained throughout. There should be neither too little or too much, neither needless loops nor useless variables, neither lack of structure nor overwhelming rigidity." - The Tao of Programming, 4.1 - Geoffrey James

      I am using DBIx::Class and when I look at the processlist (mysql) all the connections are in state of sleep. I am using mod_perl so the scripts should be staying alive. Is it recommended to call disconnect each time or to try and re-use the existing connection?