Kotchasan Framework Documentation

Kotchasan Framework Documentation

ConnectionManager Class

TH 05 Feb 2026 06:23

ConnectionManager Class

ภาพรวม

คลาส Kotchasan\Connection\ConnectionManager เป็นคลาสสำหรับจัดการการเชื่อมต่อฐานข้อมูลหลายๆ ตัว รองรับการตั้งค่าหลายฐานข้อมูล การจัดการไดรเวอร์ การแคชคิวรี และการจัดการตารางแบบกลาง

การติดตั้งและการตั้งค่า

ความต้องการ

  • PHP 7.4 หรือสูงกว่า
  • Kotchasan Framework
  • ไดรเวอร์ PDO สำหรับฐานข้อมูลที่ต้องการใช้

การสร้าง ConnectionManager

use Kotchasan\Connection\ConnectionManager;

$config = [
    'default' => [
        'driver' => 'mysql',
        'host' => 'localhost',
        'database' => 'myapp',
        'username' => 'user',
        'password' => 'password',
        'charset' => 'utf8mb4',
        'prefix' => 'app_'
    ]
];

$manager = new ConnectionManager($config);

การตั้งค่าฐานข้อมูล

การตั้งค่า MySQL

$config = [
    'mysql_main' => [
        'driver' => 'mysql',
        'host' => 'localhost',
        'port' => 3306,
        'database' => 'main_db',
        'username' => 'mysql_user',
        'password' => 'mysql_pass',
        'charset' => 'utf8mb4',
        'prefix' => 'main_',
        'unix_socket' => null, // ใช้เมื่อต้องการเชื่อมต่อผ่าน Unix socket
        'tables' => [
            'user' => 'users',
            'category' => 'categories'
        ]
    ]
];

การตั้งค่า PostgreSQL

$config = [
    'pgsql_main' => [
        'driver' => 'pgsql',
        'host' => 'localhost',
        'port' => 5432,
        'database' => 'main_db',
        'username' => 'pgsql_user',
        'password' => 'pgsql_pass',
        'schema' => 'public',
        'application_name' => 'MyApp',
        'sslmode' => 'prefer',
        'prefix' => 'main_',
        'tables' => [
            'user' => 'users',
            'post' => 'posts'
        ]
    ]
];

การตั้งค่า SQL Server

$config = [
    'mssql_main' => [
        'driver' => 'sqlsrv',
        'host' => 'localhost',
        'port' => 1433,
        'database' => 'main_db',
        'username' => 'sa',
        'password' => 'mssql_pass',
        'charset' => 'utf8',
        'appname' => 'MyApp',
        'timeout' => 30,
        'encrypt' => true,
        'trust_server_certificate' => true,
        'prefix' => 'main_'
    ]
];

การตั้งค่า SQLite

$config = [
    'sqlite_main' => [
        'driver' => 'sqlite',
        'database' => '/path/to/database.sqlite',
        'prefix' => 'main_'
    ]
];

การใช้งานพื้นฐาน

การดึง Connection

try {
    $connection = $manager->getConnection('mysql_main');

    if ($connection->isConnected()) {
        echo "เชื่อมต่อสำเร็จ";
    }
} catch (\Exception $e) {
    echo "เชื่อมต่อไม่สำเร็จ: " . $e->getMessage();
}

การปิด Connection

// ปิด Connection เฉพาะ
$manager->closeConnection('mysql_main');

// ปิด Connection ทั้งหมด
$manager->closeAllConnections();

การจัดการหลายฐานข้อมูล

การตั้งค่าหลายฐานข้อมูล

$config = [
    'main_db' => [
        'driver' => 'mysql',
        'host' => 'localhost',
        'database' => 'main_database',
        'username' => 'main_user',
        'password' => 'main_pass',
        'prefix' => 'main_'
    ],
    'analytics_db' => [
        'driver' => 'pgsql',
        'host' => 'analytics.example.com',
        'database' => 'analytics',
        'username' => 'analytics_user',
        'password' => 'analytics_pass',
        'prefix' => 'analytics_'
    ],
    'cache_db' => [
        'driver' => 'sqlite',
        'database' => '/tmp/cache.sqlite'
    ]
];

$manager = new ConnectionManager($config);

การใช้งานหลายฐานข้อมูล

// ใช้ฐานข้อมูลหลัก
$mainConnection = $manager->getConnection('main_db');

// ใช้ฐานข้อมูล Analytics
$analyticsConnection = $manager->getConnection('analytics_db');

// ใช้ฐานข้อมูล Cache
$cacheConnection = $manager->getConnection('cache_db');

การจัดการไดรเวอร์

การลงทะเบียนไดรเวอร์ใหม่

use MyApp\Kotchasan\Database\CustomDriver;

// ลงทะเบียนไดรเวอร์ใหม่
$manager->registerDriver('custom', CustomDriver::class);

// ใช้ไดรเวอร์ใหม่ในการตั้งค่า
$config = [
    'custom_db' => [
        'driver' => 'custom',
        'host' => 'custom.example.com',
        'database' => 'custom_db'
    ]
];

การจัดการ Logger

การตั้งค่า Logger

use Kotchasan\Logger\FileLogger;

$logger = new FileLogger('/var/log/database');
$manager->setLogger($logger);

// Logger จะถูกใช้กับ Connection ทั้งหมด
$connection = $manager->getConnection('main_db');

การดึง Logger

$currentLogger = $manager->getLogger();

if ($currentLogger !== null) {
    echo "Logger พร้อมใช้งาน";
}

การจัดการ Cache

การตั้งค่า Cache ด้วย Configuration

$cacheConfig = [
    'driver' => 'file',
    'path' => '/var/cache/queries'
];

$queryCache = $manager->configureCache($cacheConfig, 3600); // TTL 1 ชั่วโมง;

การตั้งค่า Cache โดยตรง

use Kotchasan\Cache\FileCache;

$cache = new FileCache('/var/cache/queries');
$queryCache = $manager->setCache($cache, 1800); // TTL 30 นาที;

การดึง Query Cache

$queryCache = $manager->getQueryCache();

if ($queryCache !== null) {
    echo "Query Cache พร้อมใช้งาน";
}

การจัดการตาราง

การตั้งค่าตารางแบบกลาง

$config = [
    'main_db' => [
        'driver' => 'mysql',
        'host' => 'localhost',
        'database' => 'main_db',
        'username' => 'user',
        'password' => 'pass',
        'prefix' => 'app_'
    ],
    'tables' => [
        'user' => 'users',
        'category' => 'categories',
        'post' => 'posts',
        'comment' => 'comments'
    ]
];

$manager = new ConnectionManager($config);

การดึงการตั้งค่าตาราง

$tableConfig = $manager->getTableConfiguration('main_db');

if ($tableConfig !== null) {
    $prefix = $tableConfig->getPrefix(); // 'app_'
    $tables = $tableConfig->getTables(); // ['user' => 'users', ...]
}

ตัวอย่างการใช้งานขั้นสูง

การตั้งค่าแบบครบครัน

use Kotchasan\Connection\ConnectionManager;
use Kotchasan\Logger\FileLogger;
use Kotchasan\Cache\FileCache;

// การตั้งค่าฐานข้อมูลหลายตัว
$config = [
    'main' => [
        'driver' => 'mysql',
        'host' => 'localhost',
        'database' => 'main_app',
        'username' => 'main_user',
        'password' => 'main_pass',
        'charset' => 'utf8mb4',
        'prefix' => 'main_'
    ],
    'analytics' => [
        'driver' => 'pgsql',
        'host' => 'analytics.server.com',
        'database' => 'analytics_db',
        'username' => 'analytics_user',
        'password' => 'analytics_pass',
        'schema' => 'public',
        'prefix' => 'analytics_'
    ],
    'cache' => [
        'driver' => 'sqlite',
        'database' => '/tmp/app_cache.sqlite'
    ],
    'tables' => [
        'user' => 'users',
        'category' => 'categories',
        'post' => 'posts',
        'log' => 'logs'
    ]
];

// สร้าง ConnectionManager
$logger = new FileLogger('/var/log/app');
$manager = new ConnectionManager($config, $logger);

// ตั้งค่า Cache
$cache = new FileCache('/var/cache/app');
$manager->setCache($cache, 3600);

// ใช้งาน Connection ต่างๆ
try {
    $mainDb = $manager->getConnection('main');
    $analyticsDb = $manager->getConnection('analytics');
    $cacheDb = $manager->getConnection('cache');

    echo "เชื่อมต่อฐานข้อมูลทั้งหมดสำเร็จ";

} catch (\Exception $e) {
    echo "เกิดข้อผิดพลาด: " . $e->getMessage();
}

การจัดการ Connection Pool

class Kotchasan\DatabasePool
{
    private ConnectionManager $manager;
    private array $activeConnections = [];

    public function __construct(array $config)
    {
        $this->manager = new ConnectionManager($config);
    }

    public function getConnection(string $name): Connection
    {
        if (!isset($this->activeConnections[$name])) {
            $this->activeConnections[$name] = $this->manager->getConnection($name);
        }

        return $this->activeConnections[$name];
    }

    public function closeAll(): void
    {
        $this->manager->closeAllConnections();
        $this->activeConnections = [];
    }
}

การจัดการข้อผิดพลาด

ข้อยกเว้นที่อาจเกิดขึ้น

use Kotchasan\Exception\ConfigurationException;
use Kotchasan\Exception\DatabaseException;

try {
    $connection = $manager->getConnection('nonexistent');
} catch (ConfigurationException $e) {
    echo "ข้อผิดพลาดการตั้งค่า: " . $e->getMessage();
} catch (DatabaseException $e) {
    echo "ข้อผิดพลาดฐานข้อมูล: " . $e->getMessage();
}

การตรวจสอบการตั้งค่า

// ตรวจสอบว่ามีการตั้งค่าหรือไม่
$config = [
    'main' => [
        'driver' => 'mysql',
        // ขาดการตั้งค่า host, database, etc.
    ]
];

try {
    $manager = new ConnectionManager($config);
    $connection = $manager->getConnection('main');
} catch (ConfigurationException $e) {
    echo "การตั้งค่าไม่ครบถ้วน: " . $e->getMessage();
}

คำแนะนำและข้อควรระวัง

แนวทางปฏิบัติที่ดี

  1. ใช้ Logger: ตั้งค่า Logger เพื่อติดตามปัญหา
  2. จัดการ Connection Pool: ใช้ Connection ซ้ำเพื่อประหยัดทรัพยากร
  3. ตั้งค่า Cache: ใช้ Query Cache เพื่อเพิ่มประสิทธิภาพ
  4. ปิด Connection: ปิด Connection เมื่อไม่ใช้งาน

ข้อควรระวัง

  1. ข้อมูลรับรอง: เก็บข้อมูลรับรองในไฟล์การตั้งค่าที่ปลอดภัย
  2. การจัดการหน่วยความจำ: Connection ใช้หน่วยความจำ ควรปิดเมื่อไม่ใช้
  3. การตั้งค่าไดรเวอร์: ตรวจสอบว่าไดรเวอร์ที่ต้องการมีอยู่จริง

ปัญหาที่พบบ่อย

  1. ไดรเวอร์ไม่รองรับ: ตรวจสอบว่าติดตั้ง PDO extension แล้ว
  2. การตั้งค่าผิด: ตรวจสอบการตั้งค่าฐานข้อมูลให้ถูกต้อง
  3. Connection Timeout: ตั้งค่า timeout ให้เหมาะสม

คลาสที่เกี่ยวข้อง

  • Connection - คลาสการเชื่อมต่อพื้นฐาน
  • DriverInterface - อินเทอร์เฟซไดรเวอร์
  • Database - การจัดการตาราง
  • QueryCache - การแคชคิวรี