#oracle #codeigniter #datatables #odbc
#Oracle #codeigniter #таблицы данных #odbc
Вопрос:
Я создал таблицу данных в codeigniter, и она уже работает с небольшим объемом данных, но я хочу запустить проект с 1 миллионом строк данных. К сожалению, он не работает с таким огромным объемом данных.
Что я должен добавить / изменить в своем коде ниже? Я использую codeigniter, базу данных oracle и драйвер odbc
Спасибо!
//JavaScript
<script>
$('#user-list').DataTable({
"processing": true,
dom: 'Bfrtip',
buttons: [
'excel'
],
"ajax": {
url : "<?php echo base_url(); ?>Reports/get_User,
type : 'GET'
},
"aoColumns": [
{ "data": "ID" },
{ "data": "FirstName" },
{ "data": "LastName" },
{ "data": "Address"},
{ "data": "Email" },
]
});
</script>
//html
<table id="user-list" class="table table-bordered table-striped table-hover">
<thead>
<tr>
<th>ID</th>
<th>First name</th>
<th>Last name</th>
<th>Address</th>
<th>Email</th>
</tr>
</thead>
</table>
//controller
public function get_User()
{
$draw = intval($this->input->get("draw"));
$start = intval($this->input->get("start"));
$length = intval($this->input->get("length"));
$query =$this->db->query("SELECT * FROM users");
$data = [];
foreach($query->result() as $r) {
$data[] = array(
$r-ID
$r-FirstName,
$r-LastName,
$r-Address,
$r-Email,
$r_tab[] = $r
);
}
$result = array(
"draw" => $draw,
"recordsTotal" => $query->num_rows(),
"recordsFiltered" => $query->num_rows(),
"data" => $data,
"data" => $r_tab
);
echo json_encode($result);
exit();
}
Комментарии:
1. Что вы подразумеваете под «это не работает»? Вы получаете явную ошибку / время ожидания вашего запроса / другой тип сбоя?
2. Время ожидания запроса истекло.
3. вы должны использовать ajax для получения определенного объема данных вместо всех строк. таблица данных обычно скрывает другие строки и отображает 10 страниц. но браузер не выдерживает давления огромных данных
Ответ №1:
Вы разбиваете свой собственный сервер, пытаясь загрузить в память огромное количество данных.
Проверьте этот пример обработки данных на стороне сервера (5 000 000 строк) — к сожалению, в этом примере не используется реальное подключение к базе данных для извлечения данных, но он по-прежнему информативен.
По сути, вам нужно изменить свой AJAX-запрос, чтобы включить offset
и limit
, значения, которые необходимо добавить в ваш запрос, чтобы извлекать из базы данных только данные, которые будут отображаться, а не всю таблицу.
Попробуйте это:
- Измените свой вызов AJAX, чтобы он выглядел следующим образом:
scrollY: 200,
"ajax": function ( data, callback, settings ) {
url : "<?php echo base_url(); ?>Reports/get_User/" data.start "/" data.length,
type : 'GET'
},
- Измените свой контроллер следующим образом (возможно, вам также потребуется настроить свои маршруты):
// Be sure to validate that $offset and $limit are valid numeric values (integer, positive, limit does not exceed a certain value, etc)
public function get_User($offset, $limit)
{
$limit = (int) $limit;
$offset = (int) $offset;
...
// Not sure about the "LIMIT" syntax for Oracle, please look it up
$query =$this->db->query("SELECT * FROM users LIMIT $offset, $limit");
...
Примечание: эти фрагменты кода не идеальны (я раньше не работал с DataTable), но они должны помочь вам встать на правильный путь.
Комментарии:
1. Что касается синтаксиса ограничения строк, Oracle 12c представила
OFFSET
/FETCH
like :SELECT last_name FROM employees ORDER BY last_name OFFSET :offset ROWS FETCH NEXT :maxnumrows ROWS ONLY
. Используйте переменные привязки (как показано) для повышения производительности и безопасности. Более ранние версии Oracle см.ROWNUM
на стр. 181 «Ограничение строк и создание постраничных наборов данных» бесплатного руководства Oracle по подпольному PHP и Oracle .