Kotchasan Framework Documentation
ConnectionManager Class
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();
}คำแนะนำและข้อควรระวัง
แนวทางปฏิบัติที่ดี
- ใช้ Logger: ตั้งค่า Logger เพื่อติดตามปัญหา
- จัดการ Connection Pool: ใช้ Connection ซ้ำเพื่อประหยัดทรัพยากร
- ตั้งค่า Cache: ใช้ Query Cache เพื่อเพิ่มประสิทธิภาพ
- ปิด Connection: ปิด Connection เมื่อไม่ใช้งาน
ข้อควรระวัง
- ข้อมูลรับรอง: เก็บข้อมูลรับรองในไฟล์การตั้งค่าที่ปลอดภัย
- การจัดการหน่วยความจำ: Connection ใช้หน่วยความจำ ควรปิดเมื่อไม่ใช้
- การตั้งค่าไดรเวอร์: ตรวจสอบว่าไดรเวอร์ที่ต้องการมีอยู่จริง
ปัญหาที่พบบ่อย
- ไดรเวอร์ไม่รองรับ: ตรวจสอบว่าติดตั้ง PDO extension แล้ว
- การตั้งค่าผิด: ตรวจสอบการตั้งค่าฐานข้อมูลให้ถูกต้อง
- Connection Timeout: ตั้งค่า timeout ให้เหมาะสม
คลาสที่เกี่ยวข้อง
- Connection - คลาสการเชื่อมต่อพื้นฐาน
- DriverInterface - อินเทอร์เฟซไดรเวอร์
- Database - การจัดการตาราง
- QueryCache - การแคชคิวรี