2015-03-17 2 views
12

Предположим, у пользователя есть две базы данных, размещенные на одном хосте, и мне нужно подключиться к ним обоим, чтобы я мог использовать любую таблицу в любое время без добавления кода подключения несколько раз.Плюсы и минусы подключения нескольких баз данных в одном скрипте

Я реализовал это в CodeIgniter с добавлением данных авторизации обеих баз данных в файле database.php и для загрузки необходимой базы данных с помощью $this->load->database('dbname'); в скрипте.

Теперь для ядра PHP, мы можем сделать это как:

mysql_connect ('host','user','password','port','dbname'); // connection with one database. 

Это было связано с моей первой базы данных.

Теперь я хочу, чтобы соединиться с второй базой данных:

1) Я не закрылся выше связи и соединен с вторым с

mysql_connect ('host','user','password','port','dbname1');. 

2) Будет ли это быть плохой практикой сделать это? Будет ли он потреблять больше объектов? Должны ли мы быть обязательными, чтобы закрыть первый в любом случае?

+0

Пожалуйста, поделитесь тем, что вы уже пробовали. – Mithun

+0

Отредактированный вопрос !! пожалуйста, проверьте – CodeWithCoffee

+5

Sidenote: Пожалуйста, [не используйте 'mysql_ *' функции] (http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php), они больше не поддерживаются и [официально устарели] (https://wiki.php.net/rfc/mysql_deprecation). Узнайте о [подготовленных заявлениях] (http://en.wikipedia.org/wiki/Prepared_statement) и используйте [PDO] (http://us1.php.net/pdo) или [MySQLi] (http: // us1.php.net/mysqli). [Эта статья] (http://php.net/manual/en/mysqlinfo.api.choosing.php) поможет вам решить. – Und3rTow

ответ

12

Не нужно открывать 2 соединения, чтобы использовать таблицы из 2 баз данных на одном сервере. Вам просто нужно использовать ноту database.table. Делая это означает, что вы можете даже присоединиться к таблицам из разных баз данных в одном запросе

SELECT t1.col1, t1.col2, t2.col2, t2.col2 
FROM db1.table1 AS t1 JOIN db2.table1 AS t2 ON t1.col1 = t2.col3 

Так что, если вы подключены к DB1 первоначально вы можете использовать DB2 таблицу и то же, если вы подключены к DB2 вы можете использовать таблицы DB1.

+0

Итак, вы хотите сказать, что в приведенном выше случае, если вы уже подключились к db1, вам не требуется подключаться к db2? И он автоматически получит доступ к таблице db2? – CodeWithCoffee

+1

Да, если вы используете ноту database.table, как показано в моем примере. Конечно, у пользователя должны быть необходимые разрешения для обеих схем. –

+0

@David Soussan. Нет. Вам нужно понять, что для получения дескриптора соединения с базой данных, с которым вы выполняете свои запросы, вы должны указать имя базы данных, используете ли вы расширение mysqli или PDO. Итак, как вы можете использовать db1 и db2 в одном ручке соединения? Вы сказали: «Конечно, у пользователя должны быть необходимые разрешения для обеих схем», может быть, вы должны показать, как это сделать в первую очередь, тогда мы сможем узнать. –

2

1) Возможно ли подключиться к нескольким базам данных в одном скрипте?

Да, мы можем создать несколько идентификаторов ссылок MySQL в одном скрипте.

2) Он должен быть не хотел, чтобы закрыть одно соединение с mysql_close и открыть новый, а как соединение должно открыть в то время, и пользователь может использовать любую таблицу из любой базы данных?

Использование Стойкие соединения с базами данных, как mysql_pconnect

3) Если это возможно, то, что может быть недостатком этого? Будет ли создан два объекта, и это создаст проблему?

Я не думаю, что это создает какие-либо проблемы, кроме увеличения нагрузки на сервер.

+1

НИКОГДА не используйте постоянные соединения КОГДА-ЛИБО. http://stackoverflow.com/questions/3332074/what-are-the-disadvantages-of-using-persistent-connection-in-pdo –

+0

@DavidSoussan Спасибо, что поделились этой ссылкой. Не знал этого. Но я не согласен с вашим заключением, чтобы НИКОГДА НИКОГДА не использовал его. Ссылка предупреждает о предостережениях, но также дает решения. –

+0

Ну, после 30 лет использования SQL и 15 лет с MySQL я могу сказать, что я никогда не видел ситуации, когда настойчивые соединения были ответом. Они просто привлекательны для программистов с плоским файлом. Беспокойство об этом, когда вы сталкиваетесь с настоящим узким местом производительности. Готов поспорить, что, когда вы это сделаете, это не будет накладные расходы на подключение к базе данных, это проблема. –

2

Вы можете использовать как этот

$db1 = mysql_connect($hostname, $username, $password); 
$db2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('abc', $db1); 
mysql_select_db('def', $db2); 

Для базы данных 1

mysql_query('select * from table1', $db1); 

Для базы данных 2

mysql_query('select * from table2', $db2); 
+0

Спасибо за отзыв! Есть ли какие-либо конкретные причины для добавления true для соединения с $ db2? – CodeWithCoffee

+0

Если вы не передадите true для второй базы данных, тогда он будет подключаться только к первой базе данных, поэтому необходимо передать четвертый параметр как истинный для второй базы данных. – Nikul

+0

@Nikul - хотел бы просто исправить вас здесь, где вы сказали, что «это будет устанавливать соединение только для первой базы данных, поэтому необходимо передать четвертый параметр как true для второй базы данных ». Значение, связанное с добавлением истины, заключается в том, чтобы не дать второму соединению переопределить первое сделанное соединение. Если вы не добавите правду, что он будет делать, он перейдет через соединение db1 с db2. –

7

пробовали ли вы это?

$mysqli1 = new mysqli("example.com", "user", "password", "database1"); 

$mysqli2 = new mysqli("example.com", "user", "password", "database2"); 
0

если пользователь MySQL имеют разрешение на две базы данных, вы можете присоединиться к две таблицы из двух базы данных и т.д.:

SELECT database1.table.title title1,database2.table.title title2 
FROM database1.table 
INNER JOIN database2.table 
ON (database1.table.id=database2.table.id) 
+0

Почему downvotes? Хорошо, ответ довольно короткий, но на самом деле он один из лучших здесь. –

2

Q: Какие минусы есть, чтобы соединиться с другой базой данных без закрытия предыдущего база данных?

A: При подключении к серверу базы данных физически назначают ресурсы для взаимодействия с вами, если две баз данных находятся на тот же сервер, вы бы излишни используя ресурсы, которые могут быть использованы для решения других соединений или других видов деятельности. Таким образом, вы будете иметь правильные тесные соединения, которые не нужно продолжать использовать.

Вопрос: Это подходящая практика? Каков наилучший способ сделать это, не открывая это соединение в каждом скрипте несколько раз? Я хочу, чтобы это было сделано в основном php только, как я уже знаю это в codeigniter.

Односторонние СЕЗОНЫ, но вы не можете хранить соединения базы данных в сеансах. Прочитайте в PHP.net это предупреждение: «Некоторые типы данных не могут быть сериализованы таким образом, хранятся в сеансах. Они включают в себя переменные ресурсов или объекты с циклическими ссылками (т. Е. Объекты, которые передают ссылку на себя на другой объект)». Соединения MySQL - один из таких ресурсов.

Необходимо выполнить повторное подключение к каждой странице.

Это не так плохо, как кажется, если вы можете положиться на объединение пулов через mysql_pconnect(). При подключении функция сначала попытается найти (постоянную) ссылку, которая уже открыта с тем же хостом, именем пользователя и паролем. Если он найден, идентификатор для него будет возвращен вместо открытия нового соединения. Соединение с сервером SQL не будет закрыто при завершении выполнения скрипта. Вместо этого ссылка останется открытой для будущего использования (mysql_close() не будет закрывать ссылки, установленные mysql_pconnect()).

Ссылка:

http://php.net/manual/en/function.mysql-pconnect.php

http://www.php.net/manual/en/intro.session.php

Can't pass mysqli connection in session in php

+1

Это на самом деле отвечает на заданный вопрос. – Izion

2

Лучший способ использовать несколько баз данных, чтобы использовать PDO функции

Пример

// database cobfigurations 
$config= array(
    // first database 
    array(
     'type'=>'mysql',     // DB type 
     'host'=>'localhost',    // DB host 
     'dbname'=>'database1',  // DB name 
     'user'=>'root',     // DB username 
     'pass'=>'12345',    // DB password 
    ), 
    // second database 
    array(
     'type'=>'mysql',     // DB type 
     'host'=>'localhost',    // DB host 
     'dbname'=>'database2',  // DB name 
     'user'=>'root',     // DB username 
     'pass'=>'987654',    // DB password 
    ), 
); 
// database connections 
$mysql=array(); 
foreach($config as $con) 
{ 
    $con=(object)$con; 
    $start= new PDO($con->type.':host='.$con->host.';dbname='.$con->dbname.'', $con->user, $con->pass, array(
      // pdo setup 
      PDO::ATTR_PERSISTENT   => FALSE, 
      PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ, 
      PDO::ATTR_ERRMODE    => PDO::ERRMODE_EXCEPTION, 
      PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES UTF8' 
    )); 

    if ($start && !empty($start) && !is_resource($start)) 
     $mysql[]=$start; // connection is OK prepare objects 
    else 
     $mysql[]=false; // connection is NOT OK, return false 
} 

/********************** 
**** HOW TO USE **** 
**********************/ 

// fetch data from database 1 
$data1 = $mysql[0]->query("SELECT id, title, text FROM content1")->fetchAll(); 
if(count($data1)>0) 
{ 
    foreach($data1 as $i=>$result) 
    { 
     echo $result->id.' '.$result->title.' '.$result->text.'<br>' 
    } 
} 

// fetch data from database 2 
$data2 = $mysql[1]->query("SELECT id, title, text FROM content2")->fetchAll(); 
if(count($data2)>0) 
{ 
    foreach($data2 as $i=>$result) 
    { 
     echo $result->id.' '.$result->title.' '.$result->text.'<br>' 
    } 
} 

Если вы до этого не использовать PDO, пожалуйста, прочитайте это краткое руководство:

http://www.mysqltutorial.org/php-querying-data-from-mysql-table/

ли practicly же, как MySQL и Mysqli соединений, но более продвинут, быстро и безопасно.

Читать это Документации: http://php.net/manual/en/book.pdo.php

И вы можете добавить более 2 базы данных

5

Вы можете сделать это, следуя объектно-ориентированный подход

Прежде всего создать соединение с двумя базами данных:

$Db1 = new mysqli('localhost','root','','database1'); // this is object of database 1 
$Db2 = new mysqli('localhost','root','','database2'); // this is object of database 2 

$query1 = 'select * from `table_name_of_database1`'; // Query to be run on DB1 
$query2 = 'select * from `table_name_of_database2`'; // Query to be run on DB2 

$result1 = $Db1->query($query1); // Executing query on database1 by using $Db1 
$result2 = $Db2->query($query2); // Executing query on database2 by using $Db2 

echo "<pre>"; 

/* Print result of $query1 */ 

if ($result1->num_rows > 0) { 
    while($row = $result1->fetch_assoc()) { 
     print_r($row); 
    } 
} else { 
    echo "0 results"; 
} 


/*========================================================*/ 


/* Print result of $query2 */ 

if ($result2->num_rows > 0) { 
    while($row = $result2->fetch_assoc()) { 
     print_r($row); 
    } 
} else { 
    echo "0 results"; 
} 

Вывод: Если вы хотите использовать database1, используйте $Db1 объект, и если вы хотите использовать database2, используйте $DB2.

4

Я не думаю, что одновременное подключение к двум БД - это проблема, поскольку вы успешно это сделали (или знаете, как это сделать). Я могу это понять из вашего вопроса. Поэтому я не буду показывать, как это сделать. Если вам нужно, обратитесь к другим ответам.

Но для решения ваших проблем, непосредственно:

  1. Будет ли плохая практика, чтобы сделать это? Как правило, вам следует избегать двух одновременных ручек подключения к БД. Если вам нужно только получить данные из одной базы данных и использовать их для выполнения чего-то другого, лучше всего поставить данные из DB1 в соответствующие переменные PHP, закрыть соединение; затем выполните второе соединение. Это было бы дешевле, чем одновременное открытие двух соединений DB. Однако, если вы делаете что-то вроде INSERT INTO db1.table SELECT FROM db2.table И ТАКЖЕ НЕОБХОДИМО СОБИРАТЬ ИЛИ ROLLBACK в зависимости от успеха или неудачи некоторых запросов, тогда AFAIK, вы должны поддерживать оба соединения открытыми до тех пор, пока ваши процессы не закончатся. Видите ли, всегда есть компромиссы. Поэтому вы решаете, основываясь на потребности вашего приложения и нести расходы.

В качестве практического примера этого сценария, я когда-то работал над проектом, где мне нужно ВЫБРАТЬ table1, вставить в table2, если INSERT успешно, я удалить все строки из table1, если DELETE не удается , Я откатываю операцию INSERT, потому что данные не могут жить в двух таблицах одновременно.

Конечно, в моем собственном случае задействована только одна БД, поэтому нет необходимости в втором подключении. Но предполагая, что две таблицы были в разных БД, тогда это может быть похоже на вашу ситуацию.

  1. Будет ли он потреблять больше предметов? Никаких других объектов, кроме тех, которые указаны в 1 выше, а именно: соединения DB подключаются в соответствии с вашим вопросом.

  2. Должны ли мы обязательным требовать закрытия первого? Еще раз, в зависимости от ваших потребностей приложения.

3

Вместо mysql_connect использование mysqli_connect.

MySQLi является обеспечить функциональность для подключения несколькими базами данных одновременно.

+1

$ Db1 = новый mysqli ($ hostname, $ username, $ password, $ db_name1); // это соединение 1 для DB 1 – kaushik

+1

$ Db2 = новый mysqli ($ hostname, $ username, $ password, $ db_name2); // это соединение 2 для DB 2 – kaushik

1

Вот простой класс, который автоматически выбирает необходимую базу данных при необходимости.

class Database 
{ 
    private $host = 'host'; 
    private $user = 'root'; 
    private $pass = 'pass'; 
    private $dbname = ''; 

    private $mysqli = null; 

    function __construct() 
    { 
     // dbname is not defined in constructor 
     $this->mysqli = new mysqli($this->host, $this->user, $this->pass);  
    } 

    function __get($dbname) 
    { 
     // if dbname is different, and select_db() is succesfull, save current dbname 
     if ($this->dbname !== $dbname && $this->mysqli->select_db($dbname)) { 
      $this->dbname = $dbname; 
     } 

     // return connection 
     return $this->mysqli; 
    } 
} 


// examples 
$db = new Database(); 

$result = $db->db1->query("SELECT DATABASE()"); 
print_r($result->fetch_row()); 

$result = $db->db2->query("SELECT DATABASE()"); 
print_r($result->fetch_row()); 

$result = $db->{'dbname with spaces'}->query("SELECT DATABASE()"); 
print_r($result->fetch_row()); 
1
$con1 = mysql_connect($hostname, $username, $password); 
$con2 = mysql_connect($hostname, $username, $password, true); 

mysql_select_db('database1', $con1); 
mysql_select_db('database2', $con2); 

Затем для запроса базы данных 1 пройти первый идентификатор ссылки:

mysql_query('select * from tablename', $con1); 

и базы данных 2 передать второй:

mysql_query('select * from tablename', $con2); 
5

Зачем вам два соединения? Преимущества/преимущества двух баз данных в основном являются проблемами производительности. Но если вы на той же машине, на самом деле, единственным преимуществом, которое у вас есть, было бы более чистое разделение. Поэтому было бы лучше использовать одну БД с двумя разными префиксами для таблицы. Итак, вы разделяете данные с помощью префикса, а не DB.

2

Используйте PDO, поддерживаемый php 5, вместо mysql connect

Смежные вопросы